GitHub 准备集成 Semmle 代码分析用于持续的漏洞检测

阅读数:511 2019 年 10 月 8 日 08:00

GitHub准备集成Semmle代码分析用于持续的漏洞检测

借助对初创企业 Semmle 的收购,GitHub 旨在让持续的漏洞检测成为其持续集成 / 持续部署服务的一部分。

在宣布本次收购时,GitHub 的 首席执行官 Nat Friedman 表示:

Semmle 的革命性语义代码分析引擎允许开发人员编写查询,以在大型代码库中识别代码模式,并搜索漏洞及其变体。

Semmle 创建了 LGTM ,这是一个持续代码分析平台,旨在识别软件系统中的漏洞。LGTM 的核心是 Semmle QL ,这是一种查询语言和代码搜索引擎,使代码分析能够找到并根除安全漏洞。

QL 使用变体分析,这是一种安全工程师经常用来识别漏洞的技术,该技术从已知漏洞开始,把它作为搜索过程的种子。换句话说,一旦通过渗透测试(pen-testing)或其他技术确定了漏洞,安全研究人员就会审查代码库的其余部分以发现类似的问题。这是 QL 自动化的过程,并跨多个代码库扩展,允许开发人员编写可以共享和重用的查询。根据 Semmle 的说法,他们的解决方案已经识别出数千个漏洞,包括开源项目中的 100 多个 CVE。

Semmle 分析引擎的一个重要特征是,它把代码当作在 AST 级别上的数据而不是我们在正则表达式上操作的文本。下面是个例子,来看看我们如何分析一个 C 语言函数,它对一个作为参数传递的数组进行迭代,并确保在每个调用位置传递一个足够长的数组:

复制代码
import cpp
from Function f, FunctionCall c, int i, int a, int b
where f = c.getTarget()
and a = c.getArgument(i).getType().(ArrayType).getArraySize()
and b = f.getParameter(i).getType().(ArrayType).getArraySize()
and a < b
select c.getArgument(i), "Array of size " + a
+ " passed to $@, which expects an array of size " + b + ".",
f, f.getName()

在上面的代码段中,f 是函数,c 是函数调用,i 是用来在调用参数上迭代的整数,a 和 b 用于存储预期的数组大小和实际的数组大小。下面的代码段旨在确保将某个类的所有公共字段声明为 final

复制代码
from Field f
where f.hasModifier("public")
and
not(f.hasModifier("final"))
select f.getDeclaringType().getPackage(),
f.getDeclaringType(),
f

正如我们所看到的,QL 语法是声明性的(有点类似于 SQL)和面向对象的。目前,Semmle 支持 C 和 C++、C#、COBOL、Java、JavaScript 和 TypeScript 以及 Python。对 Go 的支持工作还在进行中。

Semmle QL 不是一个新产品,根据 Semmle 的说法,很多大公司已经在使用了,其中包括 Uber、NASA、微软和谷歌。这有助于构建一个大型 QL 查询库。根据 Semmle 的说法,开发人员可以重用数以千计的开源查询,并且,在发送一个新的拉取请求时,将其作为自动 CI 管道的一部分执行。

目前,可以通过 LGTM(LGTM 能够连接到我们的 GitHub 账号)使用 Semmle QL,但是 GitHub 计划通过 GitHub Actions 把它作为 CI/CD 服务的一部分。

原文链接:

GitHub To Integrate Semmle Code Analysis for Continuous Vulnerability Detection

评论

发布