代碼別拿來就用!中國研究者14頁論文預警:Copilot生成代碼35.8%有漏洞、C++成“重災(zāi)區(qū)”
原文來源:CSDN

圖片來源:由無界 AI生成
GitHub Copilot 作為基于大模型語言的代碼自動生成工具,自推出以來,受到了無數(shù)程序員的歡迎,其紛紛表示,終于有了不用加班的代碼神器!
根據(jù) CSDN 最新發(fā)起的《2023 AI 開發(fā)者生態(tài)調(diào)研問卷》中期收集的數(shù)據(jù)顯示,已有 90% 的受訪者表示在生產(chǎn)、測試、娛樂等不同場景使用了代碼生成工具,其中 35% 的受訪者稱每天都在使用。

然而,需要注意的是,這些代碼工具在提升工作效率之余,你是否想過,它帶來的是福還是禍?生成的代碼在「拿來即用」的基礎(chǔ)上,真的安全嗎?
近日,為了研究 Copilot 生成代碼的安全性,來自武漢大學、華中師范大學、新西蘭梅西大學、皇家墨爾本理工大學的六位高校研究員進行了一項關(guān)于 GitHub 上 Copilot 生成代碼安全漏洞的實證研究,并發(fā)表了一篇主題為《Security Weaknesses of Copilot Generated Code in GitHub》的學術(shù)論文,最新揭曉了未來“動嘴即可完成編碼”的 AI 編程神器的安全性。

論文地址:https://browse.arxiv.org/pdf/2310.02059.pdf
樣本:生產(chǎn)環(huán)境中 435 段代碼、覆蓋 6 種主流編程語言
在實驗過程中,研究人員從 GitHub 的公開項目中選取了 435 段由 GitHub Copilot 生成的代碼片段,涵蓋了 Python、JavaScript、Java、C++、Go 和 C# 多種主流編程語言。
與此同時,其采用了支持多種語言(包括 Java、JavaScript、C++、C# 和 Python)的開源靜態(tài)分析工具 CodeQL,對代碼片段進行安全掃描和分析,并使用常見漏洞枚舉(CWE)分類代碼段中的安全漏洞。
進而,研究人員基于下列研究流程,從三個維度提出了需要研究、驗證的問題。

RQ1:GitHub 項目中的 Copilot 生成代碼安全嗎?
提出此問題的理由:Copilot 可能會生成包含安全漏洞的代碼建議,而開發(fā)人員可能會接受這些建議,從而可能使程序容易受到攻擊。RQ1 的答案有助于理解開發(fā)人員在生產(chǎn)中使用 Copilot 時遇到安全漏洞的頻率。
RQ2:Copilot 生成的代碼段中存在哪些安全漏洞?
提出此問題的理由:Copilot 生成的代碼可能包含安全漏洞,開發(fā)人員在接受 Copilot 生成的代碼之前,應(yīng)進行嚴格的安全審查。正如 GitHub Copilot 的文檔所明確的“Copilot 的用戶有責任確保其代碼的安全性和質(zhì)量”。RQ2 的答案可以幫助開發(fā)人員更好地了解 Copilot 生成代碼中的可能安全漏洞,從而可以更有效地防止和修復這些漏洞。
RQ3:有多少安全漏洞屬于 MITRE CWE Top-25?
提出此問題的理由:該列表包含 25 個最危險的安全漏洞。RQ3 的答案可以幫助開發(fā)人員了解 Copilot 生成的代碼是否包含被廣泛認可的安全漏洞類型以及 Copilot 處理這些最常見漏洞的能力。
第一步:識別 GitHub 上「真」AI 生成的代碼
之所以想要以 GitHub 作為回答研究問題的主要數(shù)據(jù)源,在研究人員看來,GitHub 包含了數(shù)百萬公開代碼庫,可以訪問大量代碼資源,使其可以在研究中覆蓋多種編程語言和項目類型。
然而,想要直接獲取到 GitHub 中由 Copilot 生成的代碼實則并不容易,因為即使有很多工具輔助,也難辨代碼是出自 AI 還是人類工程師之手。
面對這種窘境,6 位研究人員選擇通過搜索存儲庫描述和代碼中提供的注釋來識別許多代碼段,譬如以“by GitHub Copilot”、“use GitHub Copilot”和“with GitHub Copilot”等關(guān)鍵詞來搜索,最終得到了如下結(jié)果:

繼而又從代碼標簽獲得的不同語言類型的搜索結(jié)果數(shù)量:

接下來,進入過濾環(huán)節(jié)。在此,研究人員在論文中指出其主要遵循了三條規(guī)則:
1. 對于存儲庫標簽下的搜索結(jié)果,在研究人員根據(jù)項目描述或相關(guān)自述文件中的聲明,確定哪些是完全由 Copilot 生成的項目。進而,其保留了 Python、JavaScript、Java、C++、C# 和 Go 等 Copilot 支持的主要語言的代碼文件。

2.?對于代碼標簽下的搜索結(jié)果,其保留顯示代碼由 Copilot 生成的文件注釋。
3. 此次研究對象主要為實際項目中使用的代碼片段,為此,會排除如 LeetCode 平臺上用于解決簡單算法問題的代碼文件。
在完成試點數(shù)據(jù)標注后,論文的第一作者檢查了其余搜索結(jié)果,并獲得了總共 465 個代碼片段。刪除重復結(jié)果后,最后獲得了 435 個不同的代碼片段。其中 249 個來自存儲庫標簽,186 個來自代碼標簽,詳細如下所述:

第二步:數(shù)據(jù)分析
在測試環(huán)節(jié)中,研究人員為了提高結(jié)果的覆蓋面和準確性,對每個代碼段使用兩種靜態(tài)分析工具進行安全檢查(即 CodeQL 加上特定語言的專用工具)。
在本研究中,研究人員首先使用 CodeQL 分析數(shù)據(jù)集中的代碼。CodeQL 標準查詢包中的默認查詢套件為 codeql-suites /-code-scanning.qls。每個包的 codeql-suite 目錄中都包含幾個有用的查詢套件。
同時,其使用了與安全弱點相關(guān)的 -security-and-quality.qls 測試套件掃描代碼段。這些測試套件可以檢查多個安全屬性,涵蓋許多CWE。例如:Python 測試套件提供了 168 項安全檢查;JavaScript 測試套件提供了 203 項安全檢查;C++ 測試套件提供了 163 項安全檢查。
除此之外,研究員為每個編程語言選擇了其他流行的靜態(tài)安全分析工具對文件進行掃描。譬如,Python 使用 Bandit、JavaScript 使用 ESLint、C++ 使用 Cppcheck、Java 使用 Findbugs、C# 使用 Roslyn、Go 使用 Gosec。如果無法直接從掃描結(jié)果中獲取與安全問題相關(guān)的 CWE ID,研究人員還會手動映射掃描結(jié)果提供的安全屬性到相應(yīng)的 CWE。
35.8%?的代碼段有安全漏洞、C++ 代碼漏洞最多、覆蓋 42 種 CWE?類型
經(jīng)過分析,研究人員基于上述提出的三個問題,得到了最終結(jié)論。
RQ1:GitHub 項目中的 Copilot 生成代碼安全嗎?
在 435 個由 Copilot 生成的代碼段中,有 35.8% 包含安全漏洞,不管使用哪種編程語言,都會產(chǎn)生安全問題。

Python 和 JavaScript 代碼中安全漏洞的比例略高,這些是開發(fā)者最常使用 Copilot 的語言。在收集的 251 個 Python 代碼段中,有 39.4% 存在安全風險。在 79 個 JavaScript 代碼段中,有 27.8% 存在安全風險。在所有編程語言中,C++ 代碼段中安全漏洞的比例最高,達到 46.1%。Go 的安全風險比例也相對較高,為 45.0%。相比之下,C# 和 Java 代碼中安全問題文件的比例較低,分別為 25% 和 23.2%。

RQ2:Copilot 生成的代碼段中存在哪些安全漏洞?
為了回答 RQ2,研究員處理了 RQ1 進行的掃描結(jié)果,消除了在同一代碼段位置檢測到的重復安全問題。最終總共在 435 個代碼段中識別出 600 個安全漏洞。

這些檢測到的安全漏洞類型多樣,與 42 個不同的 CWE 相關(guān),其中 CWE-78(操作系統(tǒng)命令注入)、CWE-330(使用不安全的隨機值漏洞)和 CWE-703(對異常條件檢查或處理不恰當)出現(xiàn)頻率最高。

RQ3:有多少安全漏洞屬于 MITRE CWE Top-25?
在識別的 42 個 CWE 中,有 11 個屬于目前公認的 2022 年 CWE Top-25 大漏洞。

寫在最后
對此,也有網(wǎng)友調(diào)侃,自己寫 Bug 的本領(lǐng)可能要比 GitHub Copilot 更高一些。
當然,本研究并非旨在勸說開發(fā)者不要在日常工作中使用 AI 輔助編碼工具,而是想要表明在實際開發(fā)中使用 Copilot 生成代碼能提高開發(fā)效率之時,也提醒大家自行進行安全評估。
同時,在接受 Copilot 的代碼建議時運行適當?shù)陌踩珯z查,有效避免一些潛在風險,降低損失。
更多詳細內(nèi)容,見論文:https://browse.arxiv.org/pdf/2310.02059.pdf
- 免責聲明
- 本文所包含的觀點僅代表作者個人看法,不代表新火種的觀點。在新火種上獲取的所有信息均不應(yīng)被視為投資建議。新火種對本文可能提及或鏈接的任何項目不表示認可。 交易和投資涉及高風險,讀者在采取與本文內(nèi)容相關(guān)的任何行動之前,請務(wù)必進行充分的盡職調(diào)查。最終的決策應(yīng)該基于您自己的獨立判斷。新火種不對因依賴本文觀點而產(chǎn)生的任何金錢損失負任何責任。