利用 Numbat 保護 Perplexity 的用戶端點代理

Numbat 是 Perplexity 為用戶端點提供的開源代理安全套件。它可偵測、預防並調查 macOS、Linux 與 Windows 上的 AI 代理風險行為。

作者Perplexity Secure Intelligence Institute

AI 代理必須具備安全性才能發揮效用。隨著模型與系統能力的提升,保護使用者的警覺性也必須隨之提高。

早期的代理安全研究主要集中於提示詞注入與其他形式的對抗性輸入。然而,近期代理自主性的進步導致了即使在沒有對抗性輸入(或根本沒有人類對手)的情況下,也會發生安全事件。

相反地,若代理在追求高階目標時,沒有獲得如何達成該目標的規範性指導,則可能 成為 對手。當代理為了回應使用者指定的目標,選擇了使用者未預期且不會核准的行動方針時,就會發生這種情況。雖然這類事件在幾個月前僅止於 理論上 的討論,但如今已迅速成為 實際 的安全顧慮。

由於這些行為無法在模型層完全修補,強健的防禦機制必須內建於週邊系統中,包括作為模型與外部世界介面的代理工具組 (agent harness)。我們將 Numbat 開源,這是一款代理安全套件,協助防禦者預防、偵測並減輕與代理相關的事件。Numbat 可識別並直接與企業用戶端點上常見的代理工具組整合,強制執行安全規則並實現快速偵測與回應。

簡介

代理的採用為開發者、採用者與防禦者帶來了全新的安全挑戰。當企業將代理直接部署在具有企業系統與資料特權存取權的用戶端點時,此情況尤為嚴重。

在用戶端點部署代理(例如基於 CLI 或桌面應用程式的編碼代理)時,其沙箱與隔離等級各異。使用者將這些代理用於無數的使用案例,每個案例都有其伴隨的行動空間,可能會影響端點本身或從該端點可存取的其他系統。代理被期望能自主運作數小時甚至數天,這種情況日益普遍。針對這些工作流程,許多使用者選擇將代理行動核准委派給分類器,或透過如 --dangerously-skip-permissions 與 --yolo 等名稱令人擔憂的組態旗標完全繞過核准。代理使用案例與組態的多樣性,加上編碼代理在特權端點上可執行行動的廣泛性,造成了需要安全團隊主動管理的風險狀況。

今天,我們發佈了 Numbat,這是一套我們開發的開源代理安全套件,旨在偵測、調查並預防 AI 代理的危險活動。隨著越來越多公司採用前沿代理產品,Numbat 賦予安全團隊能力,以跟上由此產生的安全挑戰。它整合至每一種最廣泛使用的用戶端代理工具組,並在所有工具組中提供一致的介面。Numbat 因此將安全團隊從為每個使用者依賴的個別代理建置自訂防護與監控工具的負擔中解放出來。作為 Perplexity 加入 Open Secure AI Alliance(與 NVIDIA 及其他組織)的一部分,Numbat 現已提供給防禦者生態系統使用。

Numbat 保護之代理的系統架構。Numbat 強調在地端優先偵測與代理無關的鑑識。

本文首先探討促成 Numbat 的安全挑戰。接著,我們將介紹 Numbat 的設計與架構,以及我們在 Perplexity 數千個端點上部署 Numbat 所獲得的經驗教訓。

評估漏洞情勢

AI 代理安全事件的情勢正快速演變。現有的代理安全文獻多數聚焦於注入攻擊,即將惡意負載引入模型提示詞或內容中,以混淆代理並導致其行為不當。注入攻擊與防護措施已獲得 廣泛研究,而包括 Perplexity 在內的代理開發者也設計出針對注入攻擊日益強健的 防禦。

然而,AI 代理不需要惡意負載也能引發安全事件。事實上,根本無需假設有對手的存在。一個受信任的代理,在受信任的環境中使用管理員核准的工具運作時,可能僅因為過度努力完成任務而採取有害行為。

研究人員將此類故障模式描述為「意外崩潰 (accidental meltdown)」:並非由對抗性輸入所觸發,而是由一般的環境錯誤所引發的有害代理行為。缺失的檔案、失敗的 API 請求、過期的憑證或權限拒絕都可能促使代理尋求變通方案。在追求其原始使用者指定的目標時,代理可能透過未經授權的偵察、存取控制變更、機密發現或資料外洩來跨越安全邊界。代理本身就是攻擊者,而非被攻擊者所利用。此外,攻擊可能同時針對內部系統、外部系統,或兩者皆是,且在攻擊發生前無從得知。

首次被廣泛報導的意外崩潰發生於本月,當時 OpenAI 揭露 了一起危及 Hugging Face 生產基礎設施的代理發起攻擊。在評估預發佈 GPT 模型期間,模型發現無法利用所提供的內容在評估中取得進展。為了打破僵局,模型找到了一種脫離其沙箱測試環境並竊取 Hugging Face 評估答案的方法。該模型利用其工具組來規避預期的網路限制、提升超出沙箱邊界的權限、獲取機密並存取安全的 Hugging Face 系統,這一切僅是為了追求解決評估這項狹隘目標。

崩潰也包含非預期的系統變異與刪除。雖然與入侵外部系統相比可能顯得較為平庸,但這些事件對於編碼代理的進階使用者來說更為頻繁且顯著。刪除 生產資料庫 或 家目錄 是任何開發者的噩夢,代理必須能在執行全程中避開此類行為。

AI 研究人員正致力於在模型本身內減輕這些行為。儘管這些努力確實有價值,但研究社群中的許多人認為,在訓練模型以具備強大安全屬性與訓練相同模型以完成日益複雜的任務之間,存在著根本性的 緊張關係。我們認為,僅關注模型層的防禦措施不太可能將崩潰風險降低至可接受的程度。

透過原生工具組整合保護編碼代理

結論是,代理安全不能僅仰賴模型、使用者或任務層級的防護措施。相反地,安全團隊需要對代理在用戶端點上的實際行為有可見性,並具備能在危險動作執行前予以停止的控制能力。這些是必須與代理工具組緊密整合的系統層級控制。

Numbat 以輕量級靜態 Go 二進位檔案的形式提供這些控制功能,可無縫插入主流用戶端代理工具組。它可在各個代理工具組與執行環境中提供即時監控、原則執行與鑑識重建。

Numbat 與代理工具組之間的關鍵整合點為掛鉤 (hooks)、工作階段成品 (session artifacts) 與 OTLP 遙測。我們將逐一討論。

掛鉤

實際上所有的編碼代理都擁有 掛鉤 (hook) 子系統。掛鉤允許代理在代理執行生命週期內的預定點確定性地執行子常式。代理使用者通常會設定掛鉤,以可預測的方式為模型提供額外內容、實作測試與驗證迴圈,並對代理功能進行其他增強。

使這些鉤子的這些用途具吸引力的相同決定性屬性,也使它們具備偵測與回應上的吸引力。通常,僅僅攔截潛在令人擔憂事件的 大多數 發生情況是不夠的。相反地,必須涵蓋所有這類發生情況,才能進行偵測與回應。Numbat 配置了多種類型的鉤子,讓資安團隊與 IT 管理員能夠實作豐富的偵測邏輯。

在大多數編碼代理中,某些類型的掛鉤(通常稱為「預先行動 (pre-action)」掛鉤)也能夠阻止代理執行下一個動作。使用這些預先行動掛鉤,Numbat 不僅能實作偵測邏輯,還能實作預防性安全規則,以從根本上防止崩潰發生。

工作階段成品

掛鉤是即時實作偵測與預防邏輯的強大手段。然而,此邏輯必須能在程式碼中明確定義。通常,代理安全事件呈現的形式是無法預先預見的,更不用說簡化為原始程式碼。因此,Numbat 也具備追溯存取與分析工作階段成品的能力。

工作階段成品包含多種類型的記錄與診斷資料。或許最重要的一類記錄是工作階段轉錄檔 (session transcript),它記錄了決定代理動作序列的 LLM 對話。編碼代理的進階使用者已經習慣透過工具組提供的指令匯出工作階段轉錄檔以進行進一步分析。但這些匯出檔案通常是純文字格式,並不適合需要具有一致、可預測架構之機器可讀記錄的安全團隊。

因此,Numbat 直接從檔案系統本身檢索工作階段成品。由於大多數用戶端代理工具組將原始成品儲存在檔案系統上(通常位於 $HOME 下的代理特定點目錄中),存取檔案系統提供了以最可用且原始的形式取得此資料的直接途徑。使用 Numbat 的安全團隊可以透過 numbat scan 以標準化 NDJSON 時間軸格式收集這些成品,用於用戶端點上的在地端處理或非同步遠端分析。由於工作階段成品是靜態、獨立的記錄,即使是在安裝 Numbat 之前很久發生的工作階段,Numbat 也能重建其時間軸。

OTLP 遙測

大多數用戶端代理工具組透過 OpenTelemetry 協定 (OTLP) 提供廣泛的遙測功能。此遙測通常提供許多超越掛鉤或工作階段成品所能取得的訊號。

Numbat 可透過 numbat collect 指令作為 OTLP 接收器運作。此指令會啟動一個伺服器,編碼代理會將 OTLP 遙測傳送至該伺服器進行後續分析。重要的是,此伺服器是地端的,且預設僅監聽 localhost,這意味著所有遙測預設都保留在裝置上。隨後,安全管理員可以決定如何處理記錄的遙測資料,無論是實作輕量級裝置端處理、透過 numbat ship 進行遠端處理,或是在如 ClickHouse 等分析平台上進行更深入的分析。

在 Perplexity 內部署 Numbat

在 Perplexity 內部,我們使用 Numbat 來保護工程師使用用戶端編碼代理,包括 Claude Code、Codex、OpenCode 與 Pi。

我們的預防與偵測工作都廣泛使用 Numbat 規則,這些規則透過每個代理的掛鉤子系統實作。我們針對自身需求制定了幾項基礎規則,其中許多已作為 Numbat 52 項內建規則 的一部分發佈。這些規則被組織成 11 個行為類別,以及一組多步驟序列偵測,例如機密存取、外洩、權限提升與橫向移動。規則對標準化事件使用 CEL 運算式,且操作員無需更改 Numbat 程式碼即可加入自己的規則與測試。

例如,內建的 privilege.sudoers_tamper 規則可偵測對 sudoers 原則的寫入、visudo 的使用以及安裝 NOPASSWD 授權的嘗試。這些都是高訊號動作,可能將受限的代理處理程序轉變為持久的 root 存取權。

yaml
# privilege.sudoers_tamper (simplified for readability) id: privilege.sudoers_tamper severity: high expr: | ( event.event_type == "file.write" && event.file_path.matches("(^|/)etc/sudoers$|(^|/)etc/sudoers\\.d/[^/]+$") ) || ( event.event_type == "command.exec" && event.command.matches("\\bvisudo\\b|\\bNOPASSWD\\s*:") )

個別指令本身並不總是看起來具有惡意,因此 Numbat 也會關聯工作階段內的序列。內建的 chain.secret_manager_read_then_egress 規則會在代理從常見機密管理工具讀取數值,並隨後嘗試進行帶有資料的 curl 或 wget 請求時進行偵測。機密讀取可能是合法的。對外請求也可能是合法的。但兩者連結在一起時,則需要調查。

yaml
# chain.secret_manager_read_then_egress (simplified for readability) id: chain.secret_manager_read_then_egress severity: high sequence: within_events: 64 steps: - expr: | event.event_type == "command.exec" && event.command.matches("secretsmanager|get-secret|vault read") - expr: | event.event_type == "command.exec" && event.command.matches("curl.*(--data|--upload-file)|wget.*--post")

管理與監控各個機隊中的 Numbat

如同我們用於開發者端點供應鏈曝光的開源掃描器 Bumblebee 一樣,Numbat 透過 MDM 部署在我們的機隊中。每個 Numbat 都會在地端記錄代理活動,並將結構化遙測傳送至我們集中式的安全系統。

此後,Perplexity Computer 會定期審查最近的 Numbat 調查結果與稽核記錄,以確認有無可疑或惡意行為。它會調查偵測到的事件、重建相關代理工作階段,並對 Numbat 封鎖的動作進行額外審查。

Perplexity 用於監控 Numbat 遙測的內部管線。排程的 Perplexity Computer 任務會非同步審查新訊號,並在有風險活動時向安全團隊發出警報。

Computer 也會尋找我們覆蓋範圍中的差距。它會分析新行為、提出 Numbat 偵測的改進建議、測試這些變更,並開啟合併請求 (pull requests) 以供人工審查。一旦核准並部署,這些規則將改進整個機隊的監控,並為下一次調查產生更好的證據。

這創造了一個自我改進的安全飛輪:代理產生活動,Numbat 將活動轉化為標準化時間軸與遙測,Computer 調查並改進規則,經人工審查的更新則強化了保護未來代理工作階段的控制措施。

結論

在 Perplexity,我們相信 AI 代理將在所有類型的環境中執行:在地端、雲端與混合雲。每一種代理工具組與執行環境的組合都會帶來獨特的安全挑戰,組合複雜性威脅著要讓頻寬有限的安全團隊不堪重負。代理崩潰與其他新型漏洞使安全形勢變得更加複雜。

內建於代理系統本身的防禦措施,無論代理在何處執行,都能改善使用者的安全狀態。這正是 Numbat 所提供的:緊密整合的代理防護措施,使防禦者能夠即時預防、偵測並回應令人擔憂的行為。將 Numbat 與 Perplexity Computer 結合,創造出一個強大的代理安全平台,賦予防禦者能力,以保持領先優勢。

Numbat 現已作為適用於 macOS、Linux 與 Windows 的 開源專案 提供。我們自己的用戶端點受到 Numbat 保護,使 Perplexity 團隊成員能夠自信地在廣泛任務與長期視野下使用代理。我們邀請各地的安全團隊利用 Numbat 的系統層級方法來保護其代理部署。

引用

BibTeX
@online{perplexity2026SecuringAgentsAcrossPerplexitySClientEndpointsWithNumbat,
  author = {{Perplexity} and Adel Karimishiraz and Bex Brooker and Phi Hoang and Jerry Ma},
  title = {{Securing agents across Perplexity's client endpoints with Numbat}},
  date = {2026-07-29},
  url = {https://perplexity.coolkeypoint.com/hub/blog/securing-agents-across-perplexity-s-client-endpoints-with-numbat}
}