開發筆記

Agent 要跟我借電腦,我該給它多少權限?

上一篇〈終端信任光譜〉的結尾說:在 agent 真正被放出去亂跑的那天,大家最先問的是——它能碰到什麼。這篇回答同一個問題的另一面:當 agent 要跟你借電腦時,你該給它多少權限。

OpenAB Connect 的 agent 跑在遠端沙箱裡,本來碰不到你的電腦。但有時你會想讓它碰:看一下你的螢幕哪裡出錯、在瀏覽器裡幫你填一張表、在 Mac 上跑一次 Xcode build。這時你透過 Connect 或 Remote 把電腦借給它,選好借多久,再選一個 profile,決定它拿到什麼。

直覺的答案是錯的

最直覺的想法是:「不讓它執行指令就安全了。」讓它看、讓它點、讓它打字,但不給 shell。

問題是,能操作桌面,就等於有 shell:

想靠過濾 AppleScript 的內容來擋,也擋不住:JXA 的 doShellScript、 ObjC.import 呼叫 NSTask、Terminal 的 do script、System Events 送出的按鍵,路太多了。所以「不給執行指令」只是少一個方便的入口,並沒有少任何權限。

我們自己就踩過

直到最近,除了給你自己用的 owner,借出電腦時的另一個選項叫 sandbox:跟 owner 一樣,只是拿掉了 exec。

這個名字說錯了。它不是沙箱,它等同 shell。一個叫 sandbox、實際上交出 shell 的選項,比沒有這個選項更糟,因為它讓人以為可以放心借出。所以我們把它拿掉了:sandbox 改名為 desktop,照它實際能做的事命名;另外新增 observe,一個真正的邊界(#45)。

三個選項,你交出去的分別是什麼

三種 profile 的對照圖:Observe 只看,只有系統資訊與截圖,是唯一的安全邊界;Desktop 可以操作滑鼠、鍵盤、AppleScript 與 15 個瀏覽器工具,但等同 shell,不是安全邊界;Owner 擁有全部工具,包括 shell 與完整瀏覽器,留給你自己的 CLI。底部對照表的最後一列:等同 shell?否、是、是
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。它不能打字、點擊、執行指令,也不能改變任何狀態。它能成為邊界,靠的是三件事:

它的限制也要說清楚:截圖仍會洩漏畫面上的內容。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。

所以我該怎麼選

升級須知

這次是破壞性變更。從 instance-mcp v0.7.0 起:

背後只有一個原則:遇到不認得的 profile,就結束這次借用,絕不擴權成 owner。

另外,從 v0.6.7 起,借出去的電腦在 daemon 重啟後會自動接回(macOS 與 Linux),部署或當機不再需要你重新借一次。

接下來(開發中)

名字是介面的一部分

上一篇說,大家最先問的會是「它能碰到什麼」。當 agent 要跟你借電腦時,這個問題的答案就寫在你選的那個 profile 名字上。所以名字必須說真話:sandbox 承諾了它做不到的事,我們把它換成 desktop,並多給你一個真正只能看的選項。