文件 v1.0.9

Sandbox

每次 run_command、script 工具與 test_tool 的執行都由 go-pkg/sandbox 包裹:

平台 機制
Linux bubblewrap(bwrap
macOS sandbox-exec

Sandbox 限制:不可特權執行、受限的檔案系統寫入範圍、可配置的網路存取、可配置的 CPU/記憶體上限。

三個呼叫者,單一進入點

Sandbox 恰有三個呼叫者,全部直接呼叫 sandbox.Wrap(ctx, binary, args, workDir, opt)

  1. run_command —— 任意使用者發出的命令(internal/tools/runCommand.go
  2. toolAdapter/script 的 execute —— script 工具擴充(script_*ext_*
  3. test_tool —— script 工具 script.py 的試跑(上限 60 秒)

呼叫者與 sandbox.Wrap 之間沒有 wrapper 層。新增行為(例如新的資源上限)意味著貢獻至 go-pkg/sandbox,而非在 agenvoy 中加 shim。

Policy 注入

filesystem.LoadRuntime() 在啟動時讀取 ~/.config/agenvoy/config.json,並把合併後的 policy 交給 go-pkg/sandboxgo-pkg/filesystem。部分 policy 有編譯進執行檔的預設值並與使用者項目合併,其餘僅存在於使用者設定。

Policy 內嵌預設 config.json 鍵 用途
敏感路徑 configs/jsons/sensitive_path.json sensitive_path 存放憑證或金鑰的路徑——需經密碼驗證的 per-session 授權才能存取。分四類:dirsfilesprefixesextensions
排除清單 configs/jsons/exclude_list.json 從列目錄 / 走訪 / 搜尋中排除的路徑
唯讀指令 configs/jsons/read_only_command.json read_only_command 跳過 confirm gate 的指令
拒絕指令 denied_command run_command 一律拒絕的 binary,sh -c 內亦然
拒絕路徑 denied_path 讀寫皆永久禁止的路徑;任何提示都無法核准。項目必須是絕對路徑或以 ~/ 開頭,拒收根目錄,symlink 的實際目標也一併拒絕
SSRF 豁免 net_white_list 豁免 http_request SSRF 防護的 host

指令政策為拒絕清單。不存在 binary 允許清單:white_listpath_white_list 已移除,sensitive_map 已更名為 sensitive_path;設定檔若仍留有這些鍵會在啟動時記警告,而非靜默套用。$HOME 以外的路徑存取是透過確認提示逐 session 授權,不是靠設定檔清單。

denied_path 會作為 denied map 交給 go-pkg/sandbox;agenvoy 端則由 boundary.Resolveboundary.WriteBinds 在任何檔案工具或 write_paths 綁定前先行檢查。

檔案系統寫入 guard

go-pkg/filesystem 的寫入 API(WriteFileWriteJSONAppendTextCheckDir)全部在內部強制 IsDenied。任何繞過 go-pkg/filesystem、直接透過 os.WriteFile 寫入的 agenvoy code 都會逃脫 policy — 這是禁止的。

internal/filesystem package 僅保留路徑計算、執行期上限與 domain wrapper。它不重複 read/write 邏輯。

$HOME 之外,run_command 必須事先宣告路徑:該次呼叫帶上 write_paths(僅限絕對路徑),使用者以系統密碼核准後,這些路徑才會為該 session 以讀寫方式綁進 sandbox。寫入未核准的路徑會得到明確訊息;對未綁定的 $HOME 外路徑出現權限錯誤時,會附上改帶 write_paths 重跑的提示,而非讓模型把裸錯誤誤判成擁有者問題。

子程序 argv-only schema

run_command 只接受 argv: string[](minItems 1)與選填的 write_paths。它接受帶自動 tokenize 的 command: string。此零解析做法移除了 agent 層的 shell-injection surface。

在最外層,sudo 會被拒絕(改為宣告 write_paths),rm 轉為移入垃圾桶,cd 則在驗證路徑後切換工作目錄。

Shell 功能(pipe、redirect)需明確發出 ["sh", "-c", "cmd | pipe"](或 bash -c)。該腳本以 mvdan.cc/sh 解析而非字串比對,且其中每個命令節點都會被檢查:

規則 效果
只接受裸指令名 /usr/bin/curl 會被拒絕——binary 必須寫成 curl
不接受動態指令 由變數或命令替換組出的指令一律拒絕
不接受 rmsudo 兩者在 sh -c 內一律拒絕
拒絕清單上的 binary 列於 denied_command 者一律拒絕,sh -c 內亦然
Shell 內建指令 固定集合(cdechotestexport ...)無需 allowlist 條目即可通過
巢狀 sh -c 以相同規則遞迴驗證;非靜態字串的巢狀腳本一律拒絕

Timeout

每個工具都有自己的 timeout,預設 1 分鐘,並可在註冊時逐一覆寫(open_file 10 秒、fetch_pagesearch_web 90 秒、generate_audio 5 分鐘、download_file 10 分鐘、generate_image 15 分鐘、run_command 60 分鐘)。Subagent 呼叫含等待空位時間,由 MaxSubagentTimeoutMin(30 分鐘)設限。

這些皆為套件層級的值——過去用來控制它們的環境變數覆寫已移除。

EN