隨著大型語言模型(LLM)越來越多地產生可運行程式碼並整合到開發流程和代理堆疊中,存在著越來越大的風險: 隱 or 惡毒 指令——無論是嵌入在模型輸出中、透過網頁或第三方外掛程式註入,或是在模型訓練期間引入——在執行該程式碼時都可能導致不安全行為。
根據開發者社群中流傳的用戶報告,一位軟體開發者遭遇了災難性的資料遺失——大約 刪除了 800GB 的文件,包括 整個 CursorAI 應用程式本身 — 執行由下列人員協助產生的程式碼後 雙子座3 在內部工作時 CursorAI IDE隨著開發者越來越依賴 LLM 進行程式碼生成,未經審查或不安全的腳本所帶來的後果也變得越來越嚴重。
因此,了解如何偵測和清除LLM產生的危險程式碼非常重要。
在 ChatGPT 和 LLM 的脈絡下,「隱藏代碼」是什麼?
人們所說的「隱藏程式碼」是什麼意思?
「隱藏程式碼」是開發人員用來描述LLM接收或輸出的文字(或檔案)中任何嵌入的指令或可執行內容的總稱,包括:
- 提示式說明 嵌入使用者內容中(例如,「忽略先前的說明…」隱藏在 PDF 中)。
- 隱形字符 或使用零寬度空格來隱藏標記或打破標記化假設。
- 編碼有效載荷 (base64、URL 編碼、圖像或文件中的隱寫嵌入)。
- 隱藏的 HTML/JS 或包含在格式化內容中的腳本區塊,這些腳本區塊可能會被下游渲染器解釋。
- 元資料或註釋 (文件註釋、PDF 中的隱藏圖層)用於指導檢索系統或模型。
- 隱性行為 源自於使用危險 API 產生的程式碼(例如,
eval,exec,subprocess(或稱網路/系統呼叫)-即使意圖並非明確惡意。 - 提示注入指令 這會導致模型產生包含隱藏命令或類似後門邏輯的程式碼,因為攻擊者篡改了提示或上下文。
這些攻擊向量通常被稱為 及時注射 or 間接快速注射 當目標是改變模型行為時,安全社群現在將提示注入視為LLM的核心漏洞,OWASP也將其正式列為LLM風險類別。
這與普通惡意軟體或跨站腳本攻擊 (XSS) 有何不同?
差別在於 語義的 層級:提示注入攻擊的目標是模型的指令執行行為,而非宿主作業系統或瀏覽器渲染引擎。即便如此,最終在網頁渲染器中執行的隱藏 HTML 或腳本仍然是一種可執行攻擊(類似 XSS 攻擊);語義層和執行層都必須受到防禦。行業領導者和研究人員將提示注入稱為“前沿安全挑戰”,並持續發布緩解策略。
為什麼LLM會產生隱藏或危險的程式碼?
模型行為、訓練資料和教學情境
邏輯邏輯模型(LLM)經過訓練,能夠根據上下文和指令產生合理的後續程式碼。如果上下文包含對抗性線索,或者使用者要求模型產生執行強大操作的程式碼,模型可以輸出包含微妙或主動行為的程式碼。
LLM 會產生看似合理但不安全的程式碼
LLM(邏輯邏輯模型)的最佳化目標是流暢性和實用性,而不是在有破壞性副作用的情況下確保安全性。它們會很樂意生成簡潔的… rm -rf /path/to/dir or shutil.rmtree() 當被要求「清理」時,他們會打電話過來——而且由於他們的回覆通常語氣自信,用戶可能會在缺乏仔細審查的情況下直接複製貼上。這種「自信錯覺」問題正是看似無害的請求變得危險的原因。
混淆工作流程自動化
威脅行為者現在正透過鍊式呼叫LLM(邏輯層模型)來實現程式碼混淆的自動化:一個模型產生有效載荷,另一個模型對其進行修改以避免特徵碼檢測,如此循環往復。 2025年的產業威脅報告和供應商分析將這種「人工智慧輔助混淆」記錄為一種新興技術。
如何偵測模型輸出中的隱藏程式碼?
快速分診檢查清單
- 掃描不可見/異常的 Unicode 字符 (零寬度連接符號、零寬度空格、位元組順序標記、非 ASCII 同形字形)。
- 運行靜態分析/抽象語法樹解析 識別對強大 API 的使用情況(
eval,exec,subprocess,os.system(反思性呼籲)。 - 尋找編碼後的有效載荷。 (base64編碼、十六進位二進位資料塊、重複的長字串或壓縮內容)。
- 檢查混淆模式 (用於建立 API 名稱的字串連接、字元運算,
chr()鏈)。 - 使用語意分析 確認程式碼是否實際執行 I/O、網路或檔案系統修改。
靜態模式檢測(快速,第一行)
- 語言感知解析和程式碼檢查。 立即將產生的輸出解析為程式碼區塊而非純文字。執行格式化工具和程式碼檢查工具(Black/Prettier、pylint、eslint)。代碼檢查規則應標記以下情況:
eval,exec,rm -rf原始子程序調用,或動態建構指令的 shell 管道。 - 標記和字串模式掃描器。 尋找高風險代幣和模式:
sudo絕對路徑/home/,C:\,rm -rf,shutil.rmtree,subprocess.Popen內聯 base64 二進位資料、長而無法解釋的字串以及切換解釋器上下文的 shebang。 - 秘密掃描和溯源檢查。 偵測硬編碼憑證、指向不受信任註冊表的 URL 或從任意來源動態拉取軟體包的程式碼。
靜態分析可以快速發現許多明顯的問題,而且作為 CI 門控的一部分,運行成本很低。
語義和上下文檢測(深入)
- 意圖分析。 使用輔助模型或規則引擎對產生的程式碼意圖進行分類:是「讀取」、「寫入」、「刪除」、「網路」還是「安裝」?任何被歸類為刪除/寫入的操作都應觸發升級。
- 數據流分析。 分析程式碼,偵測未經驗證或使用者提供的路徑是否可能指向破壞性 API。例如,如果從 LLM 輸出或遠端檔案派生的變數隨後被連接到 shell 命令中,則將其標記出來。
- 產地關聯。 完整記錄對話、系統提示和上下文頁面。如果可疑輸出與特定的外部文件或外掛程式呼叫相關聯,則可能表示存在提示注入或上下文被竄改的情況。
動態和行為檢測(最可靠)
- 在沙箱環境中執行並進行監控。 在嚴格限制的臨時環境中執行產生的程式碼,該環境無網路連線、無主機掛載,並啟用了系統呼叫過濾(seccomp)。監控檔案系統活動、網路呼叫嘗試、進程產生和異常 I/O。
- 金絲雀測試。 在對真實資料運行之前,先對包含哨兵檔案的合成目錄執行程式碼;監控刪除或覆蓋情況。
- 行為啟發式方法。 尋找遍歷父目錄的循環、沒有深度檢查的遞歸操作,或可能損壞許多檔案的重新命名模式(例如,重複寫入相同的檔案名稱)。
動態分析是檢測混淆、延遲或僅在運行時觸發的有效載荷的唯一方法。
在執行LLM輸出之前,應該如何移除或消除隱藏程式碼?
防禦性刪除與改變語義
「移除隱藏碼」有兩個目標:
- 消毒 — 移除明顯非代碼或可疑的內容(例如不可見的 Unicode 字元、零寬度字元、附加的 base64 編碼資料)。這不應改變預期的良性邏輯。
- 中和 — 對於任何執行或呼叫外部服務的操作,在驗證之前停用這些呼叫或使其不執行任何操作。
總是更喜歡 中和 + 複核 切勿盲目刪除:隨意刪除程式碼可能會導致程式崩潰或出現意外行為。相反,應使用明確的、帶有日誌記錄的存根代碼替換可疑結構,這些存根代碼會在失敗時拋出異常或返回安全的預設值。
步驟 1 — 將產生的程式碼視為不受信任的數據
切勿直接從 ChatGPT(或任何 LLM)執行程式碼,而應先經過移除和加固流程。此流程應透過策略強制執行,並在 CI/CD 中自動化。
步驟 2 — 擷取並標準化程式碼
- 規範化文字並刪除零寬度字符移除 U+200B、U+200C、U+200D、U+FEFF 等零寬度/格式化碼點。記錄移除的內容以供審核。此步驟可消除許多用於視覺隱蔽的「隱藏」編碼。
- 去除所有非程式碼上下文移除敘述文字、隱藏註解以及所有 HTML/Markdown 包裝器。使用語言格式化工具(例如 Black、Prettier)將程式碼轉換為規範形式,以便規範化混淆的空格或控製字元。
- 使用這些結構拒絕或隔離程式碼。: 動態的
eval原始子程序呼叫(os.system,subprocess.Popen),內聯 base64 編碼的資料塊解碼後執行,或嵌入#!試圖改變解釋器上下文的指令。 規範化文字並刪除零寬度字符
移除 U+200B、U+200C、U+200D、U+FEFF 等零寬度/格式化碼點。記錄移除的內容以供審核。此步驟可消除許多用於視覺隱蔽的「隱藏」編碼。
步驟 3 — 解析為抽象語法樹 (AST) 並取代風險節點
將程式碼解析成抽象語法樹(AST)後,找到呼叫動態執行的節點(例如, exec或以程式設計方式建構函數名稱。將它們替換為安全的存根,這些存根會引發一個受控異常,指示「不安全的動態行為已被阻止」。產生一份經過清理的、基於抽象語法樹 (AST) 的原始碼副本以供審查。執行安全模式檢查(針對您的環境自訂 semgrep 規則)。如果發現匹配項,請標記並消除它們。
步驟 4 — 靜態加固和重寫
- 自動重寫將程式碼透過自動消毒器進行處理,該消毒器會將危險呼叫替換為安全包裝器——例如,替換
os.system()/subprocess使用經過核准的沙盒執行器來強制執行逾時和網路封鎖。 - 能力門控修改或移除 API 金鑰、令牌或對特權端點的呼叫;用模擬適配器取代它們以進行本機測試。防止意外包含金鑰或 URL。
- 依賴關係重寫: 區塊動態
pip/npm由程式碼建立的安裝程式。要求依賴項必須透過您的註冊表進行聲明和批准。
第五步-在充滿挑戰的沙盒環境中奔跑
- 臨時容器/微型虛擬機:在無網路連線、無法存取主機憑證且檔案系統存取權限受限的容器/虛擬機器中執行程式碼。 gVisor、Firecracker 或專用臨時執行服務等技術都適用。如果程式碼必須存取 I/O,請使用強制執行策略的代理程式。
- 系統呼叫過濾器和 seccomp限制允許的系統呼叫。應阻止對臨時目錄之外的檔案寫入。
- 資源/時間限制設定 CPU/記憶體/時間限制,使邏輯炸彈也不能無限期運作。
沙箱執行加上監控通常可以發現靜態檢查遺漏的有效載荷。產業指南和近期發布的白皮書均建議將沙箱作為核心緩解措施。
您的流程中應該包含哪些自動化工具和規則?
建議的工具鏈組件
- Unicode 清理模組 (自訂或現有庫)。必須記錄規範化字元。
- 解析器 + AST 分析器 針對每種目標語言(Python)
ast,typed-ast(JavaScript 解析器、Java 解析器)。 - 靜態分析器/SAST: Bandit(Python)、Semgrep(多語言、可自訂)、帶有安全插件的 ESLint。
- 熵和解碼器啟發式:偵測 base64/hex/gzip 並路由至檢查。
- 沙盒運轉時:具有嚴格 seccomp/AppArmor 設定檔或語言級解釋器且禁用系統呼叫的最小容器。
- 政策執行者:一個決定允許的模組、允許的端點和安全的 API 包裝器的元件。
- 審計追踪:記錄原始輸出、清理後的輸出、差異和決策的不可變日誌。
semgrep模式範例(概念性)
使用簡短、保守的規則來標記危險函數的使用。例如:
- 旗
eval,exec,Function建構函式(JS)、動態導入或字串建構的 API 名稱。 - 標記超出允許清單的網路呼叫(例如,
requests.get到未知主機)。 - 標誌寫入敏感路徑(
/etc(系統資料夾)或產生進程。
(將這些作為各組織的配置項,並隨著時間的推移逐步收緊。)
有哪些實用的消毒小技巧(安全範例)?
以下是一些你可以藉鏡的非危險防禦性例子。它們是: 消毒和檢測 程式碼片段——不是漏洞利用指令。
範例:去除零寬度字元(Python,防禦性)
import re
ZERO_WIDTH_RE = re.compile(r'')
def strip_zero_width(s: str) -> str:
cleaned = ZERO_WIDTH_RE.sub('', s)
return cleaned
這會移除攻擊者常用來隱藏代碼的字符,這些字符通常隱藏在可見文字中。務必記錄移除的內容,並將移除操作視為審計追蹤的一部分。
範例:解析和檢查抽象語法樹(Python,概念性)
import ast
def has_dynamic_exec(source: str) -> bool:
tree = ast.parse(source)
for node in ast.walk(tree):
if isinstance(node, ast.Call):
if getattr(node.func, 'id', '') in ('eval', 'exec',):
return True
if isinstance(node, ast.Attribute):
if getattr(node, 'attr', '') in ('popen', 'system'):
return True
return False
If has_dynamic_exec 返回 True,則不要運行程式碼;而是將動態節點替換為安全的存根並要求審查。
注意:這些範例僅供參考。請勿從您的流程中移除日誌記錄、稽核或手動審核。
結語:始終將LLM輸出視為不受信任的程式碼。
語言模型是強大的生產力工具——它們可以產生優雅的程式碼、加快草稿編寫速度並自動化日常工作。但是,當它們與執行環節接觸時,安全規則就會改變: **模型輸出必須被視為不可信的產物。**在過去 18 至 30 個月中,快速注入、後門研究和現實世界漏洞揭露的結合清楚地表明:風險面已經擴大並將繼續演變。
結合解析、靜態分析、沙箱動態測試、治理和持續紅隊演練等實用防禦措施可以阻止大多數攻擊。但團隊也必須重視組織控制:最小權限原則、溯源機制以及一種假定 LLM 輸出需要驗證的文化。業界正在開發工具和框架來簡化這些模式;同時,採用上述清單可以降低隱藏有效載荷洩漏的風險。
開發者可以存取最新的LLM API,例如: 克勞德十四行詩 4.5 API Gemini 3 Pro 預覽版 等等,透過 CometAPI, 最新型號版本 始終與官方網站同步更新。首先,探索該模型的功能 游乐场 並諮詢 API指南 以獲得詳細說明。造訪前請確保您已經登入CometAPI並取得API金鑰。 彗星API 提供遠低於官方價格的價格,幫助您整合。
準備出發了嗎? → 立即註冊 CometAPI !


