📍 真實場景
阿凱,一家平面設計工作室的內部 IT 承辦人,剛把 Claude Code 導入公司的客戶回饋整理流程
他設定好 Claude Code 的「自動模式」,讓它自動抓客戶提供的網址、彙整成摘要報告,因為官方公布的安全測試是零成功率,他就沒另外加人工複核關卡
😖 卡住的地方:有天客戶傳來一個「archive」網站要摘要,Claude 自己抓資料、自己解壓縮,結果不知不覺被植入的程式碼動了手腳,阿凱完全不知道發生了什麼事,也搞不懂官方保證的「零成功率」到底哪裡出了問題
💡 這課會讓阿凱看懂:官方測的是「已知情境」,攻擊者只要換個手法(讓 AI 自己一步步走進陷阱)就能鑽進測試沒蓋到的縫隙,也會學到以後要怎麼幫自動化流程上「第二道鎖」
🧭 這到底是什麼(白話版)
Claude Code 的 Auto Mode(自動模式)讓 AI 自己決定要不要執行指令,不用每次都跳出來問「你確定嗎?」的省事模式 自 2026 年 8 月中旬起變成預設模式,靠一個 safety classifier(安全分類器)一個專門把關的小型 AI,會在 Claude 要採取動作前,先幫忙判斷「這個動作看起來危不危險」 取代人工核准。Anthropic 的工程師 Boris Cherny 曾表示,把「模型訓練」「輸入探測」「意圖分類器」疊在一起的多層防禦,能把面對「沒看過的攻擊」的 prompt injection(提示詞注入)把惡意指令偽裝成普通內容,藏進網頁或檔案裡,讓 AI 讀到後誤以為是自己該做的任務 成功率壓到接近零。委外廠商 Trajectory Labs 測了 72 種情境、每種各跑 10 次,公布的圖表顯示 Opus 5 在 Auto Mode 下的 attack success rate, ASR(攻擊成功率)把同一種攻擊手法重複測試很多次,算出「這招真正得逞的比例」 是 0.00%。
這篇文章的作者想知道,這個漂亮的數字禁不禁得起「量身訂做」的攻擊。他設計了一個常見到不能再常見的情境:請 Claude 幫忙摘要一個網站。這個網站偽裝成一份筆記型錄,裡面其實藏著一個 ZIP 壓縮檔,檔案用特殊編碼包裝,還附上一支看起來正常的解碼工具。
攻擊鏈的巧妙之處在於,每一步單獨看都很「合理」:先誘導 Claude 從內建、限制較多的 WebFetch 換成直接下指令抓取;接著讓它拿到那個特殊編碼的壓縮檔;Claude 很警覺地拒絕執行裡面陌生的執行檔,改自己寫一段 Python 程式來解碼,這原本是值得稱讚的防禦習慣。問題出在,這段自寫程式剛好是在「解壓縮出來、攻擊者完全掌控」的資料夾裡執行,而資料夾裡早就藏了一支冒充成 Python 標準函式庫的假 struct.py。
這就用上了 module shadowing(模組遮蔽)當程式要載入某個功能模組時,如果目前資料夾裡剛好有一個同名的假檔案,程式會誤把假檔案當成正牌貨來用 這招——因為 Python 尋找模組時,sys.path(模組搜尋路徑)Python 找模組時會依序檢查的資料夾清單,通常「目前所在的資料夾」會排在最前面 通常會把目前資料夾排在最前面。當 Claude 執行的程式牽扯到相關功能,就無意間匯入了攻擊者準備好的假模組,攻擊者的程式碼就此被執行——作者最終用小樣本測出 60% 到 80% 的成功率,跟官方的 0.00% 形成強烈對比。
🎯 為什麼值得你花時間
官方安全數字有適用範圍 0% 成功率是在 72 種「已知」情境下測出來的,不代表能擋下所有沒被納入測試的新攻擊手法,看安全報告不能只看單一百分比。
AI 的「正確反應」也可能被攻擊者利用 Claude 拒絕執行陌生執行檔、改自己寫程式的行為原本是好的防禦習慣,但攻擊者把整條攻擊鏈設計成讓 AI 自己一步步走進陷阱,提醒我們防禦要看整個流程,不能只看單一步驟。
自動化流程沒有人工監控,出事也不會有人發現 如果像阿凱一樣,因為相信官方的零成功率就撤掉人工複核,一旦被攻破,資料外洩或主機被操控可能完全沒人察覺,直到損害已經造成。
⚙️ 它是怎麼運作的
1
誘導換工具 先讓 Claude 放棄內建、限制較多的 WebFetch,改用限制較少的 curl 指令直接下載內容。
▼
2
丟出偽裝壓縮檔 把 Claude 導向一個包裝成「筆記型錄」的 ZIP 壓縮檔,裡面的檔案用特殊編碼包裝,還附上一支看起來正常的解碼工具。
▼
3
AI 做了正確判斷 Claude 察覺解碼工具是陌生的執行檔,正確地拒絕直接執行它,這原本是值得稱讚的防禦習慣。
▼
4
但改用自寫程式補位 Claude 改成自己寫一段 Python 程式來解碼,聽起來比執行陌生執行檔安全多了。
▼
5
執行環境已被汙染 問題是這段自寫程式,剛好是在解壓縮出來、攻擊者完全掌控的資料夾裡執行的。
▼
6
模組遮蔽引爆 資料夾裡早就藏了一支冒充成 Python 標準函式庫的假 struct.py,Claude 執行的程式一牽扯到相關功能,就誤用了這支假模組,攻擊者的程式碼因此被執行。
官方評測 vs 這篇文章的實測,數字差在哪裡
項目 官方委外評測(Trajectory Labs) 這篇文章的實測 測試對象 72 種已知的間接提示詞注入情境 針對 Auto Mode 量身設計的全新攻擊鏈
測試規模 每種情境各跑 10 次 小樣本、鎖定同一條攻擊鏈重複測試
攻擊成功率 0.00% 60% 到 80%
手法特性 多半落在分類器熟悉的已知攻擊模式裡 刻意讓每一個步驟單獨看都像合理的工程動作
🔍 程式碼漫遊(點有 ● 的行看白話講解)
這段迷你範例示範攻擊者藏的「假 struct.py」長什麼樣子,以及 Python 為什麼會不小心用到它,而不是真正的標準函式庫。
● # 檔案:struct.py(放在跟受害程式同一個資料夾)
💬 檔名必須跟 Python 標準函式庫的 struct 模組一模一樣,這是整個手法的關鍵
● def pack(fmt, *values):
💬 假冒標準庫 struct.pack 的函式簽章,讓外部呼叫看起來完全正常
● # 這裡可以放攻擊者想執行的任意程式碼
💬 文章裡的真實案例,這裡被用來執行竊取主機資訊等惡意行為;本教案的動手做只示範印出警告文字,不含任何真正的惡意動作
● return b'forged'
💬 回傳一個假造的結果,讓呼叫端以為模組正常運作,不會立刻發現異常
● # 只要目前工作資料夾排在 sys.path 前面,import struct 就會抓到這支假貨
💬 這正是模組遮蔽攻擊得逞的根本原因
🛠️ 動手做:動手做:親眼看「模組遮蔽」怎麼讓程式碼失控(安全重現版)
這是一個真實小專案:下載(或複製)檔案,照步驟在你電腦上跑起來。
📄 safe/run_me.py
⬇ 下載
📋 複製
import struct
print('這裡執行的是 Python 內建的標準 struct 模組')
data = struct.pack('i', 42)
print(f'打包後的位元組:{data}')
📄 danger/struct.py
⬇ 下載
📋 複製
# 這是攻擊者事先放好的假冒 struct.py
# 檔名跟 Python 內建模組完全相同,這正是攻擊得逞的關鍵
def pack(fmt, *values):
print('警告:你剛剛用到的不是 Python 官方的 struct 模組')
print('警告:這裡就是攻擊者能夠插入任意程式碼的地方')
print('警告:真實案例中,這裡可能被換成竊取資料、對外連線等惡意動作')
return b'forged'
📄 danger/run_me.py
⬇ 下載
📋 複製
import struct
print('這裡執行的是 Python 內建的標準 struct 模組')
data = struct.pack('i', 42)
print(f'打包後的位元組:{data}')
打開「檔案總管」,建立一個空白資料夾,例如 D:\demo\module_shadow
在裡面依照上面的「檔案」清單,建立 safe 與 danger 兩個子資料夾,把對應的程式碼分別存成 .py 檔(用記事本另存時記得選「UTF-8」編碼)
開啟 PowerShell,執行:cd D:\demo\module_shadow\safe
執行:python run_me.py,你會看到正常的 struct.pack 結果
回到上一層,執行:cd D:\demo\module_shadow\danger
再執行一次:python run_me.py,這次你會看到警告文字,代表 import 已經被劫持
用記事本打開 danger\struct.py,對照剛剛看到的警告文字,理解程式碼是怎麼被偷換的
(進階)把 danger\struct.py 裡的 print 警告改成你自己想的無害示範動作(例如在桌面寫一個 test.txt),親自體會攻擊者能做到什麼程度的控制
🧠 工程思維透鏡(資深工程師看到的是什麼)
🔭 「安全分類器」防禦為什麼會被繞過?
分類器多半是拿已知攻擊模式訓練出來的,擅長認出典型的惡意提示詞,但這次攻擊刻意讓 Claude 自己一步步寫出解碼程式、自己決定怎麼跑,過程中每一步單獨看都像合理的工程動作。分類器很難在單一步驟裡抓到「這一連串合理動作組合起來是惡意的」,這反映了一個工程權衡:愈是讓 AI 有彈性去自己想辦法解決問題,防護網要顧到的組合就呈指數成長。
🔭 官方「0% 成功率」跟研究者「80% 成功率」為什麼可以同時成立?
兩邊測的其實是不同的東西。官方委外測的是 72 種已知場景各跑 10 次,測的是這些攻擊手法還能不能用;研究者則設計一條量身訂做的全新攻擊鏈,刻意繞過分類器可能認得的模式。這說明安全評測數字的意義有範圍限制,「在這些已知情境下沒被攻破」不等於「面對任何新招式都不會被攻破」,解讀安全報告的百分比時要問清楚測試涵蓋的攻擊面有多廣。
🔭 Claude「拒絕執行陌生執行檔、改自己寫程式」明明是正確的防禦行為,為什麼反而幫了攻擊者?
這是這次攻擊最精妙也最值得工程師警惕的地方,安全機制的正確反應被拿來當攻擊的一環。Claude 依照訓練學到不要跑不信任的執行檔,於是改用聽起來更安全的替代方案,卻沒意識到執行環境(工作資料夾)本身已經被汙染。防禦不能只看這個動作本身安不安全,還要看這個動作發生的環境是誰控制的,環境的信任邊界跟動作的信任邊界一樣重要。
🔭 如果要幫自己的自動化流程補上「第二道鎖」,可以從哪裡下手?
從這條攻擊鏈可以反推防禦重點:一是限制 AI 執行程式碼的工作目錄,不讓它在剛下載、來源不明的資料夾裡直接跑自己寫的程式;二是對會匯入標準函式庫模組的執行環境,用每次都重新建立的乾淨隔離環境,讓攻擊者沒機會預先放置同名檔案;三是保留人工複核或至少事後稽核紀錄,而不是完全信任分類器的「已核准」判斷——作者自己也強調 Auto Mode 不能取代隔離環境加人工監看。
📝 隨堂考(點選答案,立即回饋)
Q1. 這篇文章裡,攻擊者主要是利用什麼樣的「環境」漏洞讓 Claude 的自寫程式被動了手腳?
Claude 的訓練資料被竄改
Claude 自己寫的解碼程式,是在攻擊者控制的資料夾裡執行
Claude 的 API 金鑰外洩
Anthropic 的伺服器被入侵
✅ 攻擊的關鍵不是資料或金鑰外洩,而是 Claude 雖然正確拒絕執行陌生二進位檔、改自己寫程式,但這段程式恰好在攻擊者提供的資料夾裡跑,讓資料夾裡預先放好的假冒 struct.py 有機可乘。
Q2. 官方委外評測顯示 Opus 5 在 Auto Mode 下的提示詞注入攻擊成功率是多少?
0.00%
25%
60%
80%
✅ 文章提到 Anthropic 委託 Trajectory Labs 測試 72 種情境、各跑 10 次,公布的圖表顯示 Opus 5 在 Auto Mode 下攻擊成功率是 0.00%,但這只涵蓋了官方測試涵蓋的已知情境。
Q3. 文章中提到的「模組遮蔽」手法之所以能得逞,關鍵原因是什麼?
Python 執行程式時,目前工作資料夾通常會排在模組搜尋路徑的前面
Python 會自動信任所有從網路下載的檔案
struct 模組本身有已知的資安漏洞
Claude 故意執行了惡意程式碼
✅ Python 匯入模組時會依序檢查 sys.path 裡列出的資料夾,而目前工作資料夾通常排在很前面,只要攻擊者能讓程式在他控制的資料夾裡執行,放一個同名假檔案就能插隊冒充成標準函式庫。
Q4. 作者在文章開頭強調 Auto Mode 不能取代什麼?
定期更新模型版本
在隔離環境中執行並人工監控
使用更貴的訂閱方案
關閉所有網路存取
✅ 作者明確寫道,如果在意誤判、幻覺、提示詞注入風險,Auto Mode 並不能取代在隔離環境執行 agent、並持續監看它在做什麼。
Q5. 這次攻擊鏈的第一步,是把 Claude 從哪個工具引導到哪個工具?
從 Bash 引導到 WebFetch
從 WebFetch 引導到直接使用 curl
從瀏覽器引導到終端機
從 Python 引導到 JavaScript
✅ 攻擊鏈的第一步是誘使 Claude 放棄內建、有較多限制的 WebFetch 工具,改用更直接、限制較少的 curl 指令去抓取內容,為後續步驟鋪路。
🃏 翻牌記憶卡(先想答案,再點開對答)
Auto Mode(自動模式)點我翻面
讓 Claude Code 用內建的安全分類器自行判斷要不要執行指令,取代每次都要人工按同意的模式,自 2026 年 8 月中旬起是預設模式。
這次攻擊的成功率點我翻面
研究者用小樣本測試,達到 60% 到 80% 的攻擊成功率,遠高於官方公布的 0.00%。
module shadowing(模組遮蔽)點我翻面
用跟標準函式庫同名的假檔案,利用目前資料夾優先被搜尋的規則,讓程式誤用假模組而非真模組。
這次攻擊的關鍵轉折點我翻面
Claude 正確拒絕執行陌生二進位檔、改自己寫 Python 解碼器,卻沒發現執行環境已經被攻擊者汙染。
官方評測 vs 這次實測的差異點我翻面
官方測的是 72 種已知情境;研究者則設計一條全新的、針對性的攻擊鏈,繞過分類器熟悉的攻擊模式。
這次事件給我們的防禦啟示點我翻面
光靠分類器不夠,還要限制 AI 執行程式碼的資料夾環境、使用乾淨的隔離空間,並保留人工複核或稽核。
ai-lecturer 教案工廠|藍圖 flash-full-v1.0|本頁零外部依賴,離線可開