「縱深防禦」這個概念在傳統網絡安全裡是老生常談,為什麼在加密 Agent 場景特別重要?
縱深防禦在傳統網絡安全裡確實是基礎原則,但加密 Agent 有幾個讓它比傳統系統更需要縱深防禦的特性:
第一,操作的不可逆性。傳統 IT 系統被攻擊後,通常可以恢復(數據庫備份、系統快照、撤銷賬戶操作)。鏈上交易沒有這個選項——被盜的資金被轉走後,沒有任何技術手段能追回(法律層面的追訴是另一回事,但即使追訴成功,資金也可能無法實際拿回)。
第二,攻擊成本極低,攻擊收益可能極高。Prompt Injection 攻擊者只需要鑄造一個包含惡意指令的 NFT(幾美分的 Gas 費),就可能讓一個 Agent 把它錢包裡的全部資金轉走。攻擊的 ROI 可能是幾萬到幾十萬倍。這讓加密 Agent 成為一個高度有利可圖的攻擊目標。
第三,防禦邊界更模糊。傳統系統的攻擊面相對清晰(網路入口、身份驗證、輸入驗證)。AI Agent 的攻擊面遍布每個 Agent 會讀取的外部數據——任何網頁、任何 API 回傳、任何 NFT metadata 都可能是攻擊入口。你無法完全封閉所有攻擊面,因為 Agent 需要讀取外部數據才能工作。
縱深防禦對加密 Agent 的核心意義:不是讓每一層防禦都堅不可摧,而是讓每一層防禦失效後,損失控制在可接受的範圍,同時還有下一層繼續工作。
每日支出上限熔斷在技術上怎麼實作?如果 Agent 是分散部署在多個服務器上,計數器怎麼同步?
每日支出上限熔斷的實作有幾個技術選項,複雜度從低到高:
單服務器簡單方案(最常用):在後端程式碼裡維護一個內存計數器(Python 的 daily_spent 全局變量或 class attribute),每次寫入工具被調用且執行成功後,更新這個計數器。超過上限時,返回拒絕執行的響應,觸發告警。這個計數器在 UTC 午夜重置。問題:如果服務重啟,計數器歸零——需要在持久化存儲(Redis 或 PostgreSQL)裡也保存計數,服務啟動時從持久化存儲恢復。
多服務器分散部署方案(使用 Redis 作為共享計數器):所有服務器連接到同一個 Redis 實例,每次操作前用 Redis 的 INCR 命令原子性地增加計數,EXPIRE 設定為當天 UTC 午夜。任何服務器檢查計數都得到全局的當日累計值。Redis 的 INCR 是原子操作,不存在並發競爭問題。
計數的內容:計數器追蹤的應該是「已實際廣播到鏈上的操作金額 + Gas 費」,不是「被 Agent 推薦的操作金額」。如果操作因為人工確認被拒絕,不計入。如果操作因為後端驗證被攔截,不計入。只有真正發出去的鏈上交易才計入。
告警設計:在達到上限的 80% 時發送「預警」通知(讓你有時間判斷是否需要手動暫停或調整策略),在達到 100% 時發送「熔斷觸發」通知並停止操作。
四層日誌體系在實作上有沒有推薦的技術棧?怎麼確保日誌本身不被篡改?
四層日誌的推薦技術棧和防篡改設計:
存儲層:把四層日誌存在一個支持行級加密的 PostgreSQL 數據庫(可以用 pgcrypto 擴展對敏感欄位加密)。日誌表設計為「只能插入,不能修改或刪除」(在數據庫層面用觸發器禁止 UPDATE 和 DELETE)。每隔一定時間(例如每天)把日誌的 Merkle Root hash 寫入一個公鏈(Base 或 Ethereum),提供不可篡改的時間戳證明。
日誌格式:每條日誌記錄包含:時間戳(UTC)、日誌類型(LLM推理/工具調用/決策授權/鏈上執行)、內容(加密或明文取決於敏感度)、序列號(遞增不可重複)、前一條日誌的 hash(讓日誌形成鏈式結構,任何篡改都會讓 hash 鏈斷裂)。
訪問控制:日誌數據庫的寫入權限只開放給 Agent 服務的寫入角色(不能刪除,不能修改);讀取權限開放給審計角色。日誌的私鑰和 Agent 的操作私鑰分開管理,確保即使 Agent 被攻陷,攻擊者也無法清除日誌。
定期完整性驗證:每天對日誌的 hash 鏈做完整性驗證,確認沒有中間記錄被篡改或刪除。如果 hash 鏈驗證失敗,立刻觸發高優先級告警。
如果我的 Agent 系統有多個 Agent(Orchestrator + Sub-agents),縱深防禦的三層架構應該怎麼分配到各個 Agent?
多 Agent 系統的縱深防禦設計需要把三層防禦分配到正確的架構位置:
第一層(最小授權):在 Orchestrator 層設計,因為 Orchestrator 持有主要的操作授權。Sub-agent 不應該持有任何鏈上簽署授權(或只持有極小額的獨立 Agent 錢包)。Orchestrator 的 Agent 錢包設計規範:操作錢包 5-10% 策略資金、ERC-20 精確授權、工具白名單。
第二層(讀寫隔離 + 確認通道):讀寫隔離在 Orchestrator 的 LangGraph DAG 裡設計——讀取節點(Sub-agent 分析結果的收集節點)和寫入節點(執行鏈上操作的節點)在不同的圖節點裡,有明確的隔離。後端參數驗證在寫入工具的函數裡(在 Orchestrator 的執行層)。確認通道在 Orchestrator 的執行層之前——Orchestrator 決策後、執行前通過確認通道。Sub-agent 返回的結果在進入 Orchestrator 的 LLM Context 之前,必須通過 Schema 驗證(這是對「Sub-agent 可能被污染」的防禦)。
第三層(熔斷 + 日誌):熔斷計數器在 Orchestrator 層維護(因為它控制所有資金操作)。日誌體系需要覆蓋所有層——不只是 Orchestrator 的決策,也包括每個 Sub-agent 的 Thought 步驟和工具調用記錄,確保攻擊路徑可以追溯到具體是哪個 Sub-agent 的哪個工具回傳了異常數據。
加密 AI Agent 的安全設計問題,大多數人問的是「怎麼讓 Agent 不被攻擊」。這是錯的問題。正確的問題是:「如果 Agent 的所有防禦都失效了——Prompt Injection 成功、MCP Server 被污染、LLM 推理被完全劫持——攻擊者最壞能做什麼?」
如果你無法清楚回答這個問題,你的 Agent 安全設計還沒有完成,不管你的 System Prompt 寫得多好。這篇文章從「最壞情況」出發,設計的目標不是讓攻擊不可能,而是讓攻擊即使成功,後果也在你可接受的範圍內。
傳統的安全設計思維是「把門鎖好」——加入更多安全檢查,讓攻擊更難成功。這個思維對加密 Agent 不夠,因為攻擊成功的可能性永遠存在:LLM 的 Prompt Injection 沒有 100% 的防禦、MCP Server 的社會工程攻擊難以完全預防、你無法保證你使用的每個工具的供應商都沒有被攻擊過。
加密 Agent 的安全設計應該從「縱深防禦(Defense in Depth)」的架構思維出發:假設某些防禦層一定會失效,在每個防禦層之外還有下一層,且每層失效帶來的最壞後果是可以接受的。這和「讓攻擊不可能」是完全不同的設計哲學。具體來說,對每個有資金操作的 Agent,你應該能回答這五個問題:Agent 操作錢包裡最多有多少資金?被盜走你能接受嗎?Agent 有沒有辦法在你不知情的情況下向白名單外的地址轉帳?如果 Agent 的 LLM 推理被完全污染,它最壞能授權多少金額的操作?你的日誌體系能讓你在事後追蹤攻擊路徑嗎?如果你有任何一個問題回答不了,那是需要先解決的安全缺口。
最小必要授權是整個防禦體系的基礎——即使所有其他防禦都失效,這一層決定了攻擊者「能得到什麼」的上限。設計原則:
Agent 操作錢包只存幾天的運作資金。Agent 操作錢包的資金量應該等於「你如果完全接受這些資金全部損失,仍然不會讓你感到財務壓力的金額」。你不需要讓 Agent 直接管理你的全部策略資金——Agent 只需要「夠執行幾次操作的油費」,大部分資金放在 Agent 無法直接存取的主錢包。
ERC-20 授權精確限定。對每個協議、每個代幣,設定明確的最大 approve 金額(`approve(AaveV3, 500_USDC)`),不授予無限授權(`type(uint256).max`)。每月審查並撤銷不再使用的授權(可以用 revoke.cash 快速操作)。即使 Agent 的 LLM 被污染,想要轉移的金額也受到 approve 上限的硬性約束。
操作類型白名單。Agent 能調用的工具,必須精確限定在它的任務所需的最小集合。一個 DeFi 利率優化 Agent 只需要「存入/取出特定白名單協議的 USDC」,不需要「向任意地址轉帳」。把不需要的工具從 Agent 的工具清單裡移除,不留在那裡「以防萬一」。
即使攻擊者成功污染了 Agent 的 LLM 推理,讀寫隔離確保污染的推理無法直接觸發資金操作:
讀取工具和寫入工具的執行環境嚴格隔離。讀取工具(查詢 API、讀取鏈上狀態)可以在接觸任意外部數據後執行,因為最壞的後果是讀到了錯誤信息。寫入工具(簽署交易、移動資金)只在一個「乾淨的」執行環境裡運行,這個環境不接觸未經驗證的外部數據。在架構設計上,讀取和寫入工具應該是不同的工具集,在不同的執行路徑裡被調用——LangGraph 的 DAG 設計讓這個隔離很自然:讀取節點和寫入節點在不同的圖節點裡。
所有寫入操作在後端做二次參數驗證。在工具函數的後端實作裡(不是在 LLM 可見的描述層),對每個寫入操作的參數做硬性驗證:金額是否超過設定上限、目標地址/協議是否在白名單、操作類型是否被允許。這些驗證邏輯在 Python/JavaScript 代碼裡,不在 System Prompt 裡——System Prompt 可以被 Prompt Injection 覆蓋,代碼裡的驗證不能。
高金額操作的獨立確認通道。超過你設定閾值(例如 $100)的任何寫入操作,在後端執行前通過一個和 Agent LLM 推理流程完全獨立的確認通道(Telegram Bot 通知你,等待你回覆確認,才執行)。這一層即使 Agent 的所有 LLM 推理都被污染,攻擊者也無法繞過它——確認請求是發給你手機的,不是發給 LLM 的。
熔斷機制是「假設 Agent 已經在做異常的事情,怎麼自動停止損失繼續擴大」:
每日支出上限熔斷。在 Agent 的後端邏輯裡,維護一個每日累計支出計數器(Gas 費 + A2A 支付費 + 資金操作金額)。超過設定的每日上限,所有後續的寫入操作自動暫停,發送緊急通知,等待你手動重置。這個計數器在後端代碼裡維護,不在 LLM 的 Context 裡——LLM 無法讀取或修改它。
市場異常熔斷。設定幾個市場異常條件:你的 Agent 操作的資產在 15 分鐘內跌幅超過 X%、Gas 費超過正常值 10 倍、DEX 執行的實際滑點超過設定上限。任何一個觸發,所有寫入操作自動暫停。這防止 Agent 在黑天鵝市場事件發生時繼續執行設計用於正常市場的策略。
四層完整操作日誌。完整的操作日誌是事後根本原因分析的唯一手段。四個必要的日誌層:LLM 推理日誌(每個 Thought 步驟的完整輸出,包括 Agent 的決策理由);工具調用日誌(調用什麼工具、輸入什麼參數、工具回傳了什麼原始數據);決策授權日誌(哪些操作被提交、哪些被後端驗證攔截、哪些進入了確認通道);鏈上執行日誌(交易 hash、Gas 費、成交價格、執行時間)。這四層日誌加密存儲,保留至少 90 天。
攻擊發生後的緊急響應需要提前設計好,不是等事情發生再臨時想。標準緊急響應流程:
第一步(0-5 分鐘):確認 Agent 在執行非預期的操作後,立刻停止 Agent 服務進程——這是最快的「緊急剎車」,讓 Agent 無法廣播新的交易。停止服務不會影響已在鏈上廣播的交易,但能防止新的攻擊性操作繼續發出。
第二步(5-15 分鐘):撤銷 Agent 操作地址對所有協議的 ERC-20 授權。即使 Agent 服務已停止,如果授權還在,攻擊者仍然可以在代碼層面調用合約直接轉移代幣。用主錢包對每個代幣合約調用 `approve(agentAddress, 0)` 撤銷全部授權。
第三步(15-60 分鐘):保存所有日誌到隔離的存儲位置(防止攻擊者清除日誌),開始根本原因分析:從 LLM 推理日誌找「Agent 在哪個 Thought 步驟開始出現異常」;從工具調用日誌找「哪個工具回傳了異常數據或惡意指令」;確認攻擊入口(Prompt Injection / MCP Server 污染 / 私鑰洩漏)。
第四步:修復安全漏洞,在測試網完整重演攻擊路徑,確認修復有效,才重新部署。
縱深防禦的目標不是讓 Agent 系統「不可能被攻擊」——那個目標是不現實的。現實的目標是:讓攻擊即使成功,攻擊者能得到的東西最多是你操作錢包裡的幾天運作資金(而不是你的全部資產),且有完整的日誌讓你在事後能追蹤攻擊路徑和根本原因。一個設計良好的 Onchain Agent 系統應該能讓你自信地回答:「如果我的 Agent 今天被完全攻陷,我明天還能繼續做這個業務。」如果你不能這樣回答,安全設計還沒完成。