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 開發者
雷峰網原創文章,未經授權禁止轉載。詳情見轉載須知。