跳轉到主要內容

Documentation Index

Fetch the complete documentation index at: https://docs2.openclaw.ai/llms.txt

Use this file to discover all available pages before exploring further.

個人助理信任模型。 本指引假設每個 Gateway 有一個受信任的 操作者邊界(單一使用者、個人助理模型)。 OpenClaw 不是 供多個 對抗性使用者共用一個代理或 Gateway 的敵對多租戶安全邊界。若你需要混合信任或 對抗性使用者操作,請拆分信任邊界(獨立 Gateway + 憑證,理想情況下使用獨立的 OS 使用者或主機)。

範圍優先:個人助理安全模型

OpenClaw 安全指引假設採用 個人助理 部署:一個受信任的操作者邊界,可能包含多個代理。
  • 支援的安全態勢:每個 Gateway 一個使用者/信任邊界(建議每個邊界使用一個 OS 使用者/主機/VPS)。
  • 不支援作為安全邊界:由彼此不信任或具對抗性的使用者共用一個 Gateway/代理。
  • 如果需要對抗性使用者隔離,請依信任邊界拆分(獨立 Gateway + 憑證,理想情況下使用獨立的 OS 使用者/主機)。
  • 如果多個不受信任的使用者可以向同一個已啟用工具的代理傳訊息,請將他們視為共用該代理相同的委派工具權限。
本頁說明如何在該模型內強化安全。它並不宣稱在單一共用 Gateway 上提供敵對多租戶隔離。

快速檢查:openclaw security audit

另請參閱:Formal Verification(安全模型) 定期執行此命令(特別是在變更設定或暴露網路表面之後):
openclaw security audit
openclaw security audit --deep
openclaw security audit --fix
openclaw security audit --json
security audit --fix 會刻意保持狹窄範圍:它會將常見的開放群組 政策切換為允許清單,還原 logging.redactSensitive: "tools",收緊 狀態/設定/包含檔案權限,並在 Windows 上執行時使用 Windows ACL 重設,而不是 POSIX chmod 它會標記常見陷阱(Gateway 驗證暴露、瀏覽器控制暴露、提高權限的允許清單、檔案系統權限、寬鬆的 exec 核准,以及開放頻道工具暴露)。 OpenClaw 既是產品,也是一項實驗:你正在把前沿模型行為接入真實訊息表面與真實工具。不存在「完美安全」的設定。 目標是刻意思考:
  • 誰可以和你的機器人對話
  • 機器人被允許在哪裡行動
  • 機器人可以觸及什麼
從仍能運作的最小存取開始,然後隨著信心增加再擴大。

部署與主機信任

OpenClaw 假設主機與設定邊界是受信任的:
  • 如果某人可以修改 Gateway 主機狀態/設定(~/.openclaw,包括 openclaw.json),請將他們視為受信任的操作者。
  • 不建議讓多個彼此不信任/對抗性的操作者共用一個 Gateway。
  • 對於混合信任團隊,請使用獨立 Gateway 拆分信任邊界(或至少使用獨立 OS 使用者/主機)。
  • 建議預設值:每台機器/主機(或 VPS)一位使用者,該使用者使用一個 Gateway,且該 Gateway 中有一個或多個代理。
  • 在同一個 Gateway 執行個體內,已驗證的操作者存取是受信任的控制平面角色,不是每位使用者的租戶角色。
  • 工作階段識別碼(sessionKey、工作階段 ID、標籤)是路由選擇器,不是授權權杖。
  • 如果多人可以向同一個已啟用工具的代理傳訊息,他們每個人都可以操控同一組權限。每位使用者的工作階段/記憶體隔離有助於隱私,但不會把共用代理轉換成每位使用者的主機授權。

安全檔案操作

OpenClaw 使用 @openclaw/fs-safe 進行根目錄限定的檔案存取、原子寫入、封存解壓縮、暫存工作區,以及祕密檔案輔助功能。OpenClaw 預設將 fs-safe 的選用 POSIX Python 輔助程式設為關閉;只有在你想要額外的 fd-relative 變更強化,且能支援 Python 執行階段時,才設定 OPENCLAW_FS_SAFE_PYTHON_MODE=autorequire 詳細資料:安全檔案操作

共用 Slack 工作區:真實風險

如果「Slack 中的所有人都可以向機器人傳訊息」,核心風險就是委派工具權限:
  • 任何允許的寄件者都可以在代理的政策內誘發工具呼叫(exec、瀏覽器、網路/檔案工具);
  • 來自某個寄件者的提示/內容注入可能造成影響共用狀態、裝置或輸出的動作;
  • 如果某個共用代理擁有敏感憑證/檔案,任何允許的寄件者都可能透過工具使用來驅動外洩。
對團隊工作流程使用具最小工具集的獨立代理/Gateway;將個人資料代理保持私密。

公司共用代理:可接受模式

當使用該代理的所有人都在同一個信任邊界內(例如同一個公司團隊),且代理嚴格限定於業務範圍時,這是可接受的。
  • 在專用機器/VM/容器上執行它;
  • 為該執行階段使用專用 OS 使用者 + 專用瀏覽器/設定檔/帳戶;
  • 不要讓該執行階段登入個人 Apple/Google 帳戶或個人密碼管理器/瀏覽器設定檔。
如果你在同一個執行階段混用個人與公司身分,就會破壞隔離並增加個人資料暴露風險。

Gateway 與 Node 信任概念

將 Gateway 和 Node 視為同一個操作者信任網域,但角色不同:
  • Gateway 是控制平面與政策表面(gateway.auth、工具政策、路由)。
  • Node 是配對到該 Gateway 的遠端執行表面(命令、裝置動作、主機本機能力)。
  • 通過 Gateway 驗證的呼叫者在 Gateway 範圍內受信任。配對後,Node 動作會被視為該 Node 上的受信任操作者動作。
  • 操作者範圍等級與核准時檢查摘要於 操作者範圍
  • 使用共用 Gateway 權杖/密碼驗證的直接 local loopback 後端用戶端,可以在不呈現使用者 裝置身分的情況下進行內部控制平面 RPC。這不是遠端或瀏覽器配對繞過:網路 用戶端、Node 用戶端、裝置權杖用戶端,以及明確裝置身分 仍然會經過配對與範圍升級強制執行。
  • sessionKey 是路由/內容選擇,不是每位使用者的驗證。
  • Exec 核准(允許清單 + 詢問)是操作者意圖的防護欄,不是敵對多租戶隔離。
  • OpenClaw 對受信任單一操作者設定的產品預設值是,允許在 gateway/node 上的主機 exec,而不顯示核准提示(security="full"ask="off",除非你收緊它)。該預設是有意的使用者體驗,不是其本身的漏洞。
  • Exec 核准會綁定精確的請求內容與盡力而為的直接本機檔案運算元;它們不會語義化模擬每個執行階段/直譯器載入器路徑。若需要強邊界,請使用沙箱化與主機隔離。
如果你需要敵對使用者隔離,請依 OS 使用者/主機拆分信任邊界,並執行獨立 Gateway。

信任邊界矩陣

在分流風險時,請將此作為快速模型:
邊界或控制項意義常見誤解
gateway.auth(權杖/密碼/受信任代理/裝置驗證)驗證 Gateway API 的呼叫者「為了安全,每個框架都需要每則訊息簽章」
sessionKey內容/工作階段選擇的路由鍵「工作階段金鑰是使用者驗證邊界」
提示/內容防護欄降低模型濫用風險「光是提示注入就證明驗證繞過」
canvas.eval / 瀏覽器 evaluate啟用時的有意操作者能力「任何 JS eval 原語在此信任模型中都自動是漏洞」
本機 TUI ! shell明確由操作者觸發的本機執行「本機 shell 便利命令是遠端注入」
Node 配對與 Node 命令配對裝置上的操作者等級遠端執行「遠端裝置控制預設應被視為不受信任的使用者存取」
gateway.nodes.pairing.autoApproveCidrs選擇加入的受信任網路 Node 註冊政策「預設停用的允許清單是自動配對漏洞」

依設計不是漏洞

這些模式經常被回報,而且通常會在沒有動作的情況下關閉,除非 能證明存在真實的邊界繞過:
  • 只有提示注入的鏈結,且沒有政策、驗證或沙箱繞過。
  • 假設在單一共用主機或 設定上進行敵對多租戶操作的主張。
  • 將正常操作者讀取路徑存取(例如 sessions.list / sessions.preview / chat.history)在 共用 Gateway 設定中歸類為 IDOR 的主張。
  • 只限 localhost 部署的發現(例如只限 loopback Gateway 上的 HSTS)。
  • 針對此 repo 中不存在的傳入路徑提出的 Discord 傳入 Webhook 簽章發現。
  • 將 Node 配對中繼資料視為 system.run 的隱藏第二層每命令 核准層的報告;實際執行邊界仍然是 Gateway 的全域 Node 命令政策,加上 Node 自身的 exec 核准。
  • 將已設定的 gateway.nodes.pairing.autoApproveCidrs 本身視為 漏洞的報告。此設定預設停用,需要 明確的 CIDR/IP 項目,只適用於首次 role: node 配對且 未請求範圍,且不會自動核准操作者/瀏覽器/Control UI、 WebChat、角色升級、範圍升級、中繼資料變更、公鑰變更, 或同主機 loopback 受信任代理標頭路徑,除非已明確啟用 loopback 受信任代理驗證。
  • sessionKey 視為 驗證權杖的「缺少每位使用者授權」發現。

60 秒內的強化基準

先使用此基準,然後依每個受信任代理選擇性重新啟用工具:
{
  gateway: {
    mode: "local",
    bind: "loopback",
    auth: { mode: "token", token: "replace-with-long-random-token" },
  },
  session: {
    dmScope: "per-channel-peer",
  },
  tools: {
    profile: "messaging",
    deny: ["group:automation", "group:runtime", "group:fs", "sessions_spawn", "sessions_send"],
    fs: { workspaceOnly: true },
    exec: { security: "deny", ask: "always" },
    elevated: { enabled: false },
  },
  channels: {
    whatsapp: { dmPolicy: "pairing", groups: { "*": { requireMention: true } } },
  },
}
這會讓 Gateway 僅限本機,隔離 DM,並預設停用控制平面/執行階段工具。

共用收件匣快速規則

如果超過一個人可以 DM 你的機器人:
  • 設定 session.dmScope: "per-channel-peer"(或對多帳戶頻道使用 "per-account-channel-peer")。
  • 保持 dmPolicy: "pairing" 或嚴格允許清單。
  • 永遠不要將共用 DM 與廣泛工具存取結合。
  • 這會強化合作/共用收件匣,但當使用者共用主機/設定寫入存取時,並非設計為敵對共租戶隔離。

內容可見性模型

OpenClaw 區分兩個概念:
  • 觸發授權:誰可以觸發代理(dmPolicygroupPolicy、允許清單、提及閘門)。
  • 內容可見性:哪些補充內容會注入模型輸入(回覆本文、引用文字、討論串歷史、轉寄中繼資料)。
允許清單會控管觸發與命令授權。contextVisibility 設定控制補充內容(引用回覆、討論串根、擷取的歷史)如何被篩選:
  • contextVisibility: "all"(預設)會依收到時的狀態保留補充脈絡。
  • contextVisibility: "allowlist" 會篩選補充脈絡,只傳送給通過作用中允許清單檢查的傳送者。
  • contextVisibility: "allowlist_quote" 的行為類似 allowlist,但仍會保留一則明確引用的回覆。
請按頻道或房間/對話設定 contextVisibility。設定詳細資訊請參閱群組聊天 安全公告分流指引:
  • 只顯示「模型可以看到非允許清單傳送者的引用文字或歷史文字」的主張,屬於可透過 contextVisibility 處理的強化發現,本身不是驗證或沙箱邊界繞過。
  • 若要構成安全影響,報告仍需要展示已證明的信任邊界繞過(驗證、政策、沙箱、核准,或其他已記錄的邊界)。

稽核檢查項目(高階)

  • 傳入存取(DM 政策、群組政策、允許清單):陌生人能否觸發 bot?
  • 工具影響範圍(提升權限的工具 + 開放房間):提示注入是否可能變成 shell/檔案/網路動作?
  • Exec 檔案系統偏移:在 exec/process 仍可用且沒有沙箱檔案系統限制時,是否拒絕會變更檔案系統的工具?
  • Exec 核准偏移security=fullautoAllowSkills、沒有 strictInlineEval 的直譯器允許清單):主機執行防護是否仍如你預期運作?
    • security="full" 是廣泛的狀態警告,不是 bug 證明。這是受信任個人助理設定所選擇的預設值;只有在你的威脅模型需要核准或允許清單防護時才收緊它。
  • 網路暴露(Gateway 繫結/驗證、Tailscale Serve/Funnel、弱式/短驗證權杖)。
  • 瀏覽器控制暴露(遠端節點、中繼連接埠、遠端 CDP 端點)。
  • 本機磁碟衛生(權限、符號連結、設定包含項、「同步資料夾」路徑)。
  • Plugin(Plugin 載入時沒有明確的允許清單)。
  • 政策偏移/設定錯誤(已設定 sandbox docker 設定但沙箱模式關閉;gateway.nodes.denyCommands 模式無效,因為比對只精確比對命令名稱(例如 system.run),不檢查 shell 文字;危險的 gateway.nodes.allowCommands 項目;全域 tools.profile="minimal" 被個別 agent 設定檔覆寫;Plugin 擁有的工具可在寬鬆工具政策下觸及)。
  • 執行階段預期偏移(例如假設隱含 exec 仍表示 sandbox,但 tools.exec.host 現在預設為 auto,或在沙箱模式關閉時明確設定 tools.exec.host="sandbox")。
  • 模型衛生(已設定模型看起來過舊時發出警告;不是硬性封鎖)。
如果你執行 --deep,OpenClaw 也會嘗試盡力進行即時 Gateway 探測。

憑證儲存對照

稽核存取或決定要備份什麼時使用此對照:
  • WhatsApp~/.openclaw/credentials/whatsapp/<accountId>/creds.json
  • Telegram bot 權杖:config/env 或 channels.telegram.tokenFile(僅限一般檔案;拒絕符號連結)
  • Discord bot 權杖:config/env 或 SecretRef(env/file/exec providers)
  • Slack 權杖:config/env(channels.slack.*
  • 配對允許清單
    • ~/.openclaw/credentials/<channel>-allowFrom.json(預設帳號)
    • ~/.openclaw/credentials/<channel>-<accountId>-allowFrom.json(非預設帳號)
  • 模型驗證設定檔~/.openclaw/agents/<agentId>/agent/auth-profiles.json
  • Codex 執行階段狀態~/.openclaw/agents/<agentId>/agent/codex-home/
  • 檔案支援的秘密承載資料(選用)~/.openclaw/secrets.json
  • 舊版 OAuth 匯入~/.openclaw/credentials/oauth.json

安全稽核檢查清單

稽核列印發現時,請依此優先順序處理:
  1. 任何「open」+ 已啟用工具:先鎖定 DM/群組(配對/允許清單),再收緊工具政策/沙箱化。
  2. 公開網路暴露(LAN 繫結、Funnel、缺少驗證):立即修正。
  3. 瀏覽器控制遠端暴露:將其視為操作者存取(僅限 tailnet、刻意配對節點、避免公開暴露)。
  4. 權限:確認狀態/設定/憑證/驗證不可由群組/全世界讀取。
  5. Plugin:只載入你明確信任的項目。
  6. 模型選擇:任何具備工具的 bot 都應偏好現代、經指令強化的模型。

安全稽核詞彙表

每個稽核發現都以結構化 checkId 為鍵(例如 gateway.bind_no_authtools.exec.security_full_configured)。常見的 critical 嚴重性類別:
  • fs.* - 狀態、設定、憑證、驗證設定檔上的檔案系統權限。
  • gateway.* - 繫結模式、驗證、Tailscale、Control UI、受信任 proxy 設定。
  • hooks.*browser.*sandbox.*tools.exec.* - 各表面的強化。
  • plugins.*skills.* - plugin/skill 供應鏈與掃描發現。
  • security.exposure.* - 存取政策與工具影響範圍交會處的橫向檢查。
請在安全稽核檢查查看完整目錄,包括嚴重性等級、修正鍵與自動修正支援。

透過 HTTP 使用 Control UI

Control UI 需要安全脈絡(HTTPS 或 localhost)才能產生裝置 身分。gateway.controlUi.allowInsecureAuth 是本機相容性切換:
  • 在 localhost 上,當頁面透過非安全 HTTP 載入時,它允許沒有裝置身分的 Control UI 驗證。
  • 它不會繞過配對檢查。
  • 它不會放寬遠端(非 localhost)裝置身分要求。
偏好 HTTPS(Tailscale Serve),或在 127.0.0.1 開啟 UI。 僅限緊急破玻璃情境,gateway.controlUi.dangerouslyDisableDeviceAuth 會完全停用裝置身分檢查。這是嚴重的安全降級; 除非你正在主動偵錯且能快速還原,否則請保持關閉。 與那些危險旗標分開來看,成功的 gateway.auth.mode: "trusted-proxy" 可以在沒有裝置身分的情況下允許操作者 Control UI 工作階段。這是 刻意的驗證模式行為,不是 allowInsecureAuth 捷徑,而且它仍然 不會延伸到節點角色 Control UI 工作階段。 啟用此設定時,openclaw security audit 會發出警告。

不安全或危險旗標摘要

當已啟用已知不安全/危險偵錯開關時,openclaw security audit 會引發 config.insecure_or_dangerous_flags。請在 正式環境中保持這些項目未設定。
  • gateway.controlUi.allowInsecureAuth=true
  • gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=true
  • gateway.controlUi.dangerouslyDisableDeviceAuth=true
  • hooks.gmail.allowUnsafeExternalContent=true
  • hooks.mappings[<index>].allowUnsafeExternalContent=true
  • tools.exec.applyPatch.workspaceOnly=false
  • plugins.entries.acpx.config.permissionMode=approve-all
Control UI 與瀏覽器:
  • gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback
  • gateway.controlUi.dangerouslyDisableDeviceAuth
  • browser.ssrfPolicy.dangerouslyAllowPrivateNetwork
頻道名稱比對(內建與 Plugin 頻道;在適用時也可按 accounts.<accountId> 使用):
  • channels.discord.dangerouslyAllowNameMatching
  • channels.slack.dangerouslyAllowNameMatching
  • channels.googlechat.dangerouslyAllowNameMatching
  • channels.msteams.dangerouslyAllowNameMatching
  • channels.synology-chat.dangerouslyAllowNameMatching(Plugin 頻道)
  • channels.synology-chat.dangerouslyAllowInheritedWebhookPath(Plugin 頻道)
  • channels.zalouser.dangerouslyAllowNameMatching(Plugin 頻道)
  • channels.irc.dangerouslyAllowNameMatching(Plugin 頻道)
  • channels.mattermost.dangerouslyAllowNameMatching(Plugin 頻道)
網路暴露:
  • channels.telegram.network.dangerouslyAllowPrivateNetwork(也可按帳號設定)
Sandbox Docker(預設值 + 按 agent):
  • agents.defaults.sandbox.docker.dangerouslyAllowReservedContainerTargets
  • agents.defaults.sandbox.docker.dangerouslyAllowExternalBindSources
  • agents.defaults.sandbox.docker.dangerouslyAllowContainerNamespaceJoin

反向 proxy 設定

如果你在反向 proxy(nginx、Caddy、Traefik 等)後方執行 Gateway,請設定 gateway.trustedProxies 以正確處理轉送的用戶端 IP。 當 Gateway 從不在 trustedProxies 內的位址偵測到 proxy 標頭時,它不會將連線視為本機用戶端。如果 gateway 驗證已停用,這些連線會被拒絕。這可防止經 proxy 的連線原本會看似來自 localhost 並取得自動信任所造成的驗證繞過。 gateway.trustedProxies 也會供 gateway.auth.mode: "trusted-proxy" 使用,但該驗證模式更嚴格:
  • trusted-proxy 驗證預設會對 loopback 來源 proxy 失敗關閉
  • 同主機 loopback 反向 proxy 可以使用 gateway.trustedProxies 進行本機用戶端偵測與轉送 IP 處理
  • 同主機 loopback 反向 proxy 只有在 gateway.auth.trustedProxy.allowLoopback = true 時才能滿足 gateway.auth.mode: "trusted-proxy";否則請使用權杖/密碼驗證
gateway:
  trustedProxies:
    - "10.0.0.1" # reverse proxy IP
  # Optional. Default false.
  # Only enable if your proxy cannot provide X-Forwarded-For.
  allowRealIpFallback: false
  auth:
    mode: password
    password: ${OPENCLAW_GATEWAY_PASSWORD}
設定 trustedProxies 時,Gateway 會使用 X-Forwarded-For 判斷用戶端 IP。預設會忽略 X-Real-IP,除非明確設定 gateway.allowRealIpFallback: true 受信任 proxy 標頭不會讓節點裝置配對自動受信任。 gateway.nodes.pairing.autoApproveCidrs 是另一個預設停用的 操作者政策。即使啟用,loopback 來源 trusted-proxy 標頭路徑 也會排除在節點自動核准之外,因為本機呼叫者可以偽造那些 標頭,包括明確啟用 loopback trusted-proxy 驗證時也是如此。 良好的反向 proxy 行為(覆寫傳入轉送標頭):
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Real-IP $remote_addr;
不良的反向 proxy 行為(附加/保留不受信任的轉送標頭):
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

HSTS 與來源注意事項

  • OpenClaw gateway 以本機/loopback 優先。如果你在反向 proxy 終止 TLS,請在那裡的 proxy-facing HTTPS 網域上設定 HSTS。
  • 如果 gateway 本身終止 HTTPS,你可以設定 gateway.http.securityHeaders.strictTransportSecurity,從 OpenClaw 回應送出 HSTS 標頭。
  • 詳細部署指引位於受信任 Proxy 驗證
  • 對於非 loopback 的 Control UI 部署,預設需要 gateway.controlUi.allowedOrigins
  • gateway.controlUi.allowedOrigins: ["*"] 是明確允許所有瀏覽器來源的政策,不是強化預設值。請避免在嚴格控管的本機測試之外使用它。
  • 即使已啟用一般 loopback 豁免,loopback 上的瀏覽器來源驗證失敗仍會受到速率限制,但鎖定鍵會按 正規化的 Origin 值分範圍,而不是使用單一共用 localhost bucket。
  • gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=true 會啟用 Host-header 來源 fallback 模式;請將其視為危險的操作者所選政策。
  • 將 DNS rebinding 與 proxy-host 標頭行為視為部署強化事項;保持 trustedProxies 嚴格,並避免將 gateway 直接暴露到公共網際網路。

本機工作階段記錄位於磁碟上

OpenClaw 會將工作階段逐字稿儲存在磁碟上的 ~/.openclaw/agents/<agentId>/sessions/*.jsonl。 這是工作階段連續性和(可選)工作階段記憶體索引所需,但也表示 任何具備檔案系統存取權的程序/使用者都可以讀取這些日誌。請將磁碟存取視為信任 邊界,並鎖定 ~/.openclaw 的權限(請參閱下方的稽核章節)。如果你需要 代理之間有更強的隔離,請讓它們在不同的 OS 使用者或不同主機下執行。

Node 執行(system.run)

如果已配對 macOS Node,Gateway 可以在該 Node 上叫用 system.run。這是在 Mac 上的遠端程式碼執行
  • 需要 Node 配對(核准 + 權杖)。
  • Gateway Node 配對不是逐命令核准介面。它會建立 Node 身分/信任並發行權杖。
  • Gateway 透過 gateway.nodes.allowCommands / denyCommands 套用粗略的全域 Node 命令政策。
  • 在 Mac 上透過 Settings → Exec approvals 控制(安全性 + 詢問 + 允許清單)。
  • 每個 Node 的 system.run 政策是該 Node 自己的執行核准檔案(exec.approvals.node.*),它可以比 Gateway 的全域命令 ID 政策更嚴格或更寬鬆。
  • security="full"ask="off" 執行的 Node 會遵循預設的受信任操作者模型。除非你的部署明確要求更嚴格的核准或允許清單立場,否則請將其視為預期行為。
  • 核准模式會繫結確切的請求情境,並在可能時繫結一個具體的本機指令碼/檔案運算元。若 OpenClaw 無法為直譯器/執行階段命令精確識別出一個直接本機檔案,則會拒絕以核准為基礎的執行,而不是承諾完整的語意涵蓋。
  • 對於 host=node,以核准為基礎的執行也會儲存一個標準的已準備 systemRunPlan;後續已核准的轉送會重用該已儲存計畫,而 Gateway 驗證會拒絕呼叫端在核准請求建立後對命令/cwd/工作階段情境的編輯。
  • 如果你不想要遠端執行,請將安全性設為 deny,並移除該 Mac 的 Node 配對。
這個區別對分流很重要:
  • 重新連線的已配對 Node 宣告不同的命令清單,本身不構成弱點,只要 Gateway 全域政策和該 Node 的本機執行核准仍強制執行實際執行邊界即可。
  • 將 Node 配對中繼資料視為第二層隱藏逐命令核准層的報告,通常是政策/UX 混淆,而不是安全邊界繞過。

動態 Skills(監看器 / 遠端 Node)

OpenClaw 可以在工作階段中重新整理 Skills 清單:
  • Skills 監看器:對 SKILL.md 的變更可以在下一個代理回合更新 Skills 快照。
  • 遠端 Node:連線 macOS Node 可以讓僅限 macOS 的 Skills 符合資格(根據 bin 探測)。
請將 Skills 資料夾視為受信任程式碼,並限制誰可以修改它們。

威脅模型

你的 AI 助理可以:
  • 執行任意 Shell 命令
  • 讀取/寫入檔案
  • 存取網路服務
  • 傳送訊息給任何人(如果你授予它 WhatsApp 存取權)
傳訊息給你的人可以:
  • 嘗試誘騙你的 AI 做壞事
  • 透過社交工程取得你資料的存取權
  • 探測基礎設施細節

核心概念:先做存取控制,再談智慧

這裡的大多數失敗不是高深的漏洞利用,而是「有人傳訊息給機器人,機器人照做了。」 OpenClaw 的立場:
  • 身分優先: 決定誰可以和機器人對話(DM 配對 / 允許清單 / 明確「open」)。
  • 範圍其次: 決定機器人被允許在哪裡行動(群組允許清單 + 提及閘控、工具、沙箱、裝置權限)。
  • 模型最後: 假設模型可能被操縱;設計時讓操縱造成的影響範圍有限。

命令授權模型

斜線命令和指令只會對已授權的傳送者生效。授權來源是 頻道允許清單/配對加上 commands.useAccessGroups(請參閱設定斜線命令)。如果頻道允許清單為空或包含 "*", 命令實際上會對該頻道開放。 /exec 是供已授權操作者使用的僅限工作階段便利功能。它不會寫入設定或 變更其他工作階段。

控制平面工具風險

兩個內建工具可以進行持久性控制平面變更:
  • gateway 可以使用 config.schema.lookup / config.get 檢查設定,並可使用 config.applyconfig.patchupdate.run 進行持久性變更。
  • cron 可以建立排程工作,讓它們在原始聊天/任務結束後仍持續執行。
僅限擁有者的 gateway 執行階段工具仍會拒絕重寫 tools.exec.asktools.exec.security;舊版 tools.bash.* 別名會在寫入前 正規化到相同的受保護執行路徑。 代理驅動的 gateway config.applygateway config.patch 編輯 預設會以失敗關閉:只有一組狹窄的提示、模型和提及閘控 路徑可由代理調整。因此,新的敏感設定樹會受到保護, 除非它們被刻意加入允許清單。 對於任何處理不受信任內容的代理/介面,預設拒絕這些工具:
{
  tools: {
    deny: ["gateway", "cron", "sessions_spawn", "sessions_send"],
  },
}
commands.restart=false 只會封鎖重新啟動動作。它不會停用 gateway 設定/更新動作。

Plugin

Plugin 會與 Gateway 同處理程序執行。請將它們視為受信任程式碼:
  • 只從你信任的來源安裝 Plugin。
  • 偏好明確的 plugins.allow 允許清單。
  • 啟用前先審查 Plugin 設定。
  • Plugin 變更後重新啟動 Gateway。
  • 如果你安裝或更新 Plugin(openclaw plugins install <package>openclaw plugins update <id>),請把它當成執行不受信任的程式碼:
    • 安裝路徑是作用中 Plugin 安裝根目錄下的每個 Plugin 目錄。
    • OpenClaw 會在安裝/更新前執行內建危險程式碼掃描。critical 發現預設會封鎖。
    • npm 和 git Plugin 安裝只會在明確的安裝/更新流程中執行套件管理器相依性收斂。本機路徑和封存檔會被視為自足的 Plugin 套件;OpenClaw 會複製/參照它們,而不執行 npm install
    • 偏好固定且精確的版本(@scope/pkg@1.2.3),並在啟用前檢查磁碟上解開的程式碼。
    • --dangerously-force-unsafe-install 只是 Plugin 安裝/更新流程中針對內建掃描誤判的破窗選項。它不會繞過 Plugin before_install Hook 政策封鎖,也不會繞過掃描失敗。
    • Gateway 支援的 Skills 相依性安裝遵循相同的危險/可疑區分:內建 critical 發現會封鎖,除非呼叫端明確設定 dangerouslyForceUnsafeInstall,而可疑發現仍只會警告。openclaw skills install 仍是獨立的 ClawHub Skill 下載/安裝流程。
詳細資料:Plugin

DM 存取模型:配對、允許清單、開放、停用

所有目前支援 DM 的頻道都支援 DM 政策(dmPolicy*.dm.policy),會在訊息處理之前閘控傳入 DM:
  • pairing(預設):未知傳送者會收到簡短配對碼,且機器人會忽略其訊息直到核准。代碼會在 1 小時後過期;重複 DM 在建立新請求前不會重新傳送代碼。待處理請求預設每個頻道上限為 3 個
  • allowlist:未知傳送者會被封鎖(沒有配對握手)。
  • open:允許任何人 DM(公開)。需要頻道允許清單包含 "*"(明確選擇加入)。
  • disabled:完全忽略傳入 DM。
透過 CLI 核准:
openclaw pairing list <channel>
openclaw pairing approve <channel> <code>
詳細資料 + 磁碟上的檔案:配對

DM 工作階段隔離(多使用者模式)

預設情況下,OpenClaw 會將所有 DM 路由到主要工作階段,讓你的助理能跨裝置和頻道保持連續性。如果多人可以 DM 機器人(開放 DM 或多人允許清單),請考慮隔離 DM 工作階段:
{
  session: { dmScope: "per-channel-peer" },
}
這可以防止跨使用者情境洩漏,同時保持群組聊天隔離。 這是訊息情境邊界,不是主機管理員邊界。如果使用者彼此互為對手且共用同一 Gateway 主機/設定,請改為依信任邊界執行不同 Gateway。

安全 DM 模式(建議)

將上方片段視為安全 DM 模式
  • 預設:session.dmScope: "main"(所有 DM 共用一個工作階段以保持連續性)。
  • 本機 CLI 入門預設:未設定時寫入 session.dmScope: "per-channel-peer"(保留既有明確值)。
  • 安全 DM 模式:session.dmScope: "per-channel-peer"(每個頻道+傳送者組合取得隔離的 DM 情境)。
  • 跨頻道對等方隔離:session.dmScope: "per-peer"(每個傳送者在相同類型的所有頻道中取得一個工作階段)。
如果你在同一頻道上執行多個帳號,請改用 per-account-channel-peer。如果同一個人透過多個頻道聯絡你,請使用 session.identityLinks 將這些 DM 工作階段合併為一個標準身分。請參閱工作階段管理設定

DM 和群組的允許清單

OpenClaw 有兩個獨立的「誰可以觸發我?」層:
  • DM 允許清單allowFrom / channels.discord.allowFrom / channels.slack.allowFrom;舊版:channels.discord.dm.allowFromchannels.slack.dm.allowFrom):誰被允許在直接訊息中和機器人對話。
    • dmPolicy="pairing" 時,核准會寫入 ~/.openclaw/credentials/ 下的帳號範圍配對允許清單儲存區(預設帳號為 <channel>-allowFrom.json,非預設帳號為 <channel>-<accountId>-allowFrom.json),並與設定允許清單合併。
  • 群組允許清單(特定頻道):機器人會接受哪些群組/頻道/伺服器的訊息。
    • 常見模式:
      • channels.whatsapp.groupschannels.telegram.groupschannels.imessage.groups:每個群組預設值,例如 requireMention;設定時,它也會作為群組允許清單(包含 "*" 以保留全部允許行為)。
      • groupPolicy="allowlist" + groupAllowFrom:限制誰可以在群組工作階段觸發機器人(WhatsApp/Telegram/Signal/iMessage/Microsoft Teams)。
      • channels.discord.guilds / channels.slack.channels:每個介面的允許清單 + 提及預設值。
    • 群組檢查依此順序執行:先執行 groupPolicy/群組允許清單,再執行提及/回覆啟用。
    • 回覆機器人訊息(隱式提及)不會繞過 groupAllowFrom 等傳送者允許清單。
    • 安全性注意事項:dmPolicy="open"groupPolicy="open" 視為最後手段設定。它們應該極少使用;除非你完全信任房間中的每個成員,否則偏好配對 + 允許清單。
詳細資料:設定群組

提示注入(它是什麼、為何重要)

提示注入是指攻擊者精心撰寫訊息,操縱模型去做不安全的事(「忽略你的指示」、「傾印你的檔案系統」、「跟隨此連結並執行命令」等等)。 即使有強大的系統提示,提示注入仍未被解決。系統提示防護欄只是軟性指引;硬性強制執行來自工具政策、執行核准、沙箱和頻道允許清單(而操作者可依設計停用這些)。實務上有幫助的是:
  • 保持傳入的私訊受到嚴格限制(配對/允許清單)。
  • 在群組中優先使用提及閘控;避免在公開聊天室中使用「永遠開啟」的 bot。
  • 預設將連結、附件和貼上的指示視為惡意內容。
  • 在沙箱中執行敏感工具;不要讓密鑰出現在 agent 可存取的檔案系統中。
  • 注意:沙箱是選擇性啟用的。如果沙箱模式關閉,隱含的 host=auto 會解析為 Gateway 主機。明確的 host=sandbox 仍會以關閉失敗,因為沒有可用的沙箱執行環境。如果你想在設定中明確指定該行為,請設定 host=gateway
  • 將高風險工具(execbrowserweb_fetchweb_search)限制給受信任的 agent 或明確的允許清單。
  • 如果你將直譯器(pythonnoderubyperlphpluaosascript)加入允許清單,請啟用 tools.exec.strictInlineEval,讓內嵌 eval 形式仍需要明確核准。
  • Shell 核准分析也會拒絕 未加引號 heredocs 內的 POSIX 參數展開形式($VAR$?$$$1$@${…}),因此加入允許清單的 heredoc 內容無法把 shell 展開偽裝成純文字而繞過允許清單審查。請為 heredoc 結束符加上引號(例如 <<'EOF'),以選擇使用字面內容語意;會展開變數的未加引號 heredocs 會被拒絕。
  • **模型選擇很重要:**較舊/較小/舊世代模型對提示注入和工具誤用的防護能力明顯較弱。對於啟用工具的 agent,請使用可用的最強最新世代、已強化指示遵循能力的模型。
應視為不受信任的危險訊號:
  • 「讀取這個檔案/URL,並完全照它說的做。」
  • 「忽略你的系統提示或安全規則。」
  • 「揭露你的隱藏指示或工具輸出。」
  • 「貼上 ~/.openclaw 或你的日誌的完整內容。」

外部內容特殊 token 淨化

OpenClaw 會在包裝外部內容與中繼資料送達模型之前,移除常見自行託管 LLM 聊天樣板的特殊 token 字面值。涵蓋的標記家族包括 Qwen/ChatML、Llama、Gemma、Mistral、Phi,以及 GPT-OSS 角色/回合 token。 原因:
  • 對接自行託管模型的 OpenAI 相容後端,有時會保留出現在使用者文字中的特殊 token,而不是遮蔽它們。否則,能寫入傳入外部內容(擷取的頁面、電子郵件內文、檔案內容工具輸出)的攻擊者,就可能注入合成的 assistantsystem 角色邊界,並逃脫包裝內容的防護欄。
  • 淨化會發生在外部內容包裝層,因此會一致套用到擷取/讀取工具與傳入通道內容,而不是每個提供者各自處理。
  • 傳出的模型回應已經有獨立的淨化器,會在最終通道交付邊界,從使用者可見回覆中移除洩漏的 <tool_call><function_calls><system-reminder><previous_response> 和類似的內部執行環境支架。外部內容淨化器是其傳入端對應機制。
這不會取代本頁其他強化措施 - dmPolicy、允許清單、exec 核准、沙箱和 contextVisibility 仍然負責主要防護。它會封閉一種特定的 tokenizer 層繞過方式,該繞過方式針對會原封不動轉送含特殊 token 使用者文字的自行託管堆疊。

不安全外部內容繞過旗標

OpenClaw 包含會停用外部內容安全包裝的明確繞過旗標:
  • hooks.mappings[].allowUnsafeExternalContent
  • hooks.gmail.allowUnsafeExternalContent
  • Cron 酬載欄位 allowUnsafeExternalContent
指南:
  • 在生產環境中保持這些欄位未設定/false。
  • 只在範圍嚴格受限的除錯中暫時啟用。
  • 如果啟用,請隔離該 agent(沙箱 + 最少工具 + 專用工作階段命名空間)。
Hooks 風險注意事項:
  • Hook 酬載是不受信任內容,即使交付來源是你控制的系統(郵件/文件/web 內容都可能攜帶提示注入)。
  • 較弱的模型層級會提高此風險。對於由 hook 驅動的自動化,優先使用強大的現代模型層級,並保持工具政策嚴格(tools.profile: "messaging" 或更嚴格),且盡可能使用沙箱。

提示注入不需要公開私訊

即使只有你能傳訊息給 bot,提示注入仍可能透過 bot 讀取的任何不受信任內容發生(web 搜尋/擷取結果、瀏覽器頁面、電子郵件、文件、附件、貼上的日誌/程式碼)。換句話說:寄件者不是唯一的威脅面;內容本身也可能攜帶對抗性指示。 啟用工具時,典型風險是外洩脈絡或觸發工具呼叫。請透過以下方式降低影響範圍:
  • 使用唯讀或停用工具的讀取 agent來摘要不受信任內容,然後將摘要傳給你的主要 agent。
  • 除非需要,否則對啟用工具的 agent 關閉 web_search / web_fetch / browser
  • 對於 OpenResponses URL 輸入(input_file / input_image),設定嚴格的 gateway.http.endpoints.responses.files.urlAllowlistgateway.http.endpoints.responses.images.urlAllowlist,並保持 maxUrlParts 較低。空的允許清單會被視為未設定;如果你想完全停用 URL 擷取,請使用 files.allowUrl: false / images.allowUrl: false
  • 對於 OpenResponses 檔案輸入,解碼後的 input_file 文字仍會以不受信任外部內容注入。不要只因為 Gateway 在本機解碼了檔案文字,就依賴檔案文字是可信的。注入區塊仍會帶有明確的 <<<EXTERNAL_UNTRUSTED_CONTENT ...>>> 邊界標記和 Source: External 中繼資料,即使此路徑省略了較長的 SECURITY NOTICE: 橫幅。
  • 當媒體理解在將文字附加到媒體提示前,從附加文件中擷取文字時,也會套用相同的標記式包裝。
  • 為任何接觸不受信任輸入的 agent 啟用沙箱和嚴格的工具允許清單。
  • 不要把密鑰放進提示;改由 Gateway 主機上的 env/config 傳入。

自行託管 LLM 後端

OpenAI 相容的自行託管後端,例如 vLLM、SGLang、TGI、LM Studio,或自訂 Hugging Face tokenizer 堆疊,在處理聊天樣板特殊 token 的方式上可能與託管提供者不同。如果後端會將 <|im_start|><|start_header_id|><start_of_turn> 等字面字串,在使用者內容中 tokenize 為結構性聊天樣板 token,不受信任文字就可能嘗試在 tokenizer 層偽造角色邊界。 OpenClaw 會先從包裝的外部內容中移除常見模型家族的特殊 token 字面值,再將其派送給模型。請保持啟用外部內容包裝,並優先使用可在使用者提供內容中分割或逸出特殊 token 的後端設定。OpenAI 和 Anthropic 等託管提供者已經套用自己的請求端淨化。

模型強度(安全注意事項)

提示注入抵抗力在不同模型層級之間並不一致。較小/較便宜的模型通常更容易受到工具誤用和指示劫持影響,尤其是在對抗性提示下。
對於啟用工具的 agent 或會讀取不受信任內容的 agent,使用較舊/較小模型時,提示注入風險通常過高。不要在弱模型層級上執行這些工作負載。
建議:
  • 對任何能執行工具或接觸檔案/網路的 bot,使用最新世代、最佳層級模型
  • 對啟用工具的 agent 或不受信任的收件匣,不要使用較舊/較弱/較小層級;提示注入風險太高。
  • 如果必須使用較小模型,請降低影響範圍(唯讀工具、強沙箱、最小檔案系統存取、嚴格允許清單)。
  • 執行小型模型時,請為所有工作階段啟用沙箱,並停用 web_search/web_fetch/browser,除非輸入受到嚴格控制。
  • 對於輸入可信且沒有工具的純聊天個人助理,較小模型通常可以。

群組中的推理與詳細輸出

/reasoning/verbose/trace 可能會暴露內部推理、工具輸出或 Plugin 診斷,這些內容並非供公開通道使用。在群組設定中,請將它們視為僅供除錯,除非明確需要,否則保持關閉。 指南:
  • 在公開聊天室中停用 /reasoning/verbose/trace
  • 如果啟用,只能在受信任的私訊或嚴格控制的聊天室中啟用。
  • 請記住:詳細與追蹤輸出可能包含工具引數、URL、Plugin 診斷,以及模型看到的資料。

設定強化範例

檔案權限

在 Gateway 主機上保持設定 + 狀態私密:
  • ~/.openclaw/openclaw.json: 600(僅使用者可讀/寫)
  • ~/.openclaw: 700(僅使用者)
openclaw doctor 可以警告並提供收緊這些權限的選項。

網路暴露(bind、port、firewall)

Gateway 會在單一連接埠上多工 WebSocket + HTTP
  • 預設:18789
  • 設定/旗標/env:gateway.port--portOPENCLAW_GATEWAY_PORT
此 HTTP 表面包含 Control UI 和 canvas host:
  • Control UI(SPA 資產)(預設基礎路徑 /
  • Canvas host:/__openclaw__/canvas//__openclaw__/a2ui/(任意 HTML/JS;視為不受信任內容)
如果你在一般瀏覽器中載入 canvas 內容,請將其視為任何其他不受信任的網頁:
  • 不要將 canvas host 暴露給不受信任的網路/使用者。
  • 除非你完全理解其影響,否則不要讓 canvas 內容與具權限的 web 表面共用同一 origin。
Bind 模式控制 Gateway 監聽的位置:
  • gateway.bind: "loopback"(預設):只有本機用戶端可以連線。
  • 非 loopback bind("lan""tailnet""custom")會擴大攻擊面。只有在具備 Gateway 驗證(共享 token/密碼,或正確設定的受信任 proxy)和真正的 firewall 時才使用。
經驗法則:
  • 優先使用 Tailscale Serve,而不是 LAN bind(Serve 會讓 Gateway 保持在 loopback,並由 Tailscale 處理存取)。
  • 如果必須 bind 到 LAN,請用 firewall 將連接埠限制在嚴格的來源 IP 允許清單;不要廣泛做 port-forward。
  • 絕不要在 0.0.0.0 上未驗證地暴露 Gateway。

搭配 UFW 的 Docker 連接埠發布

如果你在 VPS 上用 Docker 執行 OpenClaw,請記住,已發布的容器連接埠(-p HOST:CONTAINER 或 Compose ports:)會透過 Docker 的 forwarding chains 路由,而不只是主機 INPUT 規則。 若要讓 Docker 流量符合你的 firewall 政策,請在 DOCKER-USER 中強制執行規則(此 chain 會在 Docker 自己的接受規則之前評估)。在許多現代發行版上,iptables/ip6tables 使用 iptables-nft 前端,且仍會將這些規則套用到 nftables 後端。 最小允許清單範例(IPv4):
# /etc/ufw/after.rules (append as its own *filter section)
*filter
:DOCKER-USER - [0:0]
-A DOCKER-USER -m conntrack --ctstate ESTABLISHED,RELATED -j RETURN
-A DOCKER-USER -s 127.0.0.0/8 -j RETURN
-A DOCKER-USER -s 10.0.0.0/8 -j RETURN
-A DOCKER-USER -s 172.16.0.0/12 -j RETURN
-A DOCKER-USER -s 192.168.0.0/16 -j RETURN
-A DOCKER-USER -s 100.64.0.0/10 -j RETURN
-A DOCKER-USER -p tcp --dport 80 -j RETURN
-A DOCKER-USER -p tcp --dport 443 -j RETURN
-A DOCKER-USER -m conntrack --ctstate NEW -j DROP
-A DOCKER-USER -j RETURN
COMMIT
IPv6 有獨立的表。如果已啟用 Docker IPv6,請在 /etc/ufw/after6.rules 中加入相符政策。 避免在文件片段中硬編碼 eth0 等介面名稱。介面名稱會因 VPS 映像而異(ens3enp* 等),不相符時可能會意外略過你的拒絕規則。 重新載入後快速驗證:
ufw reload
iptables -S DOCKER-USER
ip6tables -S DOCKER-USER
nmap -sT -p 1-65535 <public-ip> --open
預期的外部連接埠應該只包含你有意暴露的內容(對大多數設定而言:SSH + 你的反向 proxy 連接埠)。

mDNS/Bonjour 探索

啟用內建的 bonjour Plugin 時,Gateway 會透過 mDNS(連接埠 5353 上的 _openclaw-gw._tcp)廣播其存在,以供本機裝置探索。在完整模式中,這包含可能暴露作業細節的 TXT 記錄:
  • cliPath:CLI 二進位檔的完整檔案系統路徑(會揭露使用者名稱與安裝位置)
  • sshPort:宣告主機上的 SSH 可用性
  • displayNamelanHost:主機名稱資訊
營運安全考量: 廣播基礎設施細節會讓本機網路上的任何人更容易偵察。即使是檔案系統路徑與 SSH 可用性這類「無害」資訊,也能協助攻擊者描繪你的環境。 建議:
  1. 除非需要 LAN 探索,否則保持 Bonjour 停用。 Bonjour 會在 macOS 主機上自動啟動,在其他地方則需選擇啟用;直接 Gateway URL、Tailnet、SSH 或廣域 DNS-SD 可避免本機多播。
  2. 最小模式(啟用 Bonjour 時的預設值,建議用於暴露的 Gateway):從 mDNS 廣播中省略敏感欄位:
    {
      discovery: {
        mdns: { mode: "minimal" },
      },
    }
    
  3. 如果你想保持 Plugin 啟用但抑制本機裝置探索,請停用 mDNS 模式
    {
      discovery: {
        mdns: { mode: "off" },
      },
    }
    
  4. 完整模式(選擇啟用):在 TXT 記錄中包含 cliPath + sshPort
    {
      discovery: {
        mdns: { mode: "full" },
      },
    }
    
  5. 環境變數(替代方式):設定 OPENCLAW_DISABLE_BONJOUR=1,即可在不變更設定的情況下停用 mDNS。
在最小模式啟用 Bonjour 時,Gateway 會廣播足以進行裝置探索的資訊(rolegatewayPorttransport),但會省略 cliPathsshPort。需要 CLI 路徑資訊的 App 可以改透過已驗證的 WebSocket 連線擷取。

鎖定 Gateway WebSocket(本機驗證)

Gateway 驗證預設為必需。如果沒有設定有效的 Gateway 驗證路徑,Gateway 會拒絕 WebSocket 連線(失敗即關閉)。 Onboarding 預設會產生權杖(即使是 loopback),因此本機用戶端必須驗證。 設定權杖,讓所有 WS 用戶端都必須驗證:
{
  gateway: {
    auth: { mode: "token", token: "your-token" },
  },
}
Doctor 可以為你產生一個:openclaw doctor --generate-gateway-token
gateway.remote.tokengateway.remote.password 是用戶端憑證來源。它們本身不會保護本機 WS 存取。本機呼叫路徑只有在 gateway.auth.* 未設定時,才能使用 gateway.remote.* 作為備援。如果透過 SecretRef 明確設定 gateway.auth.tokengateway.auth.password 但無法解析,解析會失敗即關閉(不會以遠端備援遮蔽)。
可選:使用 wss:// 時,透過 gateway.remote.tlsFingerprint 釘選遠端 TLS。 明文 ws:// 預設僅限 loopback。對於受信任的私人網路路徑,請在用戶端程序上設定 OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 作為破窗選項。這刻意僅限程序環境,而不是 openclaw.json 設定鍵。 行動配對與 Android 手動或掃描的 Gateway 路由更嚴格:loopback 可接受明文,但私人 LAN、link-local、.local 與無點主機名稱必須使用 TLS,除非你明確選擇啟用受信任私人網路明文路徑。 本機裝置配對:
  • 裝置配對會針對直接 local loopback 連線自動核准,以保持同主機用戶端順暢。
  • OpenClaw 也有一條狹窄的後端/容器本機自連線路徑,用於受信任的共用密鑰輔助流程。
  • Tailnet 與 LAN 連線,包括同主機 tailnet 繫結,都會被視為遠端配對,仍需要核准。
  • loopback 請求上的轉送標頭證據會取消 loopback 本地性資格。中繼資料升級自動核准的範圍很窄。兩項規則請參閱 Gateway 配對
驗證模式:
  • gateway.auth.mode: "token":共用 bearer 權杖(建議用於大多數設定)。
  • gateway.auth.mode: "password":密碼驗證(建議透過環境變數設定:OPENCLAW_GATEWAY_PASSWORD)。
  • gateway.auth.mode: "trusted-proxy":信任具備身分感知能力的反向代理來驗證使用者,並透過標頭傳遞身分(請參閱受信任代理驗證)。
輪替檢查清單(權杖/密碼):
  1. 產生/設定新的秘密(gateway.auth.tokenOPENCLAW_GATEWAY_PASSWORD)。
  2. 重新啟動 Gateway(或如果 macOS App 監督 Gateway,則重新啟動 macOS App)。
  3. 更新任何遠端用戶端(呼叫 Gateway 的機器上的 gateway.remote.token / .password)。
  4. 確認你無法再使用舊憑證連線。

Tailscale Serve 身分標頭

gateway.auth.allowTailscaletrue(Serve 的預設值)時,OpenClaw 會接受 Tailscale Serve 身分標頭(tailscale-user-login)用於 Control UI/WebSocket 驗證。OpenClaw 會透過本機 Tailscale 常駐程式(tailscale whois)解析 x-forwarded-for 位址並與標頭比對,以驗證身分。這只會針對打到 loopback 且包含由 Tailscale 注入的 x-forwarded-forx-forwarded-protox-forwarded-host 的請求觸發。 對於這條非同步身分檢查路徑,來自相同 {scope, ip} 的失敗嘗試會在限速器記錄失敗前被序列化。因此,來自同一個 Serve 用戶端的並行錯誤重試,可能會立即鎖定第二次嘗試,而不是像兩個普通不相符那樣競速通過。 HTTP API 端點(例如 /v1/*/tools/invoke/api/channels/*不會使用 Tailscale 身分標頭驗證。它們仍會遵循 Gateway 設定的 HTTP 驗證模式。 重要邊界注意事項:
  • Gateway HTTP bearer 驗證實際上是全有或全無的操作員存取。
  • 請將可呼叫 /v1/chat/completions/v1/responses/api/channels/* 的憑證視為該 Gateway 的完整存取操作員秘密。
  • 在 OpenAI 相容的 HTTP 介面上,共用秘密 bearer 驗證會還原完整的預設操作員範圍(operator.adminoperator.approvalsoperator.pairingoperator.readoperator.talk.secretsoperator.write),以及代理回合的擁有者語意;較窄的 x-openclaw-scopes 值不會縮減該共用秘密路徑。
  • HTTP 上的逐請求範圍語意,只有在請求來自帶有身分的模式時才適用,例如受信任代理驗證,或私人入口上的 gateway.auth.mode="none"
  • 在這些帶有身分的模式中,省略 x-openclaw-scopes 會退回一般操作員預設範圍集合;當你需要較窄的範圍集合時,請明確傳送該標頭。
  • /tools/invoke 遵循相同的共用秘密規則:權杖/密碼 bearer 驗證在該處也會被視為完整操作員存取,而帶有身分的模式仍會遵循宣告的範圍。
  • 不要與不受信任的呼叫者共用這些憑證;偏好依信任邊界使用獨立 Gateway。
信任假設: 無權杖 Serve 驗證假設 Gateway 主機是受信任的。 不要將此視為對抗惡意同主機程序的保護。如果不受信任的本機程式碼可能在 Gateway 主機上執行,請停用 gateway.auth.allowTailscale,並要求使用 gateway.auth.mode: "token""password" 進行明確共用秘密驗證。 安全規則: 不要從你自己的反向代理轉送這些標頭。如果你在 Gateway 前終止 TLS 或代理,請停用 gateway.auth.allowTailscale,改用共用秘密驗證(gateway.auth.mode: "token""password"),或使用受信任代理驗證 受信任代理:
  • 如果你在 Gateway 前終止 TLS,請將 gateway.trustedProxies 設為你的代理 IP。
  • OpenClaw 會信任來自這些 IP 的 x-forwarded-for(或 x-real-ip),以判定用於本機配對檢查與 HTTP 驗證/本機檢查的用戶端 IP。
  • 確保你的代理會覆寫 x-forwarded-for,並阻擋對 Gateway 連接埠的直接存取。
請參閱 TailscaleWeb 概覽

透過 Node 主機控制瀏覽器(建議)

如果你的 Gateway 是遠端的,但瀏覽器在另一台機器上執行,請在瀏覽器機器上執行 Node 主機,並讓 Gateway 代理瀏覽器動作(請參閱瀏覽器工具)。 請將 Node 配對視同管理員存取。 建議模式:
  • 將 Gateway 與 Node 主機保持在同一個 tailnet(Tailscale)上。
  • 有意識地配對 Node;如果不需要瀏覽器代理路由,請停用它。
避免:
  • 透過 LAN 或公用 Internet 暴露中繼/控制連接埠。
  • 對瀏覽器控制端點使用 Tailscale Funnel(公開暴露)。

磁碟上的秘密

假設 ~/.openclaw/(或 $OPENCLAW_STATE_DIR/)底下的任何內容都可能包含秘密或私人資料:
  • openclaw.json:設定可能包含權杖(Gateway、遠端 Gateway)、提供者設定與允許清單。
  • credentials/**:通道憑證(例如:WhatsApp 憑證)、配對允許清單、舊版 OAuth 匯入。
  • agents/<agentId>/agent/auth-profiles.json:API 金鑰、權杖設定檔、OAuth 權杖,以及可選的 keyRef/tokenRef
  • agents/<agentId>/agent/codex-home/**:每個代理的 Codex App-server 帳戶、設定、Skills、plugins、原生執行緒狀態與診斷。
  • secrets.json(可選):由 file SecretRef 提供者(secrets.providers)使用的檔案支援秘密承載。
  • agents/<agentId>/agent/auth.json:舊版相容檔案。靜態 api_key 項目在發現時會被清除。
  • agents/<agentId>/sessions/**:工作階段逐字稿(*.jsonl)+ 路由中繼資料(sessions.json),可能包含私人訊息與工具輸出。
  • bundled plugin 套件:已安裝的 plugins(加上它們的 node_modules/)。
  • sandboxes/**:工具沙盒工作區;可能累積你在沙盒中讀取/寫入的檔案副本。
強化提示:
  • 保持權限嚴格(目錄 700、檔案 600)。
  • 在 Gateway 主機上使用全磁碟加密。
  • 如果主機是共用的,建議為 Gateway 使用專用的 OS 使用者帳戶。

工作區 .env 檔案

OpenClaw 會為代理與工具載入工作區本機 .env 檔案,但絕不允許這些檔案悄悄覆寫 Gateway 執行階段控制。
  • 任何以 OPENCLAW_* 開頭的鍵,都會被不受信任工作區 .env 檔案封鎖。
  • Matrix、Mattermost、IRC 與 Synology Chat 的通道端點設定,也會被封鎖而無法從工作區 .env 覆寫,因此複製的工作區無法透過本機端點設定重新導向 bundled connector 流量。端點環境鍵(例如 MATRIX_HOMESERVERMATTERMOST_URLIRC_HOSTSYNOLOGY_CHAT_INCOMING_URL)必須來自 Gateway 程序環境或 env.shellEnv,而不是來自工作區載入的 .env
  • 封鎖採失敗即關閉:未來版本新增的執行階段控制變數無法從已簽入或攻擊者提供的 .env 繼承;該鍵會被忽略,Gateway 會保留自己的值。
  • 受信任的程序/OS 環境變數(Gateway 自身的 shell、launchd/systemd 單元、App bundle)仍會套用 - 這只限制 .env 檔案載入。
原因:工作區 .env 檔案經常位於代理程式碼旁邊、被意外提交,或由工具寫入。封鎖整個 OPENCLAW_* 前綴,代表之後新增新的 OPENCLAW_* 旗標時,永遠不會退化成從工作區狀態悄悄繼承。

日誌與逐字稿(修訂與保留)

即使存取控制正確,日誌與逐字稿仍可能洩漏敏感資訊:
  • Gateway 日誌可能包含工具摘要、錯誤與 URL。
  • 工作階段逐字稿可能包含貼上的秘密、檔案內容、命令輸出與連結。
建議:
  • 保持日誌與逐字稿修訂開啟(logging.redactSensitive: "tools";預設值)。
  • 透過 logging.redactPatterns 為你的環境新增自訂模式(權杖、主機名稱、內部 URL)。
  • 分享診斷時,建議使用 openclaw status --all(可貼上、已修訂秘密)而不是原始日誌。
  • 如果不需要長期保留,請修剪舊的工作階段逐字稿與日誌檔案。
詳細資訊:日誌

DM:預設配對

{
  channels: { whatsapp: { dmPolicy: "pairing" } },
}

群組:所有地方都要求提及

{
  "channels": {
    "whatsapp": {
      "groups": {
        "*": { "requireMention": true }
      }
    }
  },
  "agents": {
    "list": [
      {
        "id": "main",
        "groupChat": { "mentionPatterns": ["@openclaw", "@mybot"] }
      }
    ]
  }
}
在群組聊天中,只有在被明確提及時才回應。

分開號碼(WhatsApp、Signal、Telegram)

對於以電話號碼為基礎的頻道,請考慮讓你的 AI 使用與個人號碼分開的電話號碼:
  • 個人號碼:你的對話會保持私密
  • Bot 號碼:AI 會處理這些對話,並維持適當邊界

唯讀模式(透過沙箱與工具)

你可以透過結合以下設定建立唯讀設定檔:
  • agents.defaults.sandbox.workspaceAccess: "ro"(或使用 "none" 來停用工作區存取)
  • 封鎖 writeeditapply_patchexecprocess 等的工具允許/拒絕清單。
其他強化選項:
  • tools.exec.applyPatch.workspaceOnly: true(預設值):確保即使在沙箱關閉時,apply_patch 也無法在工作區目錄外寫入/刪除。只有在你刻意要讓 apply_patch 觸及工作區外的檔案時,才設定為 false
  • tools.fs.workspaceOnly: true(選用):將 read/write/edit/apply_patch 路徑與原生提示影像自動載入路徑限制在工作區目錄內(如果你目前允許絕對路徑,且想要單一防護欄,這很有用)。
  • 保持檔案系統根目錄範圍狹窄:避免在代理程式工作區/沙箱工作區使用像家目錄這樣的寬泛根目錄。寬泛根目錄可能會將敏感的本機檔案(例如 ~/.openclaw 下的狀態/設定)暴露給檔案系統工具。

安全基準線(複製/貼上)

一個「安全預設」設定,可讓 Gateway 保持私有、要求 DM 配對,並避免始終開啟的群組 bot:
{
  gateway: {
    mode: "local",
    bind: "loopback",
    port: 18789,
    auth: { mode: "token", token: "your-long-random-token" },
  },
  channels: {
    whatsapp: {
      dmPolicy: "pairing",
      groups: { "*": { requireMention: true } },
    },
  },
}
如果你也想要「預設更安全」的工具執行,請為任何非擁有者代理程式加入沙箱並拒絕危險工具(範例如下方「個別代理程式存取設定檔」)。 聊天驅動代理程式回合的內建基準線:非擁有者寄件者無法使用 crongateway 工具。

沙箱化(建議)

專用文件:沙箱化 兩種互補方式:
  • 在 Docker 中執行完整 Gateway(容器邊界):Docker
  • 工具沙箱agents.defaults.sandbox,主機 gateway + 沙箱隔離工具;Docker 是預設後端):沙箱化
為防止跨代理程式存取,請將 agents.defaults.sandbox.scope 保持為 "agent"(預設值),或使用 "session" 以取得更嚴格的逐工作階段隔離。scope: "shared" 會使用單一容器或工作區。
也請考慮沙箱內的代理程式工作區存取:
  • agents.defaults.sandbox.workspaceAccess: "none"(預設值)讓代理程式工作區不可存取;工具會在 ~/.openclaw/sandboxes 下的沙箱工作區執行
  • agents.defaults.sandbox.workspaceAccess: "ro" 以唯讀方式將代理程式工作區掛載到 /agent(停用 write/edit/apply_patch
  • agents.defaults.sandbox.workspaceAccess: "rw" 以讀寫方式將代理程式工作區掛載到 /workspace
  • 額外的 sandbox.docker.binds 會依正規化與標準化後的來源路徑進行驗證。父層符號連結技巧與標準家目錄別名如果解析到封鎖根目錄(例如 /etc/var/run,或 OS 家目錄下的憑證目錄),仍會關閉失敗。
tools.elevated 是在沙箱外執行 exec 的全域基準逃生通道。有效主機預設為 gateway,或在 exec 目標設定為 node 時為 node。請嚴格限制 tools.elevated.allowFrom,且不要為陌生人啟用它。你也可以透過 agents.list[].tools.elevated 進一步依代理程式限制 elevated。請參閱 Elevated 模式

子代理程式委派防護欄

如果你允許工作階段工具,請將委派的子代理程式執行視為另一個邊界決策:
  • 除非代理程式確實需要委派,否則拒絕 sessions_spawn
  • agents.defaults.subagents.allowAgents 和任何個別代理程式的 agents.list[].subagents.allowAgents 覆寫限制為已知安全的目標代理程式。
  • 對於任何必須保持沙箱化的工作流程,請以 sandbox: "require" 呼叫 sessions_spawn(預設值為 inherit)。
  • 當目標子執行階段未沙箱化時,sandbox: "require" 會快速失敗。

瀏覽器控制風險

啟用瀏覽器控制會讓模型具備驅動真實瀏覽器的能力。 如果該瀏覽器設定檔已包含登入工作階段,模型就能存取那些帳戶與資料。請將瀏覽器設定檔視為敏感狀態
  • 偏好為代理程式使用專用設定檔(預設的 openclaw 設定檔)。
  • 避免將代理程式指向你個人日常使用的設定檔。
  • 除非你信任沙箱化代理程式,否則保持主機瀏覽器控制停用。
  • 獨立的 loopback 瀏覽器控制 API 只遵守共享密鑰驗證(gateway token bearer 驗證或 gateway 密碼)。它不會使用 trusted-proxy 或 Tailscale Serve 身分標頭。
  • 將瀏覽器下載內容視為不受信任的輸入;偏好使用隔離的下載目錄。
  • 如可行,請在代理程式設定檔中停用瀏覽器同步/密碼管理員(降低影響範圍)。
  • 對於遠端 gateway,請假設「瀏覽器控制」等同於「操作者可存取」該設定檔可到達的任何內容。
  • 保持 Gateway 與 node 主機僅限 tailnet;避免將瀏覽器控制連接埠暴露到 LAN 或公開網際網路。
  • 不需要瀏覽器代理路由時請停用它(gateway.nodes.browser.mode="off")。
  • Chrome MCP 現有工作階段模式並不「更安全」;它可以在該主機 Chrome 設定檔可到達的任何地方以你的身分行動。

瀏覽器 SSRF 政策(預設嚴格)

OpenClaw 的瀏覽器導覽政策預設嚴格:除非你明確選擇加入,否則私人/內部目的地會保持封鎖。
  • 預設值:browser.ssrfPolicy.dangerouslyAllowPrivateNetwork 未設定,因此瀏覽器導覽會持續封鎖私人/內部/特殊用途目的地。
  • 舊版別名:browser.ssrfPolicy.allowPrivateNetwork 仍會被接受以維持相容性。
  • 選擇加入模式:將 browser.ssrfPolicy.dangerouslyAllowPrivateNetwork: true 設定為允許私人/內部/特殊用途目的地。
  • 在嚴格模式中,使用 hostnameAllowlist(像 *.example.com 這樣的模式)和 allowedHostnames(精確主機例外,包括像 localhost 這樣被封鎖的名稱)來設定明確例外。
  • 會在請求前檢查導覽,並在導覽後對最終 http(s) URL 做最佳努力重新檢查,以降低以重新導向為基礎的轉向。
嚴格政策範例:
{
  browser: {
    ssrfPolicy: {
      dangerouslyAllowPrivateNetwork: false,
      hostnameAllowlist: ["*.example.com", "example.com"],
      allowedHostnames: ["localhost"],
    },
  },
}

個別代理程式存取設定檔(多代理程式)

透過多代理程式路由,每個代理程式都可以擁有自己的沙箱 + 工具政策: 使用這項能力為每個代理程式提供完整存取唯讀無存取。 完整細節與優先順序規則請參閱多代理程式沙箱與工具 常見使用情境:
  • 個人代理程式:完整存取,無沙箱
  • 家庭/工作代理程式:沙箱化 + 唯讀工具
  • 公開代理程式:沙箱化 + 無檔案系統/shell 工具

範例:完整存取(無沙箱)

{
  agents: {
    list: [
      {
        id: "personal",
        workspace: "~/.openclaw/workspace-personal",
        sandbox: { mode: "off" },
      },
    ],
  },
}

範例:唯讀工具 + 唯讀工作區

{
  agents: {
    list: [
      {
        id: "family",
        workspace: "~/.openclaw/workspace-family",
        sandbox: {
          mode: "all",
          scope: "agent",
          workspaceAccess: "ro",
        },
        tools: {
          allow: ["read"],
          deny: ["write", "edit", "apply_patch", "exec", "process", "browser"],
        },
      },
    ],
  },
}

範例:無檔案系統/shell 存取(允許提供者訊息傳遞)

{
  agents: {
    list: [
      {
        id: "public",
        workspace: "~/.openclaw/workspace-public",
        sandbox: {
          mode: "all",
          scope: "agent",
          workspaceAccess: "none",
        },
        // Session tools can reveal sensitive data from transcripts. By default OpenClaw limits these tools
        // to the current session + spawned subagent sessions, but you can clamp further if needed.
        // See `tools.sessions.visibility` in the configuration reference.
        tools: {
          sessions: { visibility: "tree" }, // self | tree | agent | all
          allow: [
            "sessions_list",
            "sessions_history",
            "sessions_send",
            "sessions_spawn",
            "session_status",
            "whatsapp",
            "telegram",
            "slack",
            "discord",
          ],
          deny: [
            "read",
            "write",
            "edit",
            "apply_patch",
            "exec",
            "process",
            "browser",
            "canvas",
            "nodes",
            "cron",
            "gateway",
            "image",
          ],
        },
      },
    ],
  },
}

事件回應

如果你的 AI 做了不良操作:

控制

  1. **停止它:**停止 macOS app(如果它監督 Gateway)或終止你的 openclaw gateway 程序。
  2. **關閉暴露:**將 gateway.bind: "loopback" 設定好(或停用 Tailscale Funnel/Serve),直到你了解發生了什麼。
  3. **凍結存取:**將有風險的 DM/群組切換到 dmPolicy: "disabled" / 要求提及,並移除你曾設定的 "*" 全部允許項目。

輪替(如果機密外洩,請假設已遭入侵)

  1. 輪替 Gateway 驗證(gateway.auth.token / OPENCLAW_GATEWAY_PASSWORD)並重新啟動。
  2. 在任何可呼叫 Gateway 的機器上輪替遠端用戶端機密(gateway.remote.token / .password)。
  3. 輪替提供者/API 憑證(WhatsApp 憑證、Slack/Discord token、auth-profiles.json 中的模型/API 金鑰,以及使用時的加密機密 payload 值)。

稽核

  1. 檢查 Gateway 記錄:/tmp/openclaw/openclaw-YYYY-MM-DD.log(或 logging.file)。
  2. 檢閱相關的逐字稿:~/.openclaw/agents/<agentId>/sessions/*.jsonl
  3. 檢閱最近的設定變更(任何可能擴大存取範圍的內容:gateway.bindgateway.auth、DM/群組政策、tools.elevated、Plugin 變更)。
  4. 重新執行 openclaw security audit --deep,並確認關鍵發現已解決。

收集報告資料

  • 時間戳記、gateway 主機 OS + OpenClaw 版本
  • 工作階段逐字稿 + 簡短記錄尾端(遮蔽後)
  • 攻擊者傳送了什麼 + 代理程式做了什麼
  • Gateway 是否暴露到 loopback 之外(LAN/Tailscale Funnel/Serve)

機密掃描

CI 會在儲存庫上執行 pre-commit detect-private-key hook。如果它 失敗,請移除或輪替已提交的金鑰材料,然後在本機重現:
pre-commit run --all-files detect-private-key

回報安全性問題

在 OpenClaw 中發現漏洞?請負責任地回報:
  1. Email:security@openclaw.ai
  2. 修復前請不要公開發布
  3. 我們會致謝你(除非你希望匿名)