0
本文作者: 楊鯉萍 | 2019-12-02 10:00 |
雷鋒網(wǎng) AI 開發(fā)者按:近日,GitHub 在全球開發(fā)者大會(huì)上,宣布啟動(dòng)了一個(gè)名為「安全實(shí)驗(yàn)室 (Security Lab)」的新社區(qū)計(jì)劃。該計(jì)劃中,GitHub 不僅開源了代碼分析引擎 CodeQL,還設(shè)置了獎(jiǎng)勵(lì)金最高為 3000 美元的漏洞獎(jiǎng)勵(lì)計(jì)劃。
GitHub 安全實(shí)驗(yàn)室的任務(wù)是啟發(fā)并賦能全球安全研究社區(qū),保護(hù)全球代碼的安全;意將進(jìn)一步解決代碼安全難題,完善開源社區(qū)不足,為開源社區(qū)的優(yōu)質(zhì)代碼貢獻(xiàn)打下良好基礎(chǔ)。這一計(jì)劃也得到了很多大牛企業(yè)為代表的支持,包括 Microsoft,Google,Intel 等,現(xiàn)雷鋒網(wǎng) AI 開發(fā)者將這一社區(qū)具體內(nèi)容整理編輯如下。
CodeQL 是 GitHub 剛推出的一款新開源工具。這是一款語(yǔ)義代碼分析引擎,旨在查找大量代碼中同一漏洞的不同版本。
CodeQL 可以幫助我們跨代碼庫(kù)發(fā)現(xiàn)漏洞;允許我們像查詢數(shù)據(jù)一樣查詢代碼、編寫查詢以查找漏洞的所有變體,并將其永久消除;共享該查詢結(jié)果以幫助其他人消除漏洞。
其中,QL 是查詢語(yǔ)言,也是 CodeQL 的基礎(chǔ),專用于分析代碼。這是一種邏輯編程語(yǔ)言,因此它由邏輯公式組成。QL 使用公共邏輯連接詞(如 and,or,和 not)、量詞(如 forall 和 exists)、以及其他重要的邏輯概念。查詢語(yǔ)句示例如下(實(shí)現(xiàn)將 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 還支持遞歸和聚合,這允許我們可以使用簡(jiǎn)單的語(yǔ)法編寫復(fù)雜的遞歸查詢并直接使用函數(shù)庫(kù),比如:count,sum 和 average。
因此,使用 CodeQL 編寫的查詢可以發(fā)現(xiàn)漏洞及重要安全漏洞的變體。而除了 GitHub 平臺(tái)外,CodeQL 也已經(jīng)應(yīng)用于其它平臺(tái)的漏洞代碼掃描活動(dòng)中,如 Mozilla。
更多關(guān)于 QL
在線查詢
我們可以使用 LGTM 平臺(tái)(https://lgtm.com/query/rule:1823453799/lang:java/)上的 CodeQL 查詢控制臺(tái),在流行的開源代碼庫(kù)上直接運(yùn)行實(shí)際查詢。
LGTM 平臺(tái)界面,直接編寫需要查詢的代碼
當(dāng)了解發(fā)現(xiàn)有漏洞的模式后,我們就能在整個(gè)代碼庫(kù)中查找出類似的情況。在下面的示例中,我們使用了內(nèi)置的 CodeQL 庫(kù)對(duì)不安全的反序列化模式進(jìn)行編碼,以進(jìn)行數(shù)據(jù)流和污點(diǎn)跟蹤。
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"
本地查詢
如果需要在本地編寫和運(yùn)行查詢,可以通過(guò)安裝 Visual Studio Code 的 CodeQL 擴(kuò)展而實(shí)現(xiàn)。
在 Visual Studio 中寫入和運(yùn)行查詢代碼
安裝 CodeQL 擴(kuò)展后,具體操作步驟為:
1. 獲取 CodeQL 數(shù)據(jù)庫(kù)
在 LGTM.com 上搜索要研究的開源項(xiàng)目,然后導(dǎo)入項(xiàng)目頁(yè)面;
將所下載的和項(xiàng)目本身的 CodeQL 數(shù)據(jù)庫(kù)添加到 VS 代碼中,實(shí)現(xiàn)對(duì)這些指令的使用;
2. 查詢代碼并查找漏洞
復(fù)制 CodeQL starter 工作區(qū)并在 VS Code 中打開它;
通過(guò)右鍵單擊查詢并選擇「運(yùn)行查詢」來(lái)運(yùn)行查詢;
有關(guān)詳細(xì)信息,請(qǐng)參閱文檔:
查詢開源代碼庫(kù)
根據(jù) OSI 批準(zhǔn)的開源許可證相關(guān)規(guī)定,我們可以為符合條件的任何項(xiàng)目創(chuàng)建 CodeQL 數(shù)據(jù)庫(kù)。
CodeQL 分析依賴于從代碼中提取關(guān)系數(shù)據(jù),并使用它來(lái)構(gòu)建 CodeQL 數(shù)據(jù)庫(kù)(https://help.semmle.com/codeql/glossary.html#codeql-database)——該目錄包含在代碼上運(yùn)行查詢所需的所有數(shù)據(jù)。
在生成 CodeQL 數(shù)據(jù)庫(kù)之前,您需要:
安裝并設(shè)置 CodeQL CLI。(有關(guān)更多信息,參見下面的 CodeQL CLI 入門)
遷出要分析的代碼庫(kù)的版本。該目錄應(yīng)已準(zhǔn)備好建立,并已安裝所有依賴項(xiàng)。
查詢開源代碼庫(kù)示例
但需要注意的是,GitHub CodeQL 只能用于在 OSI 批準(zhǔn)的開源許可下發(fā)布的代碼庫(kù),或者用于執(zhí)行學(xué)術(shù)研究。它不能用于自動(dòng)化分析、持續(xù)集成或持續(xù)交付,無(wú)論是作為正常軟件工程過(guò)程的一部分還是其他。
CodeQL 擴(kuò)展詳細(xì)文檔:
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
如果你想挑戰(zhàn)漏洞搜索技能并快速學(xué)習(xí) Semmle CodeQL,可以嘗試完成給出的任務(wù),即通過(guò)使用 CodeQL 來(lái)找到 jQuery 插件的變體——這些變體會(huì)使客戶機(jī)暴露于未記錄的 XSS(跨站點(diǎn)腳本)漏洞。
具體而言,jQuery 是一個(gè)非常流行的、但很舊的開源 JavaScript 庫(kù),旨在簡(jiǎn)化 HTML 文檔遍歷和操作、事件處理、動(dòng)畫和 Ajax 等工作。截至 2019 年 5 月,jQuery 在 1000 萬(wàn)最受歡迎網(wǎng)站中的使用率為 73%。jQuery 庫(kù)支持模塊化插件,世界各地的開發(fā)人員已經(jīng)實(shí)現(xiàn)了數(shù)千個(gè)插件,無(wú)縫地?cái)U(kuò)展了 jQuery 的功能。
而 Bootstrap 則是一個(gè)廣泛使用 jQuery 插件機(jī)制的流行庫(kù);但是 Bootstrap 中的 jQuery 插件過(guò)去是以一種不安全的方式實(shí)現(xiàn),這可能會(huì)使 Bootstrap 的用戶容易受到跨站點(diǎn)腳本(XSS)攻擊。
這是指攻擊者使用 web 應(yīng)用程序向其他最終用戶發(fā)送惡意代碼(通常是以瀏覽器端腳本的形式);而這些惡意腳本可以訪問(wèn)瀏覽器保留并與該站點(diǎn)一起使用的任何 cookie、會(huì)話標(biāo)記或其他敏感信息。
因此,在整個(gè)查找過(guò)程中,你需要使用分步指南編寫查詢,從而查找引導(dǎo)中未安全實(shí)現(xiàn)的 jQuery 插件。完成后將答案發(fā)送至 ctf@github.com 則可獲得獲獎(jiǎng)機(jī)會(huì)。GitHub 將選出 2019 年 12 月 31 日前收到的兩個(gè)最佳 CodeQL 查詢獲得大獎(jiǎng);還將選擇 10 個(gè)額外的 CodeQL 查詢來(lái)贏得其它獎(jiǎng)品。
查看以前的挑戰(zhàn):
另外,最近 GitHub 還成為授權(quán)的 CVE 編號(hào)發(fā)布機(jī)構(gòu),即它能夠?yàn)槁┒窗l(fā)布 CVE 編號(hào)。這一功能已經(jīng)增加至「安全建議」服務(wù)功能中。漏洞修復(fù)后,項(xiàng)目所有人就可以發(fā)布安全公告,而 GitHub 將向所有使用原來(lái)維護(hù)人員的代碼的易受攻擊版本的上游項(xiàng)目所有人;但在發(fā)布安全公告前,項(xiàng)目所有人同時(shí)可以直接向 GitHub 請(qǐng)求并收到 CVE 編號(hào)。
當(dāng)然,除了代表榮譽(yù)的 CVE 之外,Github 也發(fā)起了獎(jiǎng)金機(jī)制,使用 CodeQL 進(jìn)行挖掘新漏洞的安全研究員可以最高獲得 2500 美元的賞金;如果編寫的 CodeQL 查詢代碼質(zhì)量夠高,甚至還能被授予 3000 美元的獎(jiǎng)勵(lì)。
賞金詳細(xì)規(guī)則:
除了新推出的安全實(shí)驗(yàn)室外,GitHub 還推出了「GitHub 安全公告數(shù)據(jù)庫(kù)」,用于收集平臺(tái)上能找到的所有安全公告,可以為大家追蹤在 GitHub 托管項(xiàng)目中找到的安全漏洞問(wèn)題提供更大的便利空間。
最后,GitHub 還更新了 Token Scanning 自有服務(wù)。它能夠掃描用戶項(xiàng)目中不慎在源代碼中遺留的 API 密鑰和令牌。該服務(wù)此前能夠?yàn)?20 種服務(wù)檢測(cè) API 令牌,而新版本能夠檢測(cè)的格式又增加四個(gè)廠商:GoCardless、HashiCorp、Postman 和騰訊云。
Github 地址:
雷鋒網(wǎng) AI 開發(fā)者
雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。