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