Agent 要跟我借電腦,我該給它多少權限?
上一篇〈終端信任光譜〉的結尾說:在 agent 真正被放出去亂跑的那天,大家最先問的是——它能碰到什麼。這篇回答同一個問題的另一面:當 agent 要跟你借電腦時,你該給它多少權限。
OpenAB Connect 的 agent 跑在遠端沙箱裡,本來碰不到你的電腦。但有時你會想讓它碰:看一下你的螢幕哪裡出錯、在瀏覽器裡幫你填一張表、在 Mac 上跑一次 Xcode build。這時你透過 Connect 或 Remote 把電腦借給它,選好借多久,再選一個 profile,決定它拿到什麼。
直覺的答案是錯的
最直覺的想法是:「不讓它執行指令就安全了。」讓它看、讓它點、讓它打字,但不給 shell。
問題是,能操作桌面,就等於有 shell:
osascript可以執行do shell script。key可以在終端機裡打字。mouse可以把終端機打開。
想靠過濾 AppleScript 的內容來擋,也擋不住:JXA 的 doShellScript、
ObjC.import 呼叫 NSTask、Terminal 的 do script、System Events
送出的按鍵,路太多了。所以「不給執行指令」只是少一個方便的入口,並沒有少任何權限。
我們自己就踩過
直到最近,除了給你自己用的 owner,借出電腦時的另一個選項叫 sandbox:跟 owner 一樣,只是拿掉了 exec。
這個名字說錯了。它不是沙箱,它等同 shell。一個叫 sandbox、實際上交出 shell 的選項,比沒有這個選項更糟,因為它讓人以為可以放心借出。所以我們把它拿掉了:sandbox 改名為
desktop,照它實際能做的事命名;另外新增 observe,一個真正的邊界(#45)。
三個選項,你交出去的分別是什麼

| Profile | 等同 shell? | 工具數(macOS / Linux) | 你交出去的 |
|---|---|---|---|
observe | 否 | 2 / 2 | 你的螢幕畫面和系統資訊,僅此而已 |
desktop | 是(透過 GUI) | 20 / 20 | 你的桌面,也就等於你的 shell |
owner | 是(直接) | 42 / 37 | 全部,留給你自己的 CLI |
desktop 在 macOS 上沒有 exec,但有滑鼠、鍵盤和 AppleScript;在 Linux
上它直接保留了 bash。既然 mouse 和 key 反正能打開終端機,把
bash 藏起來只會讓 agent 不方便,不會少任何權限,所以我們不假裝。完整的工具清單在
tool-profiles.md。
為什麼只有「看」算邊界
observe 只有兩個工具:sys_info 和 screenshot。它不能打字、點擊、執行指令,也不能改變任何狀態。它能成為邊界,靠的是三件事:
- 它是 allowlist,不是 denylist。日後新增的任何工具,不管是本地的還是瀏覽器的,在
observe下都預設拒絕,直到有人明確把它加進清單。 - 名字照能力命名。
observe就是「看」,desktop就是「操作桌面」,不再用「拿掉了什麼」來命名。 - 規則寫進測試,不寫在文件裡等人記得。
ProfileBoundaryTests會檢查每個 profile:只要有一個號稱比 shell 窄、卻允許任何能碰到 shell 的工具,CI 就會失敗。
它的限制也要說清楚:截圖仍會洩漏畫面上的內容。observe 保證的是「它不能動手」,不是「它什麼都看不到」。借出前,先把不想被看到的視窗關掉。
還有一點:observe 保護的是你的電腦,不是 agent。截圖會進入 agent 的 context,如果畫面上是一個惡意網頁或訊息,上面的文字就可能成為 prompt injection。它動不了你的電腦,但它在
pod 裡仍有自己的 shell、預設可連的網際網路,以及那個 session 握有的憑證(例如 git)——它可以把讀到的東西送到任何主機。
瀏覽器要另外想
owner 看得到全部 32 個瀏覽器工具,desktop 只有 15 個:導覽、讀取、點擊、填表。拿掉的包括能跑任意 JavaScript 的 browser_evaluate 和
browser_run_code_unsafe、檔案上傳與 PDF、網路監看,以及用座標操作的原始滑鼠事件。
但這收窄的是工具,不是瀏覽器本身。那個瀏覽器用的是這台電腦的持久 profile:你已登入網站的 cookie 都在,它也連得到這台電腦連得到的網路,包括 localhost 和 tailnet。
所以我該怎麼選
- 預設只給它看。大部分「幫我看一下」的需求,
observe就夠了。下一版 Connect 會把observe設為預設選項(尚未上架)。 - 要它動手,就借一台專用電腦。一台 Linux hands node、一台用完即丟的機器或 VM,不要借你正在工作的那台。選
desktop,等於在整個租期內把那台電腦桌面使用者的 shell 交出去。 owner留給你自己。那是你自己的 CLI 連到自己電腦用的。
升級須知
這次是破壞性變更。從 instance-mcp v0.7.0 起:
sandbox會被拒絕(HTTP 400),不會默默對應到其他層級。- Connect 和被借出的電腦要一起升級:舊版 Connect 送出的
sandbox會被新版電腦拒絕;新版送出的desktop或observe也會被舊版電腦拒絕。如果你的 Connect 還是舊版,先別把電腦升到 v0.7.0。 - 舊版存下的
sandbox借用,新版載入時會直接丟棄,需要重新借出。
背後只有一個原則:遇到不認得的 profile,就結束這次借用,絕不擴權成 owner。
另外,從 v0.6.7 起,借出去的電腦在 daemon 重啟後會自動接回(macOS 與 Linux),部署或當機不再需要你重新借一次。
接下來(開發中)
browser層:只有瀏覽器工具,每次借用搭配一個拋棄式瀏覽器 profile,由瀏覽器本身提供邊界。- 有型別的 app 控制:用 bundle ID allowlist 取代通用的
osascript,並排除 Terminal、Script Editor、System Settings。 - 自訂 policy:借出時附上 allow / deny 清單,同樣要通過「是否等同 shell」的檢查。
- 借出一次性的 macOS VM,而不是主機本身。
名字是介面的一部分
上一篇說,大家最先問的會是「它能碰到什麼」。當 agent 要跟你借電腦時,這個問題的答案就寫在你選的那個 profile 名字上。所以名字必須說真話:sandbox 承諾了它做不到的事,我們把它換成 desktop,並多給你一個真正只能看的選項。