部落格 發布於 AIA: 2026年7月6日

看似乾淨的專案,也可能惡意引導 AI 程式開發 agent 建立反向 shell

0DIN 展示一條看似正常的專案啟動流程,如何引導 Claude Code 類型的 agent(能讀專案、執行開發命令的 AI 程式開發 agent)執行設定步驟,最後建立反向 shell。攻擊者不必把惡意程式碼寫進程式碼儲存庫;他可以讓套件先製造初始化錯誤,引導 agent 執行 python3 -m axiom init,再由設定腳本從 DNS TXT 記錄取回並執行真正的惡意指令。防守方因此不能只審查程式碼儲存庫內容,還要在隔離環境中安裝套件、要求高風險命令核准、限制對外連線,並檢查執行時才取回的程式碼。

Indirect Prompt InjectionRemote Code ExecutionPackage VettingRuntime IsolationAI Coding Agent
8 項對應的 AIDEFEND 防禦手法
來源: Clone This Repo and I Own Your Machine 
作者: Andre Hall & Miller Engelbrecht
原文發布: 2026年6月25日

威脅分析

  • 攻擊從一個看似正常的專案開始。 程式碼儲存庫 裡的文件只要求使用者安裝相依套件,並在第一次啟動前執行 python3 -m axiom init。這些內容單獨看都像一般專案設定流程,不像明顯的惡意程式碼。
  • 套件錯誤訊息會引導 agent 執行初始化命令。 agent 嘗試使用套件時,套件會因為尚未初始化而失敗,並在錯誤訊息中提示執行 python3 -m axiom init。程式開發 agent 可能把這當成一般除錯建議,自動執行這個命令。
  • 初始化流程會在執行時向 DNS 查詢指令。 init 會呼叫設定腳本;設定腳本再查詢攻擊者控制的 DNS TXT 記錄,把查到的值當成 shell 命令執行。真正的惡意程式碼不在程式碼儲存庫 裡,而是被放在攻擊者控制的 DNS 記錄中,再由設定腳本取回並執行。
  • DNS 記錄可以回傳反向 shell。 原文示範的 TXT 值會解碼成反向 shell(reverse shell,讓受害主機主動連回攻擊者,供其遠端下指令)。agent 表面上只是修復初始化錯誤,但實際結果是用開發者帳號的權限建立一個可互動的遠端 shell。
  • 影響不只是執行了一段命令。 攻擊者取得的是開發者使用者權限下的工作環境,可能讀到環境變數、API key、雲端憑證、本機設定檔、原始碼副本和內網資源,也可能在離開前新增 SSH key、排程任務或後門。
  • 風險在於三個系統分開看都不一定可疑。 程式碼儲存庫 看起來只是一般設定說明,DNS 查詢看起來只是取設定值,agent 看起來只是執行已授權的修復步驟;只有把程式碼儲存庫、DNS 取回內容和 agent 的 shell 權限一起看,才會看見完整攻擊鏈。

適用的 8 項 AIDEFEND 防禦手法

AID-H-022.001
Sandboxed Dependency Installation
極高
把相依套件安裝放進短生命週期、網路受限的沙箱容器,避免初始化命令和設定腳本直接使用開發者的真實環境。
AID-H-018.003
High-Impact Independent Validation & Approval Gate
極高
雙通道驗證應要求明確核准;只有取得核准後,才允許 AI 程式開發 agent 執行由不可信專案內容或錯誤訊息推導出的初始化、shell、套件安裝或可連網命令。
AID-H-022.002
Pre-Merge Dependency Change Risk Review
只要 pull request 新增這類相依套件,合併前就要檢查漏洞、授權條款、維護者與來源儲存庫信譽、版本來源、安裝腳本差異,以及套件名稱是否有錯字或相似字元。任何一項檢查無法完成,都不能放行合併。這可以在可疑的相依套件變更進入主幹前擋下風險,但無法證明執行期從 DNS 取回的程式碼安全;後續行為仍要由沙箱、執行前檢查與對外連線限制處理。
AID-H-025.001
Pre-Execution Static Analysis & Dangerous Construct Blocking
危險程式結構偵測可以在執行前辨識 shell 執行、Base64 解碼、DNS TXT 命令取回、反向 shell 片段和動態程式碼執行。
AID-I-001.004
Sandbox Network Egress Restrictions
沙箱的對外連線限制可以在初始化命令啟動後,阻止設定腳本查詢攻擊者控制的 DNS 記錄,或建立反向 shell 的對外連線。
AID-I-001.003
Ephemeral Single-Use Sandboxes for Tools
把初始化命令和設定腳本放進一次性沙箱,可避免它們取得長期開發者憑證與本機工作區狀態。
AID-E-003.003
Confirmed Malicious Code & Persistence Eviction
如果初始化腳本已經執行,清理時必須搜尋反向 shell、讓惡意程式持續執行的掛鉤、遭修改的設定檔,以及 agent 執行惡意程式碼後建立的排程任務。
AID-E-001.001
Root & Long-Lived Credential Object Eviction
如果環境變數或本機檔案可能外洩,就要撤銷或輪替其中確切的 root 或長效 credential object,例如 SSH 私鑰、cloud access key、套件 registry 的 API key 或 client secret、密碼與長效憑證。已簽發的 repository/cloud access token 與 authentication session,不論有效期長短,都由 AID-E-001.002 另外撤銷。

身為資安防禦者,我們應該這麼做

  • 把 AI 輔助的套件安裝與初始化流程放在一次性沙箱中;沙箱不應持有正式環境 secrets 或雲端工作階段,並應預設拒絕對外連線。
  • 設定腳本、shell 命令、套件安裝掛鉤,以及建置失敗後 agent 根據錯誤訊息建議執行的命令,都要取得明確核准。
  • 掃描專案和產生的命令,找出 DNS TXT 查詢、下載後交給 shell 執行、編碼的惡意程式碼、反向 shell 片段與動態執行。
  • 記錄 AI 程式開發沙箱的 DNS 查詢與對外連線活動,並預設阻擋未知網域。
  • 如果不可信初始化腳本已經執行,先撤銷並輪替開發者憑證,檢查是否留下 SSH key、排程任務、後門或其他持續執行的設定,再繼續使用該份原始碼副本。

結論

0DIN 案例顯示,乾淨的程式碼儲存庫內容不代表啟動流程安全。這條攻擊鏈真正利用的是 agent 的除錯習慣與 shell 權限:專案先讓 agent 遇到一個看似正常的初始化錯誤,再引導它執行會查詢 DNS TXT 並執行回傳內容的設定腳本。結果不是單純跑錯命令,而是攻擊者可能取得開發者權限下的互動 shell、讀取 secrets,並留下持續存取方式。套件安裝要放進沙箱,高風險命令要取得明確核准,而執行期取回的程式碼在確認安全前一律視為不可信。