A2A 安全機制:智慧體互信的門禁系統
Hermes 訊息平台接入第37篇:A2A 的四道安全防線與社群實戰修復。
讓兩個 AI 互相「打電話」,最怕的是什麼?不是它們聊個沒完,而是陌生人冒充熟人敲門。
安全設計原則:先鎖門再開門
想像你搬進新家,第一件事不是掛窗簾,而是換門鎖。A2A 協定的設計者也是這麼想的——預設安全,每一項放寬都要顯式操作。這套機制像一套完整的門禁系統:門鎖(token)、門禁卡(對等方金鑰)、貓眼(身分識別)、監視攝影機(稽核日誌)。在 Hermes 訊息平台裡,A2A 功能以外掛形式提供,但安全預設值絕不妥協:沒有設定 token 時,只監聽本機 127.0.0.1——相當於門鎖好了,鑰匙只在自己手裡。
四道防線詳解
第一道:本機綁定 + token(門鎖)
預設情況下,A2A 只在本機監聽,外界根本摸不到門。要對外提供服務,必須同時滿足兩個條件:設定 A2A_HOST 暴露位址,並且設定 bearer token。這就像你不僅要打開窗戶,還要在窗台上放一盆帶刺的仙人掌——兩者缺一不可。
第二道:每對等方獨立金鑰(門禁卡)
每個對等方都有自己的專屬 token,透過 A2A_PEER_TOKENS="alice:tok1,bob:tok2" 設定。這不像一把萬能鑰匙開所有門,而是每個訪客一張獨立門禁卡。認證身分驅動限流、信任清單和稽核——誰刷的卡、刷了幾次、什麼時候刷的,全都有記錄。
第三道:注入過濾 + 去敏(安檢門)
入站文字會被過濾,標記為「不可信對等方輸入」,遠端對等方不能呼叫操作員斜線指令。這就像機場安檢,行李箱裡的液體要單獨拿出來檢查。出站回覆中,憑證形狀的字串(API key、JWT、token)會被自動抹除——就像寄出的信件會自動塗掉收件人的身分證字號。
第四道:稽核日誌 + 防循環(監視攝影機)
每次交換都會附加到 ~/.hermes/a2a_audit.jsonl,相當於門口裝了 24 小時監視。防循環回合上限則像鄰居家的門鈴對講機——如果兩個 AI 聊起來沒完,系統會自動切斷。
真實攻擊故事:社群發現並修復的 3 個問題
故事一:SSRF 繞過(#78298)——用「數字暗號」騙過門鎖
有攻擊者發現,回呼 URL 的安全檢查用字串前綴比對主機名稱,例如檢查是否以 127. 開頭。但 IP 位址有個「整數拼寫」的寫法——2130706433 就是 127.0.0.1 的另一種寫法。這就像把門牌號寫成摩斯電碼,警衛認不出來就放行了。修復方案:先把回呼主機解析成標準 IP 再判斷,相當於警衛拿到任何形式的地址,都先翻譯成標準門牌號再比對。
故事二:反向代理身分塌縮(#80534/#80779)——所有人都變成同一個人
部署在 nginx 或 K8s 後面時,A2A 外掛從 socket 位址推導呼叫者身分。但代理伺服器擋在中間,所有對等方都顯示為同一個 IP——代理的位址。這就像公寓大樓的警衛亭,所有訪客登記的都是「警衛亭代簽」。限流共用一個桶(一個忙的拖累所有人)、信任白名單只能填代理位址、稽核看不到真實呼叫者。修復:從 X-Forwarded-For 推導真實身分,但要確保在「可信代理之後」才採信。
故事三:稽核盲區(#81003/#81042)——被拒絕的敲門聲沒人記錄
稽核日誌只記錄被接受的流量。401(token 無效)和 403(不受信任)的請求不產生記錄。這就像監視攝影機只拍順利進門的人,小偷撬鎖的畫面反而沒錄下來。憑證填充攻擊、被撤銷 token 的探測、橫向移動嘗試——這些攻擊行為恰恰是稽核最需要捕捉的。修復:所有認證拒絕也附加到 append-only 稽核日誌,帶 decision 欄位 + HTTP 狀態碼 + 呼叫者 IP。
對使用者意味著什麼
這套機制的核心邏輯是:安全不是事後補救,而是預設狀態。作為 Hermes 使用者,你不需要成為安全專家也能獲得基礎防護——四道防線自動生效。更重要的是,社群在真實攻擊中不斷加固:從 SSRF 繞過到反向代理身分塌縮,再到稽核盲區,每個問題都對應一個真實場景。A2A 協定就像一座不斷加固的城堡,每一塊磚都經過實戰檢驗。下次你的兩個智慧體互相「打電話」時,它們之間不僅有門鎖、門禁卡、安檢門和監視攝影機,還有一群盯著日誌的警衛。
📖 官方文档
本文根据 Hermes Agent 官方文档编写,原文见:官方文档 › user-guide/messaging/a2a