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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章