· 11 分鐘閱讀 · AVL Code 開發團隊(安天 · 瀾砥團隊)

AVL Code 的設計如何避免發生「GPT-5.6 一鍵清空創業者全盤資料」

Agent安全權限控制行為可見硬底線AVL Code

在安全與便利之間,AVL Code 的選擇偏向安全保障,同時給予使用者足夠的選擇權與控制力。

北京時間 7 月 11 日凌晨,AI 創業者 Matt Shumer 在 X 上發帖:「I'm so angry… this feels like something that should happen with GPT-3.5. Not a mid-2026 frontier model on the highest reasoning level.」——這像 GPT-3.5 時代才會出現的錯誤,不應出自 2026 年年中、運行在最高推理檔位的旗艦模型。

事情的經過,X 使用者 @AYi_AInotes 在當天上午給出了詳細拆解:Matt 在自己的 Mac 上為本地 Agent 開啟了 Full Access 全權限,讓一個子代理執行例行的檔案清理——同類任務此前已經執行過幾百次。這一次,GPT-5.6-Sol 未能正確展開 $HOME 變數,實際執行的命令成了 rm -rf /Users/mattsdevbox。等 Matt 發覺異常、手動終止行程時,多年累積的程式碼、檔案、照片已經損失大半。事後 Agent 生成了一份事故報告,承認路徑展開錯誤。報告寫得誠懇,檔案無法恢復。

一、比事故更危險的,是「此前幾百次都沒出問題」

這起事故中最值得警惕的資訊,不是模型犯了錯,而是那句背景:同樣的清理任務,此前已經安全執行過幾百次。

人會在幾百次成功之後形成熟練,模型不會。它的失誤是機率性的:第五百次出錯的機率並不比第一次低多少,而人的警惕卻在一次次成功中持續下降——這正是我們在《AI Coding 成熟曲線》中描述過的「不看 diff 就回車」階段。區別在於,這一次的代價不再是低品質程式碼,而是整塊硬碟。

拆解這次事故,是三個因素的疊加:全權限常開、破壞性命令、無人監督的長時自主執行。三者去掉任何一個,損失都還在可挽回的範圍之內。因此這不是 prompt 品質的問題,也無法寄望於下一代模型更可靠——機率性的能力,必須配以確定性的約束;而約束不能依賴模型自身,要建構在挽具層(關於挽具對結果的影響,《專用挽具戰勝通用挽具》給出過可度量的對照)。這也是我們建構 AVL Code 時的分工:能力來自模型,約束來自挽具。

下面依次說明,AVL Code 把閘門設在哪裡。

二、行為可見:過程可查,不依賴恰好在場

Matt 是恰好發現 Agent 正在刪除檔案的。可見性要解決的正是這一點:不依賴使用者恰好在場,也能知道 Agent 正在做什麼、做過什麼。

AVL Code 中,每一次工具呼叫都是會話流中一張獨立卡片:工具名與入參摘要直接可見,被拒絕、連線失敗等異常有明確的狀態標識。命令攜帶的參數、傳回的結果,無需翻查日誌,就在對話原處。這些呼叫與結果全部寫入會話記錄,重新打開原樣恢復;上下文壓縮採用純追加方式——原始記錄不做物理刪除,僅標記為不再進入上下文視窗。鉤子(hook)的每次執行也會在對話流中留下一條系統訊息,不是黑盒。

查看全域時,「軌跡」面板把一次執行呼叫的所有工具還原為時間線:呼叫順序、每步的耗時與成敗、每個工具的耗時分位統計,任何一步都可以定位回訊息流的對應位置。後文將提到的無限制模式——連審批彈窗都跳過的檔位——開關切換會記入日誌,期間的操作照樣作為工具呼叫寫入會話記錄。

子代理同樣如此:它收到的系統指令、任務輸入與每一條工具呼叫,都可以逐條展開查看。

AVL Code 子代理任務詳情截圖:系統指令、任務輸入與逐條工具呼叫,含一條被拒絕的呼叫
圖 1:子代理任務詳情,截自真實的漏洞掃描會話。系統指令、任務輸入與逐條工具呼叫全程可查——包括被拒絕的呼叫。

這套可見性機制,我們首先用於自己:官網每個案例都附有未刪減的會話回放,推理、工具呼叫、報錯、恢復全程可查(見《為什麼 AVL Code 敢把 AI 會話掛在官網上》)。敢於公開,是因為每一步本來就有記錄。

三、動作可控:每類動作都有閘門,閘門有檔位

可見性解決「知道」,可控性解決「攔截」。AVL Code 的每個工具都有三態開關——啟用、詢問、禁用:啟用直接放行,詢問在每次呼叫前彈窗確認,禁用直接拒絕;三態可在自動、籌劃、準備、執行、評估五種工作模式下分別配置。我們推薦的工作流是先籌劃、再執行:進入籌劃狀態後,自下一輪起暴露給模型的工具集被裁剪為唯讀集合——這不是提示詞層面的約定,而是環境層的強制裁剪;計畫經確認後,「退出籌劃、進入執行」是一個顯式動作。

針對幾類高危動作:終端命令採用內建白名單,並可按工作模式自訂放行與攔截規則,支援正規表示式——例如將 rm -rf / 一類命令寫入攔截規則;git 推送、合併、變基等操作可設定為「每次執行前彈窗確認」;修改 MCP 配置的寫操作採用兩步制——第一步僅傳回 dry-run 預覽,顯式確認後才寫入,單步無法完成破壞性變更;威脅情報預設只做雜湊查詢、不外發檔案內容,金鑰類敏感檔案在任何配置下都不上傳,樣本內容確需外發時另有獨立的確認環節。

AVL Code 工具配置介面截圖:每個工具的啟用/詢問/禁用三態開關,以及 fs.exec 的放行與攔截規則編輯面板
圖 2:工具三態開關與 fs.exec 放行 / 攔截規則。規則支援萬用字元與正規表示式,按工作模式獨立生效。

審批不限於桌面端:同一條審批會同時推送到桌面與已綁定的 IM,在微信中回覆 /approve/deny 同樣有效,以最先應答的一端為準;每條審批請求帶有唯一編號,勾選過的「一直允許」授權按工作區持久化,可查看、可撤銷。30 秒無人應答,按拒絕處理——逾時的方向是拒絕,不是放行

對簡短指令,還有一道更早的閘門:複述意圖,預設開啟——Agent 先複述它理解的目標與執行思路,經確認後再開始執行。$HOME 展開錯誤發生在執行層,而更多事故在意圖層就已經偏離。

四、邊界先劃清:能存取什麼,進場前確定

邊界從選擇工作區就開始:路徑在軟連結解析之後再驗證,系統目錄、家目錄本身、~/.ssh 等敏感位置連同整棵子樹,都不允許設為工作區。需要存取工作區之外的目錄時,必須顯式附加,分為唯讀與讀寫兩檔,附加前有確認,授權以會話為單位——對唯讀附加目錄的寫操作,後端直接拒絕。網路同樣有邊界:聯網工具僅放行 http(s) 協定,從首次連線到每一次重新導向都會解析目標位址,內網、環回以及雲端中繼資料位址一律攔截。

最嚴格的一段邊界,留給最危險的物料。AVL Code 的使用者日常處理惡意樣本,工作區下的 samples/ 目錄是專設的分析沙箱——目錄內禁止執行任何內容,該規則優先級高於全部使用者配置,修改配置檔案也無法解除。執行類動作發生之前,還會對目標做一次威脅核查——預設僅雜湊查詢,不外發檔案內容。

邊界的價值在於事前:它把「Agent 能存取什麼」從每次執行時的不確定,變成進場前已經確定的約定。

五、高權限不常駐:危險狀態難進入、易退出

回到事故的起點:Full Access 全權限,並且長期開啟。

AVL Code 也有權限全開的檔位,即無限制模式。但它被有意設計為難進入、易退出、不持久:進入前須經風險確認彈窗,原文表述明確——「開啟後,本會話的智慧體將不再彈出任何執行批准,可執行任意命令、存取內網/本機等任意網路位址」;確認按鈕帶 5 秒冷靜期,倒數計時結束前無法點擊;開啟期間介面常駐危險標識,隨時可以一鍵關閉;作用域按會話隔離、僅存於記憶體、重啟即清除。它放開的是審批彈窗、命令白名單與內網位址過濾——使用者可以進入這個狀態,但會明確知道自己正處於其中,它也不會在無察覺的情況下延續為常態。

AVL Code 無限制模式風險確認彈窗截圖:列明放開的權限與保留的底線攔截,確認按鈕帶倒數計時
圖 3:無限制模式確認彈窗,截自真實的樣本分析會話。確認按鈕名為「請仔細閱讀風險提示」,倒數計時結束前不可點擊。

對產品自身的操作,標準相同:設定中所有破壞性按鈕都不使用單次點擊即生效的原生彈窗——第一次點擊不執行,只進入帶倒數計時的待確認狀態(清理 3 秒、全量重置 5 秒),再次點擊才會真正執行;涉及敏感資料的清理類別,執行前自動生成快照,可以就近回滾。

六、失控可停:子代理始終受控

這次事故的直接執行者,是一個無人監督的子代理。

AVL Code 中,子代理並行時每個分支都是獨立上下文、互不可見,單個分支失敗不影響整批;一次並行最多 16 個分支,同時執行的背景任務上限為 64 個。時間維度上有三層看門狗:單個工具閒置 10 分鐘逾時,子代理閒置 15 分鐘逾時,絕對上限 60 分鐘——不存在長時間執行而無人知曉的子代理。

需要停止時,一次動作即可停止全部:停止操作先級聯終止所有衍生子任務,再停止主助手,不留孤兒行程。Matt 只能趕到電腦前手動終止行程;在 AVL Code 中,這個動作是一次點擊,並且終止得徹底。被中斷的任務也不會自行恢復:重啟後以橫幅列出,恢復或忽略由使用者決定;自動恢復預設關閉,即便開啟,單次也最多自動恢復 5 個。

七、紅線:不受任何開關影響

前面每道閘門都有開關——這是合理的,不同任務需要不同的權限口徑。但最後一層沒有開關。即便開啟無限制模式,以下硬底線也不受影響:

  • samples/ 沙箱——目錄內禁止一切執行,優先級高於任何使用者配置;
  • 破壞性命令的參數驗證——rmmvcp 的每一個路徑參數都必須位於工作區之內,絕對路徑一律拒絕,--no-preserve-root 直接攔截;
  • 危險注入黑名單——fork 炸彈、寫 /etccurl | sheval 等模式,在白名單裁決之前先行攔截;
  • 協定白名單——僅放行 http(s)。

這不是宣傳表述,而是無限制模式確認彈窗中的產品原文:「僅保留底線攔截:rm -rf 類破壞性刪除、samples/ 沙箱、危險注入。」

回頭看 Matt 那條命令:rm -rf /Users/mattsdevbox——絕對路徑,目標在工作區之外,恰好落在參數驗證明確攔截的範圍之內,即便所有開關都調至最寬鬆。我們仍然不會說「這樣就絕不會發生事故」,沒有任何工程能夠作此承諾;紅線的意義在於,當最壞的那一次失誤到來時,系統並非不設防。

模型基於機率,挽具不是賭博

@AYi_AInotes 在事故拆解推文的結尾給出四條教訓,前三條我們完全同意;第四條——「模型廠商的安全底線不一樣」,Matt 也表示此事讓他「一千倍地更信任」另一家的模型——我們只同意一半。模型的謹慎值得作為選型依據,但不值得作為安全依據:再謹慎的模型也是機率性的,把關鍵資料託付給機率,與 Full Access 常開沒有本質區別。

控制論奠基人維納(Norbert Wiener)1960 年在《科學》雜誌上寫道:

如果我們為達成目的而使用一種機械裝置,而它一旦啟動我們就無法有效介入——因為它的動作太快、且不可挽回,以至於我們來不及在動作完成之前加以阻止——那麼我們最好十分確定:置入機器的目的,正是我們真正想要的目的。

六十六年後,「太快、且不可挽回」恰好是那條 rm -rf 的準確寫照。行為可見、動作可控、邊界、冷靜期、看門狗、紅線——歸結起來是同一句話:在「一次失誤」與「不可挽回的損失」之間,設置足夠多確定性的約束。這些機制寫在使用者手冊參考手冊中,也原樣運行在官網每一個公開案例的會話裡——不是事故之後補充的承諾,而是產品從第一個版本就有的設計。

我們在 AVL Code 等你,駕馭賽博野驢——韁繩始終在你手裡。


AVL Code,AVL 安全引擎,與智慧隨行。安天瀾砥團隊出品。