所有頁面
本頁內容

OAR 會暴露什麼、不會暴露什麼

本頁把 OAR 會暴露什麼、不會暴露什麼集中在一個地方說明。每一項事實都有它主要所在的頁面;每一節最後都會連到那裡。簡單來說:中繼以你的身分行事,存取 token 就是對它的完全控制權,而你建立的少數幾種連結是刻意公開的。

信任模型 #

中繼以某個作業系統使用者的身分執行,它的 agent 也以該使用者的身分、帶著該使用者的權限執行。凡是你能在這台機器上做的事,都可以要求 agent 去做。沒有任何東西會限制 agent 的 shell。agent 可以讀取設定檔(連同其中的存取 token)、資料庫(其中有供應商金鑰和配對的中繼的 token),以及各供應商的登入檔案。存取 token 能完全控制中繼,因此也能控制它的 agent 能做的事:持有它的人就能讓 agent 在主機上執行指令。OAR 擴大了這些 agent 能觸及的範圍,但沒有加上任何沙箱。

唯一的例外是 Claude Cloud:它的 agent 在 Anthropic 的沙箱中處理 GitHub 儲存庫的複本,而不是在你的機器上工作(見什麼會離開你的機器)。

Agent 可以碰觸什麼 #

工作資料夾是 agent 工作的地方,但它不是一道牆。以下是 OAR 會強制執行和不會強制執行的事:

OAR 會強制執行 OAR 不會強制執行
workspaceRootAllowList 會限制對話可以在哪些資料夾中開始,以及可以用 Change CWD(變更工作資料夾)移到哪些資料夾。未設定時,任何現有的資料夾都允許。 沒有任何東西會把 agent 的 shell 限制在工作資料夾中。凡是中繼的使用者能讀寫的地方,它都能讀寫。
中繼模式告訴 agent 可以多自由地行動。有些供應商會強制執行其中一部分:GitHub Copilot 和 OpenAI 的 SDK 引擎在 plan 中會拒絕任何非唯讀的動作,在 ask 中會先詢問你。 Claude,以及 0.9.17 新增 DeepSeek,在所有模式中執行每個工具時都不會詢問你。Grok 的權限請求全部都會被核准。在擴充功能引擎上,OAR 不檢查任何權限。在那裡,模式只是 agent 會遵循的一項指示。
靜態預覽只能提供工作資料夾內的資料夾。 允許清單不會檢查 Default(預設)資料夾,也不會限制你能瀏覽的內容。

詳情:限制對話可以從哪裡開始、中繼模式和 Agent 與 token。

不登入也能存取的內容 #

凡是讀取或變更你的對話、檔案、設定或 agent 的東西,都需要存取 token。以下是例外:

項目 暴露什麼 如何關閉
登入頁面和靜態 App 網頁 App 和它的登入框。其中不含你的任何資料。 無法關閉。讓中繼不要連上網際網路(localhostOnly),或在它前面加上存取規則。
分享連結(/shared/…) 對話的對話紀錄,唯讀,並附上每則訊息使用的模型。中繼主機的路徑會被過濾(預設只顯示檔名),你隱藏的訊息不會送出。每次開啟都會被記錄。 在 Settings → Sharing(設定 → 分享)中按 Stop sharing(停止分享)或 Renew link(更新連結),或刪除對話。之後舊位址只會回應單純的 404。連結永遠不會過期。
預覽連結 被預覽的 dev server 或資料夾。連結中的隨機 token 是它唯一的保護。 Close(關閉)預覽,或執行 /preview close。在你設定之前,預覽通道是關閉的。預覽在中繼重新啟動後仍然存在,直到你關閉它或刪除它的對話時才會結束。

中繼前方的 Cloudflare Access 應用程式也會擋住分享連結的觀看者,除非放行 /shared/* 和 /api/shared/*,而這會刻意讓這兩個路徑公開(Cloudflare Access)。

詳情:你的分享連結、觀看者會看到什麼、預覽和哪些需要 token。

已登入的瀏覽器能存取什麼 #

持有 token 的瀏覽器可以開啟中繼上的每個對話,而且能使用檔案瀏覽器。在 Linux 和 macOS 上,磁碟機根目錄會提供中繼的使用者能讀取的任何檔案,不論是否在工作資料夾內。重新命名和刪除會在該使用者有寫入權限的任何地方生效,而且刪除不會移到垃圾桶。在 Windows 上,瀏覽器僅限於中繼列出的磁碟機。顯示 agent 圖片的媒體路由也是一樣:它會提供中繼的使用者能讀取的任何絕對路徑,但只提供給帶有 token 的請求。

詳情:檔案瀏覽器、圖片與媒體。

機密 #

機密 存放位置
存取 token config.json,純文字。中繼會讓這個檔案只有擁有者能存取。瀏覽器也持有它,作為登入 cookie。
Cloudflare tunnel token config.json(cloudflaredTunnel.token)或環境中。
OpenAI、Cursor、0.9.17 新增 DeepSeek 和 0.9.18 新增 Claude API 的金鑰 資料庫。它們絕不會傳送給瀏覽器。每個金鑰只會到達它自己供應商的 worker;DeepSeek 金鑰只會為了送往 DeepSeek 基礎 URL 而離開這台機器,Claude API 金鑰則只會送往 https://api.anthropic.com。
配對的中繼的 token 資料庫。它絕不會傳送給瀏覽器或 agent。
分享連結 token、推播金鑰 資料庫。
Claude、Grok 和 GitHub Copilot 的登入 各供應商在這台機器上自己的資料夾(~/.claude、~/.grok、Copilot CLI 的登入)。OAR 不儲存其中任何一個。DeepSeek 對話不使用其中任何一個。0.9.18 新增 Claude API 對話共用 Claude 資料夾,但以已儲存的金鑰執行,而不是用登入。
中繼環境中的 Claude 登入 token(CLAUDE_CODE_OAUTH_TOKEN) 0.9.17 新增 在每個平台上都只交給 Claude 和 Claude Cloud 的 worker。以前其他 worker 也可能拿到它。
中繼環境中的 Anthropic 金鑰或 token(ANTHROPIC_API_KEY、ANTHROPIC_AUTH_TOKEN) 0.9.17 新增 不交給任何 worker。以前每個 worker 都會拿到它,而且 Claude 對話會用它執行,而不是用 Claude 登入。0.9.18 新增 以訂閱執行的 Claude 對話,如果啟動後用的是 Claude Code 自己設定中的 API 金鑰,也會被停止;見 Claude。

agent 以和中繼相同的使用者身分執行。因此,標示「只有擁有者」的檔案模式擋不住 agent:它可以讀取 config.json、資料庫和供應商資料夾。OAR 中沒有任何東西會對它隱藏這些。中繼自己的 worker,以及 agent 用來連到中繼的工具,都從 config.json 讀取存取 token。relay_tool 絕不會把另一個中繼的 token 交給 agent:呼叫會經過你的中繼,由它加上 token。但 agent 仍然可以從資料庫讀到那個 token。資料庫的備份含有上述的金鑰和 token,所以請像對待狀態資料夾一樣,讓它保持私密。

0.9.17 新增 DeepSeek 對話的 agent 可以從它的環境中讀到 DeepSeek 金鑰。在儲存或顯示 session worker 送出的任何內容之前,中繼會把其中的金鑰替換成 [redacted],讓它不會出現在對話紀錄中,但這擋不住想拿到金鑰的 agent。見金鑰存放在哪裡。

0.9.18 新增 Claude API 對話中的 Claude API 金鑰也是如此。這種對話共用存放你 Claude 登入的 Claude 資料夾,所以中繼會固定使用已儲存的金鑰,蓋過該資料夾設定中的任何憑證,並且在 Claude Code 回報它的金鑰來自其他來源時停止該回合。Claude Code 會在回報之後片刻送出它的第一個模型請求,所以在停止之前,可能已經有一個模型請求用另一個憑證送出了:這項檢查會把錯誤的憑證限制在那一個模型請求,但無法防止它。見 Claude API → 安全性。

0.9.18 新增 在 DeepSeek 和 Claude API 對話中(它們以中繼持有的金鑰執行),Claude Code 啟動時會關閉所有 hook 和狀態列,包括你的和對話資料夾的,讓它們無法在環境中帶著金鑰執行。受管理設定中的 hook 仍會執行。以你的 Claude 登入執行的對話則保留它們。

0.9.17 新增 從 Claude Code session 內部(例如 agent 的 shell)啟動的中繼,不再把該 session 的變數(其中包括它的 session id、訊息 socket 和 token)交給它的 worker。見從 Claude Code 內部啟動的中繼。

詳情:機密存放在哪裡、哪些變數會傳到 agent 的 worker。

中繼之間 #

配對可能會交出一個 token:如果另一個中繼需要不同的 token 才能回頭呼叫你的中繼,介紹時就會帶上你的 token,而移除配對並不會撤銷它。Agents may(agent 可以)等級有 Read only(唯讀)、Read and prompt(讀取並傳送提示)和 Full(完整存取),新的配對從 Full 開始。這個等級和 Accept prompts from other relays' agents(接受其他中繼 agent 的提示)限制的是 agent 透過工具能做的事,而不是 token 持有者直接能做的事。配對的中繼在對話中會保持鎖定,直到你提及它。跨過兩個中繼的提示不會再傳給第三個,而且在沒有你的訊息的情況下累積 30 個提示後,下一個提示會以卡片詢問你。

詳情:遠端中繼與配對。

同一個中繼上的 agent 之間 #

Agent session 預設為關閉。開啟後,agent 在一個對話中啟動第一個 session 之前必須先詢問你,它的 session 同時最多只能有 4 個在工作,而且由 agent 啟動的 session 本身不能再啟動 session。在 ask 和 plan 模式中,每個寫入動作都會先詢問。

請用按鈕回答核准卡片。在 OAR 自己的核准卡片上,只有 Allow 這個字(不分大小寫)才會核准。你輸入的任何其他文字都會拒絕,而且 agent 不會從中得到任何理由。

詳情:Agent session 和核准卡片。

網路 #

  • 誰能連線。 localhostOnly 預設為 true,會把中繼綁定到 127.0.0.1。其他任何值都會綁定所有介面,而且中繼不會檢查請求來自哪裡。區域網路存取是純 http,所以 token 會以未加密的方式經過你的網路(誰能連線)。
  • Tunnel。 在你的網路之外,請透過 tunnel 或 proxy 使用 HTTPS:SSH tunnel、Cloudflare Tunnel、反向 proxy。
  • 登入。 0.9.11 新增 一分鐘內來自同一個位址的十個錯誤 token,會把該位址鎖在外面,直到這一分鐘結束(429),而且這次拒絕會被記錄。來自中繼本機、且沒有經過任何轉送的請求永遠不會被鎖住。鎖定能減慢猜測;真正的保護仍是一個夠長的隨機 token。cookie 是 HttpOnly,有效期 30 天(登入的防護)。
  • 位址中的 token。 ?token= 只對頁面位址有效;頁面會以標頭登入,並把它從位址中移除。那第一個位址仍可能留在瀏覽器歷史記錄中,以及 proxy 或 tunnel 的記錄中(出示 token 的方式)。
  • 即時連線。 0.9.11 新增 它只接受來自中繼自己來源的瀏覽器,所以其他網站上的頁面無法搭你登入 cookie 的便車連進來。在會改寫 Host 標頭的 proxy 後面,請把公開的來源列在 allowedOrigins 中。
  • 轉送標頭。 0.9.11 新增 X-Forwarded-For、X-Forwarded-Host、X-Forwarded-Proto 和 X-Real-IP 只有來自中繼透過 trustProxy 信任的 proxy 時才算數,預設是迴路位址上的 proxy。用戶端位址(鎖定、速率限制、分享存取紀錄)以及新分享連結的主機和協定,都是透過它讀取的,所以直接連線的用戶端無法自己選擇它們。
  • 重新啟動和清空佇列。 重新啟動、取消重新啟動和 Empty queue(清空佇列)只需要 token,可以從任何裝置執行。如果遠端使用者不得使用它們,請在 proxy 上拒絕這些請求(只有中繼所在機器能使用的端點)。
  • Session worker 路徑保護。 你的 agent 的 worker 使用的路徑,以及影像操作的執行,只回應來自迴路位址、且請求中不帶 tunnel 標記(cf-ray,或 tunnelMarkerHeaders 中的某個標頭),也不帶 X-Forwarded-For、Forwarded 或 X-Real-IP 的對端。不加上任何這些標頭的轉送者,例如 SSH 反向 tunnel,看起來就像本機;這時只有 token 在保護這個路徑(路徑保護)。
  • Cloudflare tunnel token。 它是透過指令列傳給 cloudflared 的,所以這台機器上的其他使用者可以在處理程序清單中看到它(Cloudflare Tunnel)。
  • SSH tunnel 清理。 autoReclaimPort(預設開啟)會結束你的 SSH 登入中佔用遠端連接埠的處理程序;reclaimStaleSshSessions 還會結束你在那裡閒置的 SSH session(遠端連接埠被佔用)。

什麼會離開你的機器 #

OAR 沒有遙測。中繼不會把任何用量資料傳給 OAR 或其他任何人。它只會連絡以下這些主機,而且只為了以下這些原因:

  • oar.sh,僅在你選擇加入時。 Settings → General(設定 → 一般)中的 Check for updates automatically(自動檢查更新)預設為關閉。開啟後,中繼會立即向 https://oar.sh/latest.json 查詢,之後在每次啟動時,以及大約每 12 小時查詢一次。請求是一個單純的 GET,帶有 Accept: application/json,在有過回應之後還會帶上 If-None-Match。它不帶任何版本、token、帳戶或機器資訊。Check for updates(檢查更新)按鈕和不帶 --to 的 oar update 讀取的是同一個檔案。中繼環境中的 OAR_NO_UPDATE_CHECK=1 會停止這一切。見更新檢查。
  • npm,在你更新時。 npm install -g 會和 npm registry 通訊。
  • 每個供應商,每個回合。 你的訊息,以及 agent 為了任務讀取的任何內容,都會送到對話背後的供應商:GitHub Copilot、OpenAI(或你設定的基礎 URL)、Claude、Claude API、Cursor、Grok 或 DeepSeek(或你設定的基礎 URL)。適用的是它們的條款,而不是 OAR 的。
  • DeepSeek。 0.9.17 新增 中繼會把 DeepSeek 金鑰送到 https://api.deepseek.com,或送到 Settings → Providers → DeepSeek(設定 → 供應商 → DeepSeek)中 Advanced(進階)下設定的基礎 URL(https,或僅限同一台機器上的 http),不會送到其他主機:用途是在你儲存金鑰或基礎 URL、或在 🤗 Select Models(選擇模型)中重新整理清單時列出模型,以及讀取餘額(見下文)。DeepSeek 對話的 Claude Code 會把它的回合送到該位址下的 /anthropic,並帶著和任何 Claude Code 對話相同的 session 上下文。OAR 會關閉 Claude Code 自己連往 Anthropic 的流量(更新、遙測)。見 DeepSeek。
  • Claude API。 0.9.18 新增 中繼會把 Claude API 金鑰送到 https://api.anthropic.com,不會送到其他主機:用途是在你儲存金鑰、開啟 Claude API 或重新整理清單時,列出該金鑰可用的模型。Claude API 對話的 Claude Code 會帶著金鑰把它的回合送到那裡。見 Claude API。
  • Claude Cloud。 agent 在 Anthropic 執行,處理你儲存庫的複本。中繼會把 Claude 登入 token 送到 https://api.anthropic.com,不會送到其他主機。見 Claude Cloud。
  • 方案用量,在你開啟 Check Usage(檢查用量)時。 中繼會用它在這台機器上找到的登入讀取你的帳戶:GitHub(api.github.com,使用 GH_TOKEN、GITHUB_TOKEN 或 gh 的登入)、Grok(cli-chat-proxy.grok.com,使用 Grok CLI 的登入)、Anthropic(開啟 Claude Cloud 時)、0.9.17 新增 DeepSeek(餘額,在 DeepSeek 啟用期間以已儲存的金鑰向 DeepSeek 基礎 URL 讀取),以及只有在你輸入了儀表板 session token 時才會連絡的 cursor.com。見 Check Usage。
  • GitHub Actions。 為了休眠檢查,中繼會對你的工作資料夾所在的儲存庫執行 gh run list(主機休眠)。
  • 配對的中繼。 agent 透過 relay_tool 送出的內容,會帶著該中繼的 token 送到它的位址(遠端中繼)。
  • 供應商安裝程式,在你確認時。 Claude 或 Grok 的 Install(安裝)會以中繼的使用者身分執行供應商自己的安裝腳本(claude.ai、x.ai)(Claude、Grok)。
  • 推播通知。 它們會經過你瀏覽器廠商的推播服務,而且除非你另作選擇,內容都是通用文字(通知會顯示什麼)。

是你的瀏覽器,而不是中繼,在每次開啟 App 時從 cdn.jsdelivr.net(Markdown、數學、終端機)和 cdnjs.cloudflare.com(語法標示)載入 Markdown、數學和語法標示函式庫。tmux session 的終端機檢視在 cdn.jsdelivr.net 失敗時,會從 unpkg.com 載入它的終端機函式庫。這些主機會看到每個開啟 App 的瀏覽器的請求。見圖片、媒體與公式。

記錄 #

中繼會把它的主控台輸出複製到狀態資料夾中的 logs/relay-console.log,每一行都附有時間戳記。檔案達到 5 MB 時會輪替,並保留三個較舊的檔案。寫入一行之前,中繼會把你的存取 token,以及 ?token= 或 &token= 之後的任何值,替換成 [token]。OAR_NO_CONSOLE_LOG=1 會關閉這個檔案。單一個錯誤 token 不會被記錄;被鎖住的位址則會,以一行開頭為 [auth] 的記錄。預覽以一個短雜湊命名,絕不會用它的 token。分享的讀取會連同觀看者的位址一起記錄,或在 Store viewer IP addresses(儲存觀看者的 IP 位址)關閉時記為 not stored。

worker 記錄(worker-<session>.log)存放每個 session worker 的輸出,由 worker 自己寫入,不經過上述的遮蔽。已刪除對話的檔案會保留下來。中繼前方的反向 proxy 或 tunnel 會保留它自己的記錄,其中可能含有帶 ?token= 的位址,而受管理的 Cloudflare tunnel 會把它的 token 顯示為 <redacted>。請把所有記錄都視為私密,並在貼到任何地方之前先讀過。

詳情:記錄。

在暴露中繼之前 #

  1. 讓 token 保持隨機,也不要放進你分享的位址中。如果它外洩了,請執行 oar setup --new-token,這會把每台裝置登出,並把配對的中繼擋在外面。
  2. 透過 HTTPS 連到中繼:使用 tunnel 或反向 proxy。當 proxy 或 tunnel 在同一台機器上執行時,讓 localhostOnly 保持開啟。
  3. 在另一台機器上的 proxy 後面時,把 trustProxy 設為該 proxy,如果它會改寫 Host,也要設定 allowedOrigins(另一台機器上的 proxy)。完全不加任何標頭的轉送者,需要在 tunnelMarkerHeaders 中設定一個標記標頭。如果遠端使用者不得重新啟動中繼,請讓 proxy 拒絕這些端點。
  4. 以一個你願意把它的權限、檔案和登入交給 agent 的使用者身分執行中繼。如果對話只應在某些資料夾中開始,請設定 workspaceRootAllowList,並記得它不會限制 shell。
  5. 只有在用 Preview as shared(預覽分享後的樣子)讀過對話之後才分享它,並隱藏不該出現的內容。在自由文字中,路徑過濾只能盡力而為。在 Settings → Sharing 中停止你不再需要的連結。
  6. 只為你可以給任何持有連結的人看的東西發布預覽,用完就關閉它。它在中繼重新啟動後仍會存在。
  7. 除非需要,否則讓 agent session 保持關閉。對於配對的中繼,請刻意選擇 Agents may 等級,並在不需要的地方關閉 Accept prompts from other relays' agents。
  8. 點選核准卡片上的按鈕。
  9. 如果你完全不想和 oar.sh 有任何連絡,請設定 OAR_NO_UPDATE_CHECK=1。