0
雷锋网 AI 开发者按:近日,GitHub 在全球开发者大会上,宣布启动了一个名为「安全实验室 (Security Lab)」的新社区计划。该计划中,GitHub 不仅开源了代码分析引擎 CodeQL,还设置了奖励金最高为 3000 美元的漏洞奖励计划。
GitHub 安全实验室的任务是启发并赋能全球安全研究社区,保护全球代码的安全;意将进一步解决代码安全难题,完善开源社区不足,为开源社区的优质代码贡献打下良好基础。这一计划也得到了很多大牛企业为代表的支持,包括 Microsoft,Google,Intel 等,现雷锋网 AI 开发者将这一社区具体内容整理编辑如下。
CodeQL 是 GitHub 刚推出的一款新开源工具。这是一款语义代码分析引擎,旨在查找大量代码中同一漏洞的不同版本。
CodeQL 可以帮助我们跨代码库发现漏洞;允许我们像查询数据一样查询代码、编写查询以查找漏洞的所有变体,并将其永久消除;共享该查询结果以帮助其他人消除漏洞。
其中,QL 是查询语言,也是 CodeQL 的基础,专用于分析代码。这是一种逻辑编程语言,因此它由逻辑公式组成。QL 使用公共逻辑连接词(如 and,or,和 not)、量词(如 forall 和 exists)、以及其他重要的逻辑概念。查询语句示例如下(实现将 null 添加到集合):
import java
from MethodAccess call, Method add
where
call.getMethod().overrides*(add) and
add.hasName("add") and
add.getDeclaringType().getSourceDeclaration().hasQualifiedName("java.util", "Collection") and
call.getAnArgument() instanceof NullLiteral
select call
QL 还支持递归和聚合,这允许我们可以使用简单的语法编写复杂的递归查询并直接使用函数库,比如:count,sum 和 average。
因此,使用 CodeQL 编写的查询可以发现漏洞及重要安全漏洞的变体。而除了 GitHub 平台外,CodeQL 也已经应用于其它平台的漏洞代码扫描活动中,如 Mozilla。
更多关于 QL
在线查询
我们可以使用 LGTM 平台(https://lgtm.com/query/rule:1823453799/lang:java/)上的 CodeQL 查询控制台,在流行的开源代码库上直接运行实际查询。
LGTM 平台界面,直接编写需要查询的代码
当了解发现有漏洞的模式后,我们就能在整个代码库中查找出类似的情况。在下面的示例中,我们使用了内置的 CodeQL 库对不安全的反序列化模式进行编码,以进行数据流和污点跟踪。
UnsafeDeserialization.ql
from DataFlow::PathNode source, DataFlow::PathNode sink, UnsafeDeserializationConfig conf
where conf.hasFlowPath(source, sink)
select sink.getNode().(UnsafeDeserializationSink).getMethodAccess(), source, sink,
"Unsafe deserialization of $@.", source.getNode(), "user input"
本地查询
如果需要在本地编写和运行查询,可以通过安装 Visual Studio Code 的 CodeQL 扩展而实现。
在 Visual Studio 中写入和运行查询代码
安装 CodeQL 扩展后,具体操作步骤为:
1. 获取 CodeQL 数据库
在 LGTM.com 上搜索要研究的开源项目,然后导入项目页面;
将所下载的和项目本身的 CodeQL 数据库添加到 VS 代码中,实现对这些指令的使用;
2. 查询代码并查找漏洞
复制 CodeQL starter 工作区并在 VS Code 中打开它;
通过右键单击查询并选择「运行查询」来运行查询;
有关详细信息,请参阅文档:
查询开源代码库
根据 OSI 批准的开源许可证相关规定,我们可以为符合条件的任何项目创建 CodeQL 数据库。
CodeQL 分析依赖于从代码中提取关系数据,并使用它来构建 CodeQL 数据库(https://help.semmle.com/codeql/glossary.html#codeql-database)——该目录包含在代码上运行查询所需的所有数据。
在生成 CodeQL 数据库之前,您需要:
安装并设置 CodeQL CLI。(有关更多信息,参见下面的 CodeQL CLI 入门)
迁出要分析的代码库的版本。该目录应已准备好建立,并已安装所有依赖项。
查询开源代码库示例
但需要注意的是,GitHub CodeQL 只能用于在 OSI 批准的开源许可下发布的代码库,或者用于执行学术研究。它不能用于自动化分析、持续集成或持续交付,无论是作为正常软件工程过程的一部分还是其他。
CodeQL 扩展详细文档:
https://help.semmle.com/codeql/codeql-for-vscode.html
本地查询下载地址:
https://marketplace.visualstudio.com/items?itemName=github.vscode-codeql
CodeQL CLI 入门:
https://help.semmle.com/codeql/codeql-cli/procedures/get-started.html
如果你想挑战漏洞搜索技能并快速学习 Semmle CodeQL,可以尝试完成给出的任务,即通过使用 CodeQL 来找到 jQuery 插件的变体——这些变体会使客户机暴露于未记录的 XSS(跨站点脚本)漏洞。
具体而言,jQuery 是一个非常流行的、但很旧的开源 JavaScript 库,旨在简化 HTML 文档遍历和操作、事件处理、动画和 Ajax 等工作。截至 2019 年 5 月,jQuery 在 1000 万最受欢迎网站中的使用率为 73%。jQuery 库支持模块化插件,世界各地的开发人员已经实现了数千个插件,无缝地扩展了 jQuery 的功能。
而 Bootstrap 则是一个广泛使用 jQuery 插件机制的流行库;但是 Bootstrap 中的 jQuery 插件过去是以一种不安全的方式实现,这可能会使 Bootstrap 的用户容易受到跨站点脚本(XSS)攻击。
这是指攻击者使用 web 应用程序向其他最终用户发送恶意代码(通常是以浏览器端脚本的形式);而这些恶意脚本可以访问浏览器保留并与该站点一起使用的任何 cookie、会话标记或其他敏感信息。
因此,在整个查找过程中,你需要使用分步指南编写查询,从而查找引导中未安全实现的 jQuery 插件。完成后将答案发送至 ctf@github.com 则可获得获奖机会。GitHub 将选出 2019 年 12 月 31 日前收到的两个最佳 CodeQL 查询获得大奖;还将选择 10 个额外的 CodeQL 查询来赢得其它奖品。
查看以前的挑战:
另外,最近 GitHub 还成为授权的 CVE 编号发布机构,即它能够为漏洞发布 CVE 编号。这一功能已经增加至「安全建议」服务功能中。漏洞修复后,项目所有人就可以发布安全公告,而 GitHub 将向所有使用原来维护人员的代码的易受攻击版本的上游项目所有人;但在发布安全公告前,项目所有人同时可以直接向 GitHub 请求并收到 CVE 编号。
当然,除了代表荣誉的 CVE 之外,Github 也发起了奖金机制,使用 CodeQL 进行挖掘新漏洞的安全研究员可以最高获得 2500 美元的赏金;如果编写的 CodeQL 查询代码质量够高,甚至还能被授予 3000 美元的奖励。
赏金详细规则:
除了新推出的安全实验室外,GitHub 还推出了「GitHub 安全公告数据库」,用于收集平台上能找到的所有安全公告,可以为大家追踪在 GitHub 托管项目中找到的安全漏洞问题提供更大的便利空间。
最后,GitHub 还更新了 Token Scanning 自有服务。它能够扫描用户项目中不慎在源代码中遗留的 API 密钥和令牌。该服务此前能够为 20 种服务检测 API 令牌,而新版本能够检测的格式又增加四个厂商:GoCardless、HashiCorp、Postman 和腾讯云。
Github 地址:
雷锋网 AI 开发者
雷峰网原创文章,未经授权禁止转载。详情见转载须知。