程式碼別拿來就用中國研究者14頁論文預警:Copilot生成程式碼35.8%有漏洞、C++成“重災區”


原文來源:CSDN

圖片來源:由無界AI生成

GitHub Copilot 作為基於大模型語言的程式碼自動產生工具,自推出以來,受到了無數程式設計師的歡迎,其紛紛表示,終於有了不用加班的程式碼神器

根據CSDN 最新發起的《2023 AI 開發者生態研究問成交量》中期收集的數據顯示,已有90% 的受訪者表示在生產、測試、娛樂等不同場景使用了代碼生成工具,其中35% 的受訪者稱每天都在使用。

然而,要注意的是,這些程式碼工具在提升工作效率之餘,你是否想過,它帶來的是福還是禍?產生的程式碼在「拿來即用」的基礎上,真的安全嗎?

近日,為了研究Copilot 生成程式碼的安全性,來自武漢大學、華中師範大學、紐西蘭梅西大學、皇家墨爾本理工大學的六位大學研究員進行了一項關於GitHub 上Copilot 產生程式碼安全漏洞的實證研究,並發表了一篇主題為《Security Weaknesses of Copilot Generated Code in GitHub》的學術論文,最新揭曉了未來「動嘴即可完成編碼」的AI 編程神器的安全性。

論文網址:https://browse.arxiv.org/pdf/2310.02059.pdf

樣本:生產環境中435 段程式碼、覆蓋6 種主流程式語言

在實驗過程中,研究人員從GitHub 的公開專案中選取了435 段由GitHub Copilot 產生的程式碼片段,涵蓋了Python、JavaScript、Java、C++、Go 和C# 多種主流程式語言。

同時,其採用了支援多種語言(包括Java、JavaScript、C++、C# 和Python)的開源靜態分析工具CodeQL,對程式碼片段進行安全掃描和分析,並使用常見漏洞枚舉(CWE)分類程式碼段中的安全漏洞。

進而,研究者基於下列研究流程,從三個維度提出了需要研究、驗證的問題。

RQ1:GitHub專案中的Copilot 生成程式碼安全嗎?

提出此問題的理由:Copilot 可能會產生包含安全漏洞的程式碼建議,而開發人員可能會接受這些建議,這可能會讓程式容易受到攻擊。 RQ1 的答案有助於理解開發人員在生產中使用Copilot 時遇到安全漏洞的頻率。

RQ2:Copilot 產生的程式碼段中存在哪些安全漏洞?

提出此問題的理由:Copilot 產生的程式碼可能包含安全漏洞,開發人員在接受Copilot 產生的程式碼之前,應進行嚴格的安全審查。正如GitHub Copilot 的文檔所明確的「Copilot 的使用者有責任確保其程式碼的安全性和品質」。 RQ2 的答案可以幫助開發人員更了解Copilot 產生程式碼中的可能安全漏洞,從而更有效地防止和修復這些漏洞。

RQ3:有多少安全漏洞屬於MITRE CWE Top-25?

提出此問題的理由:此清單包含25 個最危險的安全漏洞。 RQ3 的答案可以幫助開發人員了解Copilot 產生的程式碼是否包含廣受認可的安全漏洞類型以及Copilot 處理這些最常見漏洞的能力。

第一步:識別GitHub 上「真」AI 產生的程式碼

之所以想要以GitHub 作為回答研究問題的主要資料來源,在研究人員看來,GitHub 包含了數百萬公開程式碼庫,可以存取大量程式碼資源,使其可以在研究中覆蓋多種程式語言和項目類型。

然而,要直接取得GitHub 中由Copilot 產生的程式碼實則並不容易,因為即使有許多工具輔助,也難辨程式碼是出自AI 還是人類工程師之手。

面對這種窘境,6 位研究人員選擇透過搜尋儲存庫描述和程式碼中提供的註解來識別許多程式碼段,譬如以「by GitHub Copilot」、「use GitHub Copilot」和「with GitHub Copilot」等關鍵字來搜索,最終得到瞭如下結果:

繼而又從代碼標籤獲得的不同語言類型的搜尋結果數量:

接下來,進入過濾環節。在此,研究人員在論文中指出其主要遵循了三條規則:

1. 對於儲存庫標籤下的搜尋結果,在研究人員根據項目描述或相關自述文件中的聲明,確定哪些是完全由Copilot 產生的項目。進而,其保留了Python、JavaScript、Java、C++、C# 和Go 等Copilot 支援的主要語言的程式碼檔案。

2. 對於程式碼標籤下的搜尋結果,其保留顯示程式碼由Copilot 產生的檔案註解。

3. 此研究對象主要為實際專案所使用的程式碼片段,為此,會排除如LeetCode 平台上用於解決簡單演算法問題的程式碼檔案。

在完成試點資料標註後,論文的第一作者檢查了其餘搜尋結果,並獲得了總共465 個程式碼片段。刪除重複結果後,最後獲得了435 個不同的程式碼片段。其中249 個來自儲存庫標籤,186 個來自程式碼標籤,詳細如下所述:

第二步:數據分析

在測試環節中,研究人員為了提高結果的覆蓋範圍和準確性,對每個程式碼段使用兩種靜態分析工具進行安全檢查(即CodeQL 加上特定語言的專用工具)。

在本研究中,研究人員首先使用CodeQL 分析資料中心化的程式碼。 CodeQL 標準查詢套件中的預設查詢套件為codeql-suites /-code-scanning.qls。每個套件的codeql-suite 目錄中都包含幾個有用的查詢套件。

同時,其使用了與安全性弱點相關的-security-and-quality.qls 測試套件掃描程式碼片段。這些測試套件可以檢查多個安全屬性,涵蓋許多CWE。例如:Python 測試套件提供了168 項安全檢查;JavaScript 測試套件提供了203 項安全檢查;C++ 測試套件提供了163 項安全檢查。

除此之外,研究員為每個程式語言選擇了其他流行的靜態安全分析工具對文件進行掃描。譬如,Python 使用Bandit、JavaScript 使用ESLint、C++ 使用Cppcheck、Java 使用Findbugs、C# 使用Roslyn、Go 使用Gosec。如果無法直接從掃描結果中取得與安全性問題相關的CWE ID,研究人員也會手動將掃描結果提供的安全屬性映射到對應的CWE。

35.8% 的程式碼段有安全漏洞、C++ 程式碼漏洞最多、覆蓋42 種CWE 類型

經過分析,研究者基於上述提出的三個問題,得到了最終結論。

RQ1:GitHub專案中的Copilot 生成程式碼安全嗎?

在435 個由Copilot 產生的程式碼片段中,有35.8% 包含安全漏洞,不管使用哪種程式語言,都會產生安全性問題。

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

RQ2:Copilot 產生的程式碼段中存在哪些安全漏洞?

為了回答RQ2,研究員處理了RQ1 進行的掃描結果,消除了在相同程式碼段位置偵測到的重複安全性問題。最終總共在435 個代碼段中識別出600 個安全漏洞。

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

RQ3:有多少安全漏洞屬於MITRE CWE Top-25?

在識別的42 個CWE 中,有11 個屬於目前公認的2022 年CWE Top-25 大漏洞。

寫在最後

對此,也有網友調侃,自己寫Bug 的本領可能比GitHub Copilot 更高一些。

當然,本研究並非旨在勸說開發者不要在日常工作中使用AI 輔助編碼工具,而是想要表明在實際開發中使用Copilot 生成代碼能提高開發效率之時,也提醒大家自行進行安全評估。

同時,在接受Copilot 的程式碼建議時執行適當的安全檢查,有效避免一些潛在風險,並降低損失。

更多詳細內容,請見論文:https://browse.arxiv.org/pdf/2310.02059.pdf

資訊來源:由0x資訊編譯自8BTC。版權所有,未經許可,不得轉載

Total
0
Shares
Related Posts