Skip to content
On this page

安全 ​

這座橋接對你的瀏覽器承諾什麼、每項承諾由什麼把守, 以及承諾止於何處。機制細節與每一項已接受的殘餘風險在信任邊界帳冊; 每個工具能觸及什麼在工具風險矩陣。

一句話說清標準線 ​

你安裝的程式無法在你毫無察覺的情況下使用你的瀏覽器。

這條標準線不是「任何東西都永遠碰不到你的瀏覽器」。你安裝這個橋接, 就是為了讓代理程式操作你的瀏覽器。這條標準線是專案對自己的要求, 而不是宣稱今天已經處處達標。

有一處刻意未達標。在已核准的來源 (origin) 上, 包含遮罩後的 Cookie 與儲存空間在內的讀取操作不會逐次提示, 而分頁標題與 URL 則完全不需核准即可讀取。我們刻意止步之處點出讀者最先會遇到的缺口; 帳冊承載每一項殘餘風險。

利害所在, 以及誰受信任 ​

資產:

  • 你已驗證的瀏覽器工作階段: Cookie (包含 httpOnly) 與網頁儲存空間中的權杖。誰拿到它們, 誰就能在你已登入的網站上以你的身分行事, 繞過你已經輸入過的密碼與第二因素。
  • 你看得到的頁面內容。
  • 以你的身分行事的能力: 點擊、填入、導覽、執行程式碼。
  • 線路協定: 一條損壞的串流可以讓橋接卡住或當機。
參與者受信任?說明
你是擁有這台機器與瀏覽器設定檔
MCP 用戶端 (Claude Code、Codex 等)是, 依設計如此, 配對之後由你設定; 由它驅動工具
Rust 執行檔 (MCP 伺服器與原生訊息主機)是我們要保護的對象
MV3 擴充功能是與不受信任的頁面程式碼並肩執行
網頁否可能受攻擊者控制; 可能帶有提示注入
其他本機使用者與程序否可能嘗試觸及橋接 socket
網路不在範圍內沒有遠端攻擊面; 一切都在 localhost 或 stdio 上

模型所依賴的三條假設:

  • 單一使用者的機器。 沒有敵意的本機使用者與你共用 UID。其他使用者與其他同一使用者的執行檔會被拒絕; 執行這個執行檔的同一使用者攻擊者則不會 (見非目標)。
  • MCP 用戶端是受信任的。 你自己安裝的惡意用戶端已經擁有你授予它的一切。這些工具存在的目的就是被該用戶端驅動。
  • Chrome 的沙箱與擴充功能模型成立。 橋接依賴 MV3 在內容指令碼與頁面 JS 之間的隔離, 以及 Chrome 對主機權限的強制執行。

不要成為最廉價的那扇門 ​

在每個作業系統上, 直接竊取 Cookie 都已經要讓攻擊者付出一些代價。一個任何本機程式都能免費觸及的橋接, 代價比那還低, 而攻擊者總是挑最廉價的那扇門。

平台直接讀取 Cookie 儲存區低門檻的 localhost 橋接
macOSCookie 金鑰存放在登入鑰匙圈中; 其他 app 讀取它會觸發鑰匙圈提示, 除非使用者先前已允許該 app無聲無息
Windows應用程式繫結加密: 由 SYSTEM 權限的服務只把金鑰釋出給瀏覽器本身, 因此同一使用者的程序需要 SYSTEM 權限或對瀏覽器進行程式碼注入無聲無息
Linux金鑰存放在工作階段的秘密儲存區, 或一個固定的備援值; 在已解鎖的工作階段中, 同一使用者的程序讀取它不會有任何提示無聲無息

左欄描述的是瀏覽器廠商公開的保護措施。那是關於其他軟體的陳述, 不是本專案測試過的事。

結論: 一個無聲的橋接會拉低這台機器原本就有的門檻。在門檻原本就低的地方 (例如 Linux), 橋接至少不能再多添一扇免費的門。

誰在攻擊, 各由什麼應對 ​

依本專案對真實世界發生頻率的判斷排序, 不是量測結果: 代理程式正在讀取的頁面排第一, 你安裝的、不是已配對用戶端程式 (harness) 的軟體排第二, 已經以你的身分執行的持續性惡意軟體排第三。第三類依設計不在範圍內; 橋接只是拒絕讓它的工作變得更容易。

威脅由什麼應對詳情
頁面誘導代理程式在未經核准下對它操作頁面層級的工具只在你核准過的來源上執行; 新的來源會提示你並請求主機權限; 頁面無法把自己加進去邊界 4
提示注入: 頁面內容誘騙模型發出危險的工具呼叫對代理程式而言, 頁面內容是資料, 不是命令; 危險動作在頁面觸及不到的視窗上確認, page_eval 每次呼叫都確認並顯示完整程式碼你要確認什麼
憑證或權杖外洩Cookie 與儲存空間唯讀、限於允許清單範圍, 並在離開擴充功能之前遮罩; page_text 會遮罩密碼與類似卡號的數字工具風險矩陣
另一個本機程序劫持橋接每條連線都要通過同一使用者檢查、相互的執行檔證明 (平台表 擁有每個作業系統量測什麼這一事實), 以及一次 HMAC 挑戰回應, 其每次執行的秘密從不經過線路邊界 2
格式錯誤或過大的訊息讓橋接當機或損壞經長度檢查的訊框格式、讓 panic 遠離協定串流的 panic hook、回報而非致命的解析錯誤、經模糊測試的解析器邊界 3
無聲配對: 能寫入 MCP 用戶端設定的程序在無人察覺下架起整條鏈兩個由你執行的儀式: pair 在終端機輸入確認之後鑄造主機金鑰, 瀏覽器登記一個 WebAuthn 憑證; 之後每一次授予都需要在場證明邊界 3
已撤銷的用戶端或主機繼續行動, 因為撤銷沒有到達強制執行點一份信任記錄, 在每個強制執行點連同其紀元一起重新讀取。被撤銷用戶端的中繼被丟棄, 其下一個請求與重新接入被拒絕; 被撤銷的主機金鑰被推送給擴充功能, 擴充功能把其固定金鑰標記為已遭入侵, 並關閉自己的請求閘門, 直到使用者重新配對邊界 1

四個跳點, 以及各由什麼把守 ​

text
MCP client --(1)-> Rust MCP server --(2)-> native host --(3)-> extension --(4)-> web page
   (trusted)         (trusted)           (trusted)         (trusted)        (UNTRUSTED)
跳點誰可以跨越由什麼把守
1. MCP 用戶端到 MCP 伺服器, 經 stdio產生伺服器的用戶端程式, 配對之後伺服器證明產生它的程序, 並與已配對的用戶端比對; 不符、無法量測, 或記錄無法讀取, 一律失敗即關閉
2. MCP 伺服器到原生訊息主機, 經橋接 socket這個執行檔、由這個使用者執行、且持有執行秘密沒有監聽埠; 核心的對端 UID 檢查; 相互的執行檔證明; HMAC 挑戰回應; 宣告角色的接入訊框
3. 瀏覽器到原生訊息主機, 經 native messaging資訊清單只允許我們的擴充功能; 擴充功能只接受使用者配對過的主機, 以其固定金鑰為準資訊清單固定擴充功能 id; 擴充功能固定主機的 P-256 金鑰; 授予能力的動作需要由主機驗證的在場證明: 一次 WebAuthn 斷言, 或在規則不容許任何憑證作答時的確認視窗
4. 擴充功能到網頁頁面要求的任何東西都不行來源允許清單; 在頁面 DOM 之外的視窗上確認; 出站遮罩; 信任狀態存放在頁面無法讀取的儲存空間

一份記錄把各跳點串在一起: 執行階段目錄中的 trust.json 保存已配對的用戶端、緊急開關 (kill switch) 閂鎖, 以及各瀏覽器已登記的憑證, 每個強制執行點都以失敗即關閉的方式讀取它。帳冊中的信任記錄負責它。

你要確認什麼, 以及什麼算在場 ​

確認視窗。 送出與連結點擊、page_press、page_select、page_eval、tab_close 與 page_upload 都在一個擴充功能擁有、在自己程序中執行的視窗上確認, 頁面無法讀取、聚焦、覆蓋、自動點擊或自動關閉它。逾時、視窗被關閉, 或缺少提供者, 都視為拒絕。

  • 每一次 page_eval 與 page_upload 呼叫都重新確認。 每種確認顯示什麼、寬限期多長, 由失敗即安全的預設值負責。
  • 一次已核准的點擊涵蓋後續重複, 以該寬限期的每分頁鍵為準。page_eval 永遠不在其中。
  • 低風險工具不經提示即執行, 只要在已核准的來源上: 導覽、page_text、tab_list、遮罩後的 Cookie 與儲存空間讀取。

在場。 移除能力沒有任何阻力: kill、revoke 與 uninstall 不需要證明, 因為失敗即關閉就是安全狀態。授予或恢復能力則需要一次「有人在場」的證明, 且恰好被一個動作消耗:

介面證明它阻止什麼
擴充功能, 在有已登記憑證的瀏覽器上在瀏覽器認證器上的一次 WebAuthn 觸碰 (平台生物辨識、PIN 或安全金鑰), 由主機對照該瀏覽器下登記的憑證驗證任何不是由該已登記憑證簽署的回答; 這個手勢本身證明了什麼, 是認證器的事, 見帳冊中的硬體殘餘風險
擴充功能, 在規則不容許任何憑證的地方: 瀏覽器自己的動作沒有可用憑證, 登記時機器上沒有任何憑證在確認視窗上的一次點擊, 標示為軟體確認無聲與指令碼化的動作, 而非敵意的同一使用者程序
CLI (pair、pair-client、unkill、policy set)在真實終端機上輸入的一句話; 以管道導入的 stdin 在任何提示之前即被拒絕指令碼化、管道化與意外的授予, 而非一個配置了 pty 的同一使用者程序

已登記的瀏覽器永遠不會被降級到視窗。閘門之後的動作, 以及各由誰作答:

  • 解除緊急開關: 該瀏覽器自己的憑證;
  • 登記另一個瀏覽器: 任一已登記憑證;
  • 策略的 presenceConfirm 開啟時的 page_eval 與 page_upload: 該瀏覽器自己的憑證, 請求指名該操作與頁面的來源;
  • 鑄造主機金鑰: CLI 的終端機;
  • 配對用戶端與放寬策略 (一次 policy set、一次放寬的回復, 或第一個基準): 從選項頁面出發用該瀏覽器自己的憑證, 在該瀏覽器未登記任何憑證時用視窗, 或用 CLI 的終端機。policy set 無論其編輯朝哪個方向都要求這一證明。收緊只有走下文的限制通道才免於證明。

兩條策略通道。 授予通道 (policy set、放寬的回復、選項頁面上的放寬) 在上述在場證明之後由主機金鑰簽署。限制通道 (policy restrict、只收緊的回復、選項頁面上的收緊) 以未簽署形式自由傳送, 因為偽造的限制只能移除能力。命令由 CLI 頁面負責; 放寬每道閘門的代價由預設值表格負責。

我們刻意止步之處 ​

下面每一個缺口都是刻意接受的。它連結到的帳冊條目說明了什麼限制了它。

  • 已核准網站上不逐次提示讀取。 幾乎每一步都提示, 會教你習慣性地點掉那些守護危險動作的提示。擁有者: 讀取外洩。
  • 已核准網站上的點擊寬限期。 這是上文寬限期的代價: 無關的同源程式碼可以在其持續期間搭一次核准的便車。擁有者: 預設值表格。
  • 接受同一使用者重新執行我們自己的執行檔。 證明拒絕的是不同的程式, 而不是由同一使用者的攻擊者啟動的正版執行檔。擁有者: 邊界 2。
  • 已遭入侵的已配對用戶端程式保有其已准入的身分。 證明識別的是執行檔, 不是意圖, 所以一個轉為敵意的已配對用戶端在被撤銷之前仍然受信任。擁有者: 邊界 1。
  • 軟體下限是明確標示的, 不是隱藏的。 未登記瀏覽器的視窗與 CLI 的終端機證明的是在受信任介面上的意圖, 而非硬體, 每一次經稽核的授予都記錄授權它的路徑, pair 的也包括在內。擁有者: 邊界 3。
  • 從認證器上刪除的憑證仍保持登記。 主機永遠不會得知某個認證器或作業系統的密碼金鑰存放區丟棄了一個憑證, 所以該瀏覽器會一直拒絕視窗, 並失去其以在場為閘門的動作, 直到 revoke <browser> 忘記這次登記。擁有者: 邊界 3。

標準線今天在各系統上的落實 ​

在每個作業系統上, 用戶端程式准入都只在第一個用戶端配對之後才強制執行; 在那之前, 伺服器為任何產生它的程式提供服務, 並在每次啟動時以 ERROR 等級記錄這個態勢。

作業系統用戶端證明使用者在場策略授予通道標準線守在哪裡
macOS產生伺服器的用戶端程式的程式碼身分, 對照已配對的用戶端檢查已登記瀏覽器上的瀏覽器認證器; 否則為視窗; CLI 用終端機pair 把主機金鑰鑄造進鑰匙圈, 所以來自任一介面的授予都在這裡簽署橋接只准入這個執行檔、由這個使用者執行、且持有執行秘密
Linux產生伺服器的用戶端程式的映像雜湊, 對照已配對的用戶端檢查同一套階梯pair 把金鑰鑄造進 Secret Service, 或用 --file-store 鑄造進 0600 檔案以同樣的閘門守住
Windows產生伺服器的用戶端程式的映像雜湊與 Authenticode 發行者, 對照已配對的用戶端檢查; 配對見 CLI 頁面同一套階梯pair 把金鑰鑄造進認證管理員只有這個使用者能開啟的具名管道、相互的映像證明、執行秘密

授予通道需要一把主機金鑰, 而 pair 在每個作業系統上都會鑄造一把, 所以經簽署的策略基準在三者上都可用。那一列背後的 Windows 殘餘風險在邊界 2; 安全策略中的平台表格負責各機制的狀態。

對照便利優先的設計流派 ​

瀏覽器自動化常見的一種設計把便利放在第一位。左欄以界定該流派的各項選擇來描述它; 瀏覽器對此的反應是關於其他軟體的陳述, 該欄不點名任何產品。

比較點便利優先的設計流派本專案
誰能觸及橋接一個對任何本機程序開放的 localhost 連接埠只有這個執行檔、由這個使用者執行、且持有執行秘密
偵錯連接埠與其橫幅一個隨時對任何本機程序開放的偵錯連接埠; 瀏覽器的偵錯橫幅只在有用戶端附加時顯示沒有偵錯連接埠; 橫幅只在由偵錯工具支援的工具或選擇加入的 CDP 模式持有附加時顯示 (矩陣標示了哪些工具)
預設存取從第一次呼叫起就能完整存取每個網站頁面操作與讀取只在你核准過的網站上執行, 分頁標題與 URL 除外; 風險最高的工具在主機持有的策略下預設關閉
逐動作確認無需要確認的動作在頁面觸及不到的視窗上確認; page_eval 與 page_upload 每次呼叫都重新確認; 放寬任何閘門都是一次經簽署、以在場為閘門的策略變更
本機惡意軟體宣告不在範圍內, 且什麼都不做同樣不在範圍內, 但橋接拒絕成為最廉價的那扇門: 不同的同一使用者程式會在 socket 處被拒絕, 而一旦有一個用戶端配對, 每個用戶端程式都必須符合允許清單

明確的非目標 ​

  • 已遭入侵的作業系統帳戶, 或執行這個執行檔的同一使用者攻擊者: 與合法主機逐位元組相同, 所以雜湊與程式碼簽章都無法區分它們。
  • 你自己設定的惡意 MCP 用戶端。
  • 多使用者或共用機器的隔離。
  • 遠端攻擊者: 沒有遠端攻擊面。

變更, 或回報 ​

任何移動了上述內容的變更都是安全相關變更, 要經過審查標準, 並指出它移動了本頁的哪一列。疑似的邊界突破走回報管道, 絕不開公開的 issue。

Built from main at 25ae5f4Source: docs/zh-tw/security.md