GitHub 免費(fèi)提供機(jī)器學(xué)習(xí)掃描代碼漏洞,現(xiàn)已支持 JavaScript / TypeScript
目前在 JavaScript 和 TypeScript 存儲庫上開發(fā)測試,以后會逐步增加各種語言支持。
在測試期間,CodeQL 已經(jīng)從 12,000 個(gè)存儲庫中發(fā)現(xiàn)了超過 20,000 個(gè)安全問題,包括遠(yuǎn)程代碼執(zhí)行(RCE)、SQL 注入和跨站腳本(XSS)漏洞。
如何使用
GitHub 的 CodeQL 代碼掃描對于公共存儲庫是免費(fèi)的。
目前,新的 JavaScript / TypeScript 分析工具,已向 security-extended 和 security-and-quality 分析套件的所有用戶推出。
如果你已經(jīng)在使用這些套件,那么將自動使用新的機(jī)器學(xué)習(xí)技術(shù)進(jìn)行分析。
如果你之前沒使用過,可按照以下步驟啟用 CodeQL。
1、在你的存儲庫主頁下,單擊 Security。
2、在 Code scanning alerts 右側(cè),點(diǎn)擊 Set up code scanning。如果缺少這一項(xiàng),需要由存儲庫管理員啟用 GitHub 高級安全性。
3、在“Get started with code scanning”下,單擊在 CodeQL Analysis 中的 Set up this workflow。
4、使用 Start commit 下拉菜單,輸入文件名并提交。
5、選擇直接提交到默認(rèn)分支,還是創(chuàng)建一個(gè)新分支并啟動拉取請求。
6、單擊提交新文件。
代碼掃描分析成功后,用戶將在“Security”選項(xiàng)卡中看到安全警報(bào)信息。
為何用 ML 能產(chǎn)生更好效果
為了檢測存儲庫中的漏洞,CodeQL 引擎首先構(gòu)建了一個(gè)數(shù)據(jù)庫,對代碼的特殊關(guān)系表示進(jìn)行編碼,然后在數(shù)據(jù)庫上執(zhí)行一系列 CodeQL 查詢。
但隨著開源生態(tài)系統(tǒng)的快速發(fā)展,長尾效應(yīng)越來越明顯。
安全專家不斷擴(kuò)展和改進(jìn)這些查詢,對其他常見庫和已知模式進(jìn)行建模。然而,手動建模很耗時(shí),而且總會有一些無法手動建模的不太常見的庫和私有代碼。
這時(shí)候機(jī)器學(xué)習(xí)就派上了用場。通過給定大量訓(xùn)練代碼片段,每個(gè)查詢都標(biāo)記為正面或負(fù)面樣本,為每個(gè)片段提取特征,并訓(xùn)練深度學(xué)習(xí)模型對新示例進(jìn)行分類。
GitHub 不是將每個(gè)代碼片段簡單地視為一串單詞或字符,直接應(yīng)用標(biāo)準(zhǔn) NLP 技術(shù)對這些字符串進(jìn)行分類,而是利用 CodeQL 訪問有關(guān)底層源代碼的大量信息,為每個(gè)代碼片段生成一組豐富的 feature,然后像 NLP 那樣對它們進(jìn)行標(biāo)記和子標(biāo)記。
由此從訓(xùn)練數(shù)據(jù)中生成一個(gè)詞匯表,并將索引列表輸入到深度學(xué)習(xí)分類器中,輸出當(dāng)前樣本是每種漏洞的概率。
雖然現(xiàn)在基于 ML 的漏洞掃描僅適用于 JavaScript / TypeScript,但 GitHub 承諾未來會支持更多語言,現(xiàn)在 CodeQL 已經(jīng)支持了 Python、Go、C / C++ 在內(nèi)的多種流行語言。
最后,GitHub 還強(qiáng)調(diào),雖然全新工具可以發(fā)現(xiàn)更多漏洞,但也有可能提高誤報(bào)率(召回率約為 80%,精度約為 60%)。未來這項(xiàng)功能會隨著時(shí)間推移而改善。