程式碼生成安全
AI 程式設計助理如何透過建議投毒、訓練資料萃取、不安全程式碼生成與 IDE 擴充功能風險引入安全漏洞。
AI 驅動的程式碼生成已根本性地改變軟體撰寫方式。GitHub Copilot、Cursor、Claude Code 與 Windsurf 等工具如今在許多組織產出相當比例的生產程式碼。此轉變引入全新的安全顧慮類別:您的開發者所交付的程式碼可能包含從未由人類撰寫、受攻擊者細微影響,或由被入侵之訓練資料所生成的漏洞。
新威脅版圖
傳統應用程式安全聚焦於人類開發者所引入的漏洞:邏輯錯誤、API 誤解或輸入驗證失敗。AI 程式碼生成引入三種根本不同的威脅向量。
第一,模型本身可能從訓練資料中學到易受攻擊的模式。不像可被訓練避免 eval() 或 SQL 字串串接的人類開發者,語言模型重現訓練語料中的統計模式。若易受攻擊的程式碼模式在該語料中常見,模型就會建議它們。
第二,驅動建議的上下文視窗可被操控。AI 程式設計助理不是孤立運作——它們讀取周邊程式碼、開啟的檔案、文件與版本庫脈絡以產生相關建議。能影響任一輸入的攻擊者,皆可引導模型產出易受攻擊的程式碼。
第三,IDE 整合層建立新的攻擊面。程式設計助理以擴充功能形式運作,具備存取檔案系統、網路甚至終端機的能力。被入侵或惡意的擴充功能可在開發者不知情下外洩程式碼、注入建議或修改檔案。
攻擊分類
本節將程式碼生成安全威脅組織為四類,各具不同的攻擊向量與緩解方式。
1. 建議投毒
建議投毒 鎖定的是 AI 向開發者建議的程式碼。攻擊者目標是讓 AI 推薦不安全程式碼,而開發者未經審視即接受。
投毒可於兩個層級發生:
- 訓練時投毒 ——將易受攻擊的程式碼模式引入用於訓練模型的版本庫,使模型學會重現那些模式
- 推論時投毒 ——操控模型於產生建議時讀取的本機上下文(鄰近檔案、註解、文件)
建議投毒的細微性使其特別危險。被投毒的建議可能在功能上正確,卻包含在程式碼審查中難以察覺的安全漏洞。例如,建議的身分驗證函式可能在所有測試案例中正確運作,但使用對時序攻擊脆弱的字串比較。
2. 訓練資料萃取
AI 程式碼模型是在大量原始碼上訓練的,其中部分可能包含機密、專屬邏輯或可識別個人資訊。訓練資料萃取 攻擊試圖使模型重現此敏感內容。
萃取攻擊利用模型對訓練資料的記憶。研究顯示大型語言模型能記憶並逐字重現訓練資料中的序列,包含:
- 提交至公開版本庫的 API 金鑰與憑證
- 無意納入訓練資料的私有程式碼庫中的專屬演算法
- 揭示基礎設施細節的配置模式
3. 不安全程式碼生成
即使沒有對抗性操控,AI 程式設計助理也例行產出含安全漏洞的程式碼。這本身不算攻擊,但為攻擊者可利用的系統性風險。
研究顯示 AI 產生的程式碼所含漏洞比率與人類撰寫程式碼相當、有時甚至更高,特別集中於某些漏洞類別:
| 漏洞類型 | CWE | 於 AI 生成程式碼中的普及度 |
|---|---|---|
| SQL 注入 | CWE-89 | 高——模型常建議以字串串接組合查詢 |
| 跨站腳本 | CWE-79 | 高——生成程式碼常省略輸出編碼 |
| 路徑遍歷 | CWE-22 | 中等——檔案路徑處理鮮少含遍歷檢查 |
| 指令注入 | CWE-78 | 中等——shell 指令組裝常使用字串格式化 |
| 硬編碼憑證 | CWE-798 | 中等——模型重現訓練資料中的憑證模式 |
風險因開發者信任而放大。當程式設計助理提出建議時,開發者對它的審視可能低於對同事所寫程式碼的審視,尤其在時間壓力下。
4. IDE 擴充功能風險
AI 程式設計助理以具相當系統存取的 IDE 擴充功能形式運作。這建立了結合傳統供應鏈攻擊風險與 AI 驅動工具獨特能力的攻擊面。
惡意或被入侵的 IDE 擴充功能可:
- 讀取所有開啟的檔案,包含憑證、環境變數與專屬程式碼
- 靜默修改程式碼,變更開發者當下視線之外的檔案
- 透過遙測通道或建議 API 呼叫外洩資料
- 從合法 AI 服務攔截建議,於顯示前加以修改
攻擊者視角
從紅隊員的角度,AI 程式設計助理是頗具吸引力的目標,理由如下:
影響規模。單一次成功的投毒攻擊——不論在訓練資料層級或版本庫上下文層級——可同時為成千上萬的開發者與專案引入漏洞。這是任何手動程式碼注入活動無法匹敵的力量倍增器。
利用的細微性。不像傳統供應鏈攻擊(惡意套件、被入侵相依性),建議投毒在相依樹或套件清單中不留下任何跡證。易受攻擊的程式碼看起來是由接受建議的開發者所寫。
信任不對稱。開發者被訓練對來自未知來源的程式碼保持警覺,卻常在最少審查下接受 AI 建議。部分是因為建議出現在開發者自己的編輯器中、以他們自己的程式風格呈現,讓它們感覺像自己工作的自然延續。
歸因困難。若漏洞是透過被投毒的建議引入,鑑識分析可能永遠無法辨識根因。程式碼技術上是由開發者所寫(他們接受了建議),而影響建議的被投毒上下文可能是短暫的。
攻擊鏈範例
考慮一個針對使用 GitHub Copilot 之組織的真實攻擊鏈:
1. Attacker identifies target organization's tech stack via job postings
2. Attacker creates popular open-source libraries with subtly vulnerable patterns
3. Libraries gain adoption and are indexed by Copilot's training pipeline
4. Copilot begins suggesting vulnerable patterns learned from these libraries
5. Alternatively: attacker contributes to existing libraries used by the target
6. Target developers accept suggestions containing timing-vulnerable comparisons
7. Vulnerability enters production code with no trace of external influence
此鏈在任一單點都難以偵測,因為每一步單獨看皆無害:函式庫正常運作、貢獻通過程式碼審查、建議可運作、開發者遵循正常工作流程。
本節範圍
本節涵蓋程式碼生成安全,分為三個子節:
- AI 程式設計助理 ——程式設計助理的版圖及其特定攻擊面,包含 GitHub Copilot 攻擊、代理式程式設計工具,以及 IDE 擴充功能攻擊
- 漏洞模式 ——AI 生成程式碼中的常見漏洞模式,包含 CWE 對應 與 特定語言風險
- 程式碼建議投毒 ——操控 AI 建議的攻擊,包含 訓練資料攻擊 與 上下文操控
防禦考量
雖然本節聚焦於攻擊技術,理解防禦版圖對有效紅隊演練至關重要:
- 程式碼掃描整合 ——在 AI 生成程式碼進入版本控制前對其執行 SAST/DAST
- 建議過濾 ——供應商端在建議抵達開發者前過濾已知易受攻擊模式
- 上下文隔離 ——限制程式設計助理可存取的檔案與資料
- 遙測監控 ——偵測來自 IDE 擴充功能的異常資料流
- 開發者教育 ——訓練開發者以對第三方程式碼相同的審視度檢視 AI 建議