Gateway
セキュリティ
適用範囲:パーソナルアシスタントのセキュリティモデル
- サポート対象:Gateway ごとに 1 ユーザー/1 信頼境界(境界ごとに 1 OS ユーザー/ホスト/VPS を推奨)。
- サポート対象外:相互に信頼していないユーザーや敵対的なユーザーが、1 つの共有 Gateway/エージェントを使用する構成。
- 敵対的ユーザーを分離するには、Gateway を分ける必要があります(理想的には OS ユーザー/ホストも分けます)。
- 信頼されていない複数のユーザーが、ツールを有効化した 1 つのエージェントにメッセージを送信できる場合、そのエージェントに委任されたツール権限を共有することになります。
- 誰かが Gateway ホストの状態/設定(
~/.openclaw、openclaw.jsonを含む)を変更できる場合、その人物を信頼されたオペレーターとして扱ってください。 - 1 つの Gateway 内では、認証済みオペレーターのアクセスは信頼されたコントロールプレーンのロールであり、ユーザーごとのテナントロールではありません。
sessionKey(セッション ID、ラベル)はルーティングセレクターであり、認可トークンではありません。
複数のユーザーまたは組織をホストしますか?Gateway を共有せず、テナントごとに分離された Gateway セルを 1 つずつ実行してください。マルチテナントホスティングを参照してください。
リモートアクセス、DM ポリシー、リバースプロキシ、または公開範囲を変更する前に、事前確認/ロールバック用チェックリストとして Gateway 公開ランブックを確認してください。
openclaw security audit
設定変更後、またはネットワークサーフェスを公開する前に、次を実行してください。
openclaw security auditopenclaw security audit --deep # 稼働中の Gateway のプローブを試行openclaw security audit --fix # 安全な修復を適用openclaw security audit --json--fix の対象範囲は意図的に限定されています。オープンなグループポリシーを許可リストに切り替え、logging.redactSensitive: "tools" を復元し、状態/設定/インクルードファイルの権限(600 ファイル、700 ディレクトリ)を厳格化します。また、Windows では POSIX の chmod の代わりに ACL リセットを使用します。
監査で確認する項目(概要)
- 受信アクセス - DM/グループポリシー、許可リスト:見知らぬ人物がボットを起動できないか?
- ツールの影響範囲 - 昇格ツール+オープンなルーム:プロンプトインジェクションがシェル/ファイル/ネットワーク操作につながる可能性はないか?
- 実行時のファイルシステム設定のずれ - ファイルシステムを変更するツールが拒否されている一方で、
exec/processがサンドボックス制約なしで利用可能なままになっていないか。 - 実行承認設定のずれ -
security="full"、autoAllowSkills、strictInlineEvalのないインタープリター許可リスト。security="full"単独では、バグの証明ではなく、広範なセキュリティ態勢に関する警告です。これは信頼されたパーソナルアシスタント構成で選択されるデフォルトです。脅威モデルで承認または許可リストによるガードレールが必要な場合にのみ厳格化してください。 - ネットワーク公開 - Gateway のバインド/認証、Tailscale Serve/Funnel、脆弱または短い認証トークン。
- ブラウザー制御の公開 - リモート Node、リレーポート、リモート CDP エンドポイント。
- ローカルディスクの衛生状態 - 権限、シンボリックリンク、設定インクルード、同期フォルダーのパス。
- Plugins - 明示的な許可リストなしでの読み込み。
- ポリシー設定のずれ - サンドボックスの Docker 設定が構成されているのに、サンドボックスモードがオフになっている状態。実際に機能するように見えても、ペイロード内のシェルテキストではなく、完全一致するコマンド ID(例:
system.run)にしか一致しないgateway.nodes.commands.denyエントリ。危険なgateway.nodes.commands.allowエントリ。グローバルなtools.profile="minimal"がエージェントごとに上書きされている状態。許容的なポリシー下で Plugin 所有のツールにアクセスできる状態。 - ランタイム想定のずれ -
tools.exec.hostのデフォルトが現在はautoであるにもかかわらず、暗黙的な実行が依然としてsandboxを意味すると想定している状態、またはサンドボックスモードがオフのときにtools.exec.host="sandbox"を設定している状態。 - モデルの衛生状態 - 設定されたレガシーモデルについて警告します(ソフト警告であり、強制的なブロックではありません)。
各検出項目には、構造化された checkId(例:gateway.bind_no_auth、tools.exec.security_full_configured)があります。プレフィックス:fs.*(権限)、gateway.*(バインド/認証/Tailscale/Control UI/信頼済みプロキシ)、hooks.*/browser.*/sandbox.*/tools.exec.*(サーフェスごとの強化)、plugins.*/skills.*(サプライチェーン)、security.exposure.*(アクセスポリシー×ツールの影響範囲)。重大度と自動修正の対応状況を含む完全なカタログについては、セキュリティ監査のチェック項目を参照してください。形式検証も参照してください。
検出項目をトリアージする際の優先順位
- 「オープン」な項目+ツールが有効:最初に DM/グループを制限し(ペアリング/許可リスト)、その後でツールポリシー/サンドボックスを厳格化します。
- パブリックネットワークへの公開(LAN バインド、Funnel、認証なし):直ちに修正してください。
- ブラウザー制御のリモート公開:オペレーターアクセスと同様に扱います(tailnet のみに限定し、Node を意図的にペアリングし、公開しない)。
- 権限:状態/設定/認証情報/認証データをグループまたは全ユーザーから読み取り可能にしてはいけません。
- Plugins:明示的に信頼するものだけを読み込んでください。
- モデルの選択:ツールを備えたすべてのボットでは、最新の命令耐性を強化したモデルを優先してください。
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 を分離し、コントロールプレーン/ランタイムツールをデフォルトで無効化します。そこから、信頼されたエージェントごとにツールを選択的に再有効化してください。
チャット駆動のエージェントターンに組み込まれたベースライン:所有者以外の送信者は、設定に関係なく cron または gateway ツールを使用できません。
リクエスター単位の制御とプロンプトコンテキスト
tools.toolsBySender、送信者の所有権、所有者専用のツール一覧は、現在のターンの起点となったリクエスターに対して評価されます。これらは、引用テキスト、以前の共有ルーム履歴、転送されたコンテンツ、取得したコンテンツ、添付ファイル、ツール結果、その他のプロンプト入力を含め、そのモデルプロンプト内の他のコンテンツを認証または無害化するものではありません。そのため、別の人物からのコンテンツがそのターンのコンテキストに含まれている場合、所有者が起動したターンに影響を与える可能性があります。
これらの制御は、リクエスターの直接的な能力を低減する多層防御として扱い、敵対的なマルチユーザー分離として扱わないでください。contextVisibility を使用して、サポート対象のチャンネルから提供されるコンテキストをフィルタリングし、ツールを制限してエージェントをサンドボックス化してください。参加者同士が相互に敵対的である場合は、Gateway を分け、理想的には OS ユーザーまたはホストも分けてください。
信頼境界マトリックス
リスク報告をトリアージするための簡易モデル:
| 境界または制御 | 意味 | よくある誤解 |
|---|---|---|
gateway.auth(トークン/パスワード/信頼済みプロキシ/デバイス認証) |
Gateway API の呼び出し元を認証する | 「安全性を確保するには、すべてのフレームでメッセージごとの署名が必要」 |
sessionKey |
コンテキスト/セッション選択用のルーティングキー | 「セッションキーはユーザー認証境界である」 |
| プロンプト/コンテンツのガードレール | モデル悪用のリスクを低減する | 「プロンプトインジェクションだけで認証バイパスが証明される」 |
canvas.eval/ブラウザーの evaluate |
有効化時に意図されたオペレーター権限 | 「この信頼モデルでは、あらゆる JS eval プリミティブが自動的に脆弱性となる」 |
ローカル TUI の ! シェル |
オペレーターが明示的に起動するローカル実行 | 「ローカルシェルの便利コマンドはリモートインジェクションである」 |
| Node のペアリングと Node コマンド | ペアリング済みデバイスでのオペレーターレベルのリモート実行 | 「リモートデバイス制御は、デフォルトで信頼されていないユーザーアクセスとして扱うべき」 |
gateway.nodes.pairing.autoApproveCidrs |
オプトイン式の信頼済みネットワーク Node 登録ポリシー | 「デフォルトで無効な許可リストは、自動的にペアリングの脆弱性となる」 |
gateway.nodes.pairing.sshVerify |
オペレーターの SSH を介した鍵検証済み Node 登録 | 「デフォルトで有効な自動承認は、自動的にペアリングの脆弱性となる」 |
設計上、脆弱性ではないもの
対応不要としてクローズされる一般的な検出項目
- ポリシー、認証、またはサンドボックスのバイパスを伴わない、プロンプトインジェクションのみの攻撃チェーン。
- 1 つの共有ホストまたは設定上で、敵対的なマルチテナント運用を前提とする主張。
- 共有 Gateway 構成における通常のオペレーター読み取りパスへのアクセス(例:
sessions.list/sessions.preview/chat.history)を IDOR と分類するもの。 - localhost のみのデプロイに関する検出項目(例:loopback のみの Gateway で HSTS が欠如していること)。
- このリポジトリに存在しない受信パスについての、Discord 受信 Webhook 署名に関する検出項目。
- Node ペアリングメタデータを、
system.runのための隠された第 2 のコマンド単位承認レイヤーとして扱うもの。実際の実行境界は、Gateway のグローバルな Node コマンドポリシーと、Node 自体の実行承認です。 gateway.nodes.pairing.sshVerifyがデフォルトで有効であることを理由に、脆弱性として扱うもの。ネットワーク上の近接性または SSH 到達可能性だけで承認されることはありません。Gateway は SSH 経由(BatchMode、厳格なホスト鍵)でデバイス ID を読み戻し、保留中のリクエストとデバイス鍵が完全に一致する場合にのみ承認します。そのためには、接続用の鍵ペアが、オペレーターの管理するホスト上のオペレーターアカウントにすでに存在している必要があります。プローブはプライベート/CGNAT 送信元アドレスに限定され、信頼済み CIDR の適格性に関する最低条件(スコープのない新規role: nodeのみ)を共有し、sshVerify: falseによりこの機能を無効化できます。gateway.nodes.pairing.autoApproveCidrs単独を脆弱性として扱うもの。これはデフォルトで無効であり、CIDR/IP エントリの明示的な指定が必要で、要求スコープのない初回のrole: nodeペアリングにのみ適用されます。また、オペレーター/ブラウザー/Control UI、WebChat、ロール/スコープのアップグレード、メタデータまたは公開鍵の変更、同一ホストの loopback 信頼済みプロキシヘッダーパス(loopback の信頼済みプロキシ認証が有効な場合を含む)を自動承認することはありません。sessionKeyを認証トークンとして扱う「ユーザーごとの認可が欠如している」という検出項目。
Gateway と Node の信頼関係
Gateway と Node は、役割の異なる 1 つのオペレーター信頼ドメインとして扱ってください。
- Gateway: コントロールプレーンとポリシーのサーフェス(
gateway.auth、ツールポリシー、ルーティング)。 - Node: その Gateway とペアリングされたリモート実行サーフェス(コマンド、デバイス操作、ホストローカルの機能)。
- Gateway に対して認証された呼び出し元は Gateway のスコープで信頼されます。ペアリング後、Node の操作はその Node に対する信頼済みオペレーター操作として扱われます。オペレーターのスコープを参照してください。
- 共有 Gateway トークン/パスワードで認証された直接のループバックバックエンドクライアントは、ユーザーデバイスのアイデンティティを提示せずに内部コントロールプレーン RPC を実行できます。これはリモートまたはブラウザーのペアリングを回避するものではありません。ネットワーククライアント、Node クライアント、デバイストークンクライアント、明示的なデバイスアイデンティティには、引き続きペアリングとスコープ昇格の強制が適用されます。
- 実行承認(許可リスト+確認)はオペレーターの意図を保護するためのガードレールであり、敵対的なマルチテナント分離ではありません。正確なリクエストコンテキストと、ベストエフォートで直接指定されたローカルファイルオペランドに紐づきますが、あらゆるランタイム/インタープリターローダーのパスを意味論的にモデル化するものではありません。強固な境界にはサンドボックス化とホスト分離を使用してください。
- 信頼された単一オペレーター向けのデフォルト:
gateway/nodeでのホスト実行は、承認プロンプトなしで許可されます(security="full"、ask="off")。これは意図された UX であり、それ自体は脆弱性ではありません。
敵対的ユーザーを分離するには、OS ユーザー/ホストごとに信頼境界を分け、個別の Gateway を実行してください。
脅威モデル
AI アシスタントは、任意のシェルコマンドの実行、ファイルの読み書き、ネットワークサービスへのアクセス、および(チャンネルへのアクセス権が付与されている場合)誰にでもメッセージを送信できます。メッセージを送る人は、悪意のある操作を行わせるよう仕向けたり、ソーシャルエンジニアリングによってデータへのアクセスを得ようとしたり、インフラストラクチャの詳細を探ったりする可能性があります。
ここで発生する障害の多くは特殊なエクスプロイトではなく、「誰かがボットにメッセージを送り、ボットが依頼されたとおりに実行した」というものです。OpenClaw の方針は、優先順に次のとおりです。
- 最初にアイデンティティ - ボットと対話できる相手を決定します(DM ペアリング/許可リスト/明示的な「open」)。
- 次にスコープ - ボットが操作できる範囲を決定します(グループ許可リスト+メンションゲート、ツール、サンドボックス化、デバイス権限)。
- 最後にモデル - モデルは操作され得るものと想定し、操作されても影響範囲が限定されるように設計します。
DM アクセス: ペアリング、許可リスト、オープン、無効
DM に対応するすべてのチャンネルは dmPolicy(または *.dm.policy)をサポートし、メッセージが処理される前に受信 DM を制御します。
| ポリシー | 動作 |
|---|---|
pairing |
デフォルト。不明な送信者にはペアリングコードが発行され、承認されるまでボットは無視します。コードは 1 時間後に期限切れになります。新しいリクエストが作成されるまで、DM を繰り返してもコードは再送されません。保留中のリクエストはチャンネルごとに 3 件までです。 |
allowlist |
不明な送信者をブロックし、ペアリングのハンドシェイクは行いません。 |
open |
誰でも DM を送信できます(公開)。チャンネルの許可リストに "*" を含める必要があります(明示的なオプトイン)。 |
disabled |
受信 DM を完全に無視します。 |
openclaw pairing list <channel>openclaw pairing approve <channel> <code>詳細とディスク上のファイル: ペアリング
dmPolicy="open" と groupPolicy="open" は最後の手段として扱ってください。ルームの全メンバーを完全に信頼している場合を除き、ペアリング+許可リストを優先してください。
許可リスト(2 層)
- DM 許可リスト(
allowFrom/channels.discord.allowFrom/channels.slack.allowFrom、レガシー:channels.discord.dm.allowFrom、channels.slack.dm.allowFrom): ボットに DM を送信できる相手。dmPolicy="pairing"の場合、承認内容は~/.openclaw/credentials/<channel>-allowFrom.json(デフォルトアカウント)または<channel>-<accountId>-allowFrom.json(デフォルト以外のアカウント)に書き込まれ、設定の許可リストとマージされます。 - グループ許可リスト(チャンネル固有): ボットが受け付けるグループ/チャンネル/ギルド。
channels.whatsapp.groups、channels.telegram.groups、channels.imessage.groups:requireMentionなどのグループ単位のデフォルト。設定するとグループ許可リストとしても機能します(すべてを許可する動作を維持するには"*"を含めます)。agents.entries.*.groupChat.mentionPatterns(例:["@openclaw", "@mybot"])でメンショントリガーをカスタマイズすると、requireMentionが独自のボット名を対象にゲートできます。groupPolicy="allowlist"+groupAllowFrom: グループセッション内でボットをトリガーできる相手を制限します(WhatsApp/Telegram/Signal/iMessage/Microsoft Teams)。channels.discord.guilds/channels.slack.channels: サーフェス単位の許可リスト+メンションのデフォルト。- 確認順序: 最初に
groupPolicy/グループ許可リスト、次にメンション/返信によるアクティベーション。ボットのメッセージに返信すること(暗黙的なメンション)でgroupAllowFromを回避することはできません。
DM セッションの分離(マルチユーザーモード)
デフォルトでは、OpenClaw はデバイス間の継続性を保つため、すべての DM をメインセッションにルーティングします。複数の人がボットに DM を送信できる場合(オープン DM または複数人の許可リスト)は、DM セッションを分離してください。
{ session: { dmScope: "per-channel-peer" } }session.dmScope の値:
| 値 | スコープ |
|---|---|
main(設定のデフォルト) |
すべての DM が 1 つのセッションを共有します。 |
per-channel-peer |
チャンネル+送信者の各組み合わせに、分離された DM コンテキストを割り当てます(セキュア DM モード)。 |
per-account-channel-peer |
上記と同様ですが、さらにアカウントごとに分割します(複数アカウント対応チャンネル)。 |
per-peer |
同じ種類の全チャンネルにわたり、送信者ごとに 1 つのセッションを割り当てます。 |
ローカル CLI のオンボーディングでは、明示的な session.dmScope は保持され、それ以外の場合は未設定のままとなるため、"main" のデフォルトが適用されます。つまり、チャンネルをまたぐすべてのダイレクトメッセージが、エージェントの継続的なメインセッションを共有します(パーソナルエージェントのデフォルト)。共有またはマルチユーザーの受信トレイでは session.dmScope: "per-channel-peer" を設定してください。openclaw security audit は、マルチユーザーの DM トラフィックを検出すると分離を推奨します。
これはメッセージングコンテキストの境界であり、ホスト管理者の境界ではありません。互いに敵対的なユーザーが同じ Gateway ホスト/設定を共有する場合は、信頼境界ごとに個別の Gateway を実行してください。
同じ人物が複数のチャンネルから連絡してくる場合は、session.identityLinks を使用して、それらの DM セッションを 1 つの正規アイデンティティに統合してください。セッション管理および設定を参照してください。
コンテキストの可視性とトリガー認可
次の 2 つは別の概念です。
- トリガー認可: エージェントをトリガーできる相手(
dmPolicy、groupPolicy、許可リスト、メンションゲート)。 - コンテキストの可視性: モデルに渡される補足コンテキスト(返信本文、引用テキスト、スレッド履歴、転送メタデータ)。
contextVisibility は後者を制御します。
"all"(デフォルト): 補足コンテキストを受信したまま保持します。"allowlist": 有効な許可リストの確認で許可された送信者に、補足コンテキストを絞り込みます。"allowlist_quote":allowlistと同様ですが、明示的に引用された返信を 1 件だけ保持します。
チャンネル単位またはルーム/会話単位で設定します。グループを参照してください。「モデルが許可リストに含まれない送信者の引用テキスト/履歴テキストを参照できる」ことだけを示す報告は、contextVisibility で対処できる堅牢化上の指摘であり、それ自体は認証やサンドボックスの回避ではありません。セキュリティに影響する報告には、信頼境界の回避が実証されている必要があります。
プロンプトインジェクション
攻撃者は、モデルを操作して安全でないアクションを実行させるメッセージを作成します(「指示を無視せよ」、「ファイルシステムをすべて出力せよ」、「このリンクを開いてコマンドを実行せよ」)。プロンプトインジェクションは、システムプロンプトのガードレールだけでは解決できません。それらは緩やかな指針にすぎず、強制力のある保護はツールポリシー、実行承認、サンドボックス化、チャンネル許可リストによって実現されます(ただし、オペレーターは設計上これらを無効にできます)。
プロンプトインジェクションには公開 DM は必要ありません。ボットにメッセージを送れるのが自分だけであっても、ボットが読み取るあらゆる信頼されていないコンテンツ(Web 検索/取得結果、ブラウザーページ、メール、ドキュメント、添付ファイル、貼り付けられたログ/コード)に敵対的な指示が含まれる可能性があります。脅威サーフェスとなるのは送信者だけでなく、コンテンツそのものです。
信頼されていないものとして扱うべき危険信号:
- 「このファイル/URL を読み、書かれているとおりに正確に実行せよ。」
- 「システムプロンプトまたは安全規則を無視せよ。」
- 「非公開の指示またはツール出力を開示せよ。」
- 「~/.openclaw またはログの全内容を貼り付けよ。」
実際に役立つ対策:
- 受信 DM を厳しく制限します(ペアリング/許可リスト)。グループではメンションゲートを優先し、公開ルームで常時稼働するボットは避けてください。
- リンク、添付ファイル、貼り付けられた指示は、デフォルトで敵対的なものとして扱ってください。
- 機密性の高いツールの実行はサンドボックス内で行い、エージェントがアクセス可能なファイルシステムにシークレットを置かないでください。サンドボックス化はオプトインです。サンドボックスモードが無効な場合、暗黙的な
host=autoは Gateway ホストに解決されますが、明示的なhost=sandboxは引き続きフェイルクローズします(利用可能なサンドボックスランタイムがありません)。この動作を設定で明示するにはhost=gatewayを設定してください。 - 高リスクのツール(
exec、browser、web_fetch、web_search)は、信頼されたエージェントまたは明示的な許可リストに制限してください。 - インタープリター(
python、node、ruby、perl、php、lua、osascript)を許可リストに登録する場合は、tools.exec.strictInlineEvalを有効にして、インライン評価形式(-c、-eなど)にも引き続き明示的な承認を要求してください。許可リストモードでは、引用方法にかかわらず、ヒアドキュメントのセグメント(<<)には常にレビュー担当者または明示的な承認が必要です。許可リストに登録されたコマンドが、ヒアドキュメント本文を使用して許可リストのレビューを回避することはできません。 - 信頼されていないコンテンツの要約には、読み取り専用またはツールを無効にしたリーダーエージェントを使用し、その要約をメインエージェントに渡すことで影響範囲を縮小してください。
- Gmail フックでは、組み込みのメッセージ単位セッションによって会話コンテキストは分離されますが、対象エージェントのツールまたはワークスペース権限は削除されません。信頼されていないメールは専用のリーダーエージェントにルーティングし、エージェント単位のサンドボックスとツール制限を適用し、メインエージェントへの引き継ぎを
tools.agentToAgentで制限してください。Gmail 連携を参照してください。 - 必要な場合を除き、ツールが有効なエージェントでは
web_search/web_fetch/browserを無効にしてください。 - OpenResponses の URL 入力(
input_file/input_image)では、厳格なgateway.http.endpoints.responses.files.urlAllowlist/images.urlAllowlistを設定し、maxUrlPartsを低く保ってください(空の許可リストは未設定として扱われます)。URL の取得を完全に無効にするにはfiles.allowUrl: false/images.allowUrl: falseを使用してください。 - プロンプトにシークレットを含めず、代わりに Gateway ホスト上の環境変数/設定を介して渡してください。
モデルの選択は重要です。 プロンプトインジェクション耐性はモデル階層間で一様ではありません。小型で安価なモデルほど、敵対的なプロンプトによるツールの悪用や指示の乗っ取りを受けやすくなります。
- ツールを実行したり、ファイルやネットワークにアクセスしたりできるボットには、最新世代の最上位モデルを使用してください。
- ツールが有効なエージェントや信頼できない受信トレイには、古い、性能の低い、または小型のモデル階層を使用しないでください。
- 小型モデルを使用せざるを得ない場合は、影響範囲を縮小してください。読み取り専用ツール、強力なサンドボックス化、最小限のファイルシステムアクセス、厳格な許可リストを使用します。すべてのセッションでサンドボックス化を有効にし、入力が厳密に制御されていない限り、
web_search/web_fetch/browserを無効にしてください。 - 信頼できる入力のみを扱い、ツールを使用しないチャット専用のパーソナルアシスタントであれば、通常は小型モデルでも問題ありません。
外部コンテンツと信頼できない入力のラッピング
OpenResponses の input_file テキストは、Gateway がローカルでデコードする場合でも、信頼できない外部コンテンツとして挿入されます。このブロックには、<<<EXTERNAL_UNTRUSTED_CONTENT ...>>> 境界マーカーと Source: External メタデータが含まれます(この経路では、ほかの場所で使用される長い SECURITY NOTICE: バナーは省略されます)。メディア理解機能が添付文書からテキストを抽出してメディアプロンプトに追加する場合も、同じマーカーベースのラッピングが適用されます。
OpenClaw は、ラッピングされた外部コンテンツとメタデータがモデルに到達する前に、一般的なセルフホスト型 LLM のチャットテンプレート用特殊トークンリテラル(Qwen/ChatML、Llama、Gemma、Mistral、Phi、GPT-OSS のロール/ターントークン)も除去します。セルフホスト型の OpenAI 互換バックエンド(vLLM、SGLang、TGI、LM Studio、カスタム Hugging Face トークナイザースタック)は、ユーザーコンテンツ内の <|im_start|> や <|start_header_id|> のようなリテラル文字列を、構造的なチャットテンプレートトークンとしてトークン化することがあります。このサニタイズがなければ、取得したページ、メール本文、またはファイル内容ツールの出力に含まれる信頼できないテキストが、偽の assistant/system ロール境界を作り出す可能性があります。サニタイズは外部コンテンツのラッピング層で行われるため、取得/読み取りツールと受信チャネルコンテンツ全体に一律に適用されます。ホスト型プロバイダー(OpenAI、Anthropic)は、すでに独自のリクエスト側サニタイズを適用しています。外部コンテンツのラッピングを有効に保ち、利用可能であれば特殊トークンを分割またはエスケープするバックエンド設定を優先してください。
送信されるモデル応答には別のサニタイザーがあり、最終的なチャネル配信境界で、漏洩した <tool_call>、<function_calls>、<system-reminder>、<previous_response>、および類似の内部スキャフォールディングをユーザーに表示される応答から除去します。
これは dmPolicy、許可リスト、exec の承認、サンドボックス化、または contextVisibility の代わりにはなりません。これは特定のトークナイザー層のバイパスを1つ塞ぐものです。
バイパスフラグ(本番環境では無効に保つ)
hooks.mappings[].allowUnsafeExternalContenthooks.gmail.allowUnsafeExternalContent- Cron ペイロードフィールド
allowUnsafeExternalContent
厳密に範囲を限定したデバッグでのみ一時的に有効にしてください。有効にする場合は、そのエージェントを隔離してください(サンドボックス、最小限のツール、専用セッション名前空間)。
フックのペイロードは、管理下のシステムから配信される場合でも信頼できないコンテンツです(メール、文書、Web コンテンツにはプロンプトインジェクションが含まれる可能性があります)。性能の低いモデル階層はこのリスクを高めます。フック駆動の自動化では、高性能な最新モデル階層を優先し、ツールポリシーを厳格に保ち(tools.profile: "messaging" またはそれ以上に厳しく)、可能な限りサンドボックス化を使用してください。
グループでの推論と詳細出力
/reasoning、/verbose、/trace は、公開チャネル向けではない内部推論、ツール出力、または Plugin の診断情報を露出する可能性があります。これらには、ツール引数、URL、Plugin の診断情報、モデルが参照したデータが含まれることがあります。公開ルームでは無効に保ち、信頼できる DM または厳密に制御されたルームでのみ有効にしてください。
コマンドの認可
スラッシュコマンドとディレクティブは、チャネルの許可リスト/ペアリングと commands.useAccessGroups から特定される、認可済みの送信者に対してのみ処理されます(設定およびスラッシュコマンドを参照)。チャネルの許可リストが空であるか、"*" が含まれている場合、そのチャネルでは事実上コマンドが誰にでも開放されます。
/exec は認可済みオペレーター向けのセッション限定の便宜機能です。設定への書き込みや、ほかのセッションの変更は行いません。
コントロールプレーンツール
次の2つの組み込みツールは、引き続きコントロールプレーンに関する機密性が高いものです。
gatewayは、config.schema.lookup/config.getを使用して設定を読み取ります。設定の書き込み、OpenClaw の更新、Gateway の再起動はできません。cronは、元のチャット/タスクの終了後も実行され続けるスケジュール済みジョブを作成します。
gateway ツールは、設定の読み取りによってシークレットやホストトポロジーが露出する可能性があるため、引き続き所有者専用です。エージェントは、永続的な設定またはライフサイクルの変更を openclaw 委任ツール経由で要求します。OpenClaw はそれらを型付き操作にマッピングし、適用前に人間の承認を要求します。OpenClaw セットアップエージェントを参照してください。
信頼できないコンテンツを扱うエージェント/サーフェスでは、これらをデフォルトで拒否してください。
{ tools: { deny: ["gateway", "cron", "sessions_spawn", "sessions_send"], },}commands.restart=false は、/restart および外部からの SIGUSR1 再起動要求を無効にします。gateway エージェントツールには再起動アクションがありません。
Node の実行(system.run)
macOS Node がペアリングされている場合、Gateway はその Node 上で system.run を呼び出せます。これは、その Mac 上でのリモートコード実行です。
- Node のペアリング(承認とトークン)が必要です。ペアリングでは Node のアイデンティティ/信頼を確立してトークンを発行しますが、コマンドごとの承認手段ではありません。
- Gateway は、
gateway.nodes.commands.allow/gateway.nodes.commands.denyを介して大まかなグローバル Node コマンドポリシーを適用します。拒否リストが照合するのは Node コマンドの正確な名前(例:system.run)のみで、コマンドペイロード内のシェルテキストではありません。異なるコマンドリストを通知する再接続中の Node は、Gateway のグローバルポリシーと Node 自身の exec 承認が引き続き境界を強制している限り、それ自体では脆弱性ではありません。 - Node ごとの
system.runポリシーは、その Node 独自の exec 承認ファイル(exec.approvals.node.*)です。Mac 上の Settings -> Exec approvals(security + ask + allowlist)で制御され、Gateway のグローバルなコマンド ID ポリシーより厳しくすることも緩くすることもできます。 security="full"とask="off"を実行する Node は、デフォルトの信頼済みオペレーターモデルに従います。デプロイ環境でより厳しい方針が必要でない限り、これは想定された動作であり、バグではありません。- 承認モードは、正確なリクエストコンテキストと、可能であれば具体的なローカルスクリプト/ファイルのオペランド1つに関連付けられます。インタープリター/ランタイムコマンドに対して正確に1つの直接的なローカルファイルを OpenClaw が特定できない場合、完全な意味論的網羅を保証するのではなく、承認に基づく実行を拒否します。
host=nodeでは、承認に基づく実行時に、正規化され準備済みのsystemRunPlanも保存されます。後続の承認済み転送では保存された計画が再利用され、承認リクエストの作成後に呼び出し元がコマンド/cwd/セッションコンテキストを編集すると、Gateway の検証によって拒否されます。- リモート実行を完全に無効にするには、security を
denyに設定し、その Mac の Node ペアリングを解除します。
動的 Skills(ウォッチャー/リモート Node)
OpenClaw はセッションの途中で Skills リストを更新できます。Skills ウォッチャーは SKILL.md が変更されると、次のエージェントターンでスナップショットを更新します。また、macOS Node が接続されると、バイナリのプロービングに基づいて macOS 専用の Skills が利用可能になることがあります。Skills フォルダーは信頼できるコードとして扱い、変更できるユーザーを制限してください。
Plugins
Plugins は Gateway と同じプロセス内で実行されるため、信頼できるコードとして扱ってください。
- 信頼できるソースからのみインストールしてください。明示的な
plugins.allow許可リストを優先し、有効化前に Plugin の設定を確認し、Plugin の変更後は Gateway を再起動してください。 - Plugins のインストール/更新では実行可能コードが動作します。
- インストール先は、アクティブな Plugin インストールルート配下の Plugin ごとのディレクトリです。
- ClawHub パッケージと OpenClaw の同梱/公式カタログは信頼できるソースです。新しい任意の npm、
npm-pack:、git、ローカルパス/アーカイブ、またはマーケットプレイスソースでは、インストール前に警告が表示されます。非対話型インストールでは、そのソースを確認して信頼した後に--forceが必要です。--forceは出所を確認して上書きを許可しますが、security.installPolicyや残りのインストール安全チェックをバイパスするものではありません。更新では、すでに選択されているソースが再利用されます。 - OpenClaw は、インストール/更新中に組み込みのローカル危険コードブロックを実行しません。オペレーターが管理するローカルの許可/拒否判断には
security.installPolicyを使用し、診断スキャンにはopenclaw security audit --deepを使用してください。 - npm および git による Plugin のインストールでは、明示的なインストール/更新フロー中にのみ、パッケージマネージャーによる依存関係の収束が実行されます。ローカルパスとアーカイブは自己完結型パッケージとして扱われ、OpenClaw は
npm installを実行せずにそれらをコピーまたは参照します。 - 固定された完全一致バージョン(
@scope/pkg@1.2.3)を優先し、有効化する前に展開されたコードを確認してください。 --dangerously-force-unsafe-installは非推奨であり、インストール/更新の動作を変更しなくなりました。security.installPolicyを使用すると、オペレーターは信頼できるローカルコマンドを実行し、Skills と Plugin のインストールについてホスト固有の許可/拒否判断を行えます。このコマンドは、ソース素材のステージング後、インストールの続行前に実行され、ClawHub の Skills にも適用されます。また、非推奨の安全でないフラグによってバイパスされることはありません。
詳細: Plugins
サンドボックス化
専用ドキュメント: サンドボックス化
相互補完的な2つのアプローチがあります。
- Docker 内の完全な Gateway(コンテナ境界): Docker
- ツールサンドボックス(
agents.defaults.sandbox。ホスト Gateway とサンドボックスで隔離されたツール。デフォルトのバックエンドは Docker): サンドボックス化
サンドボックス内からのエージェントワークスペースへのアクセス(agents.defaults.sandbox.workspaceAccess):
"none"(デフォルト): ツールには~/.openclaw/sandboxes配下のサンドボックスワークスペースが見えます。エージェントワークスペースにはアクセスできません。"ro": エージェントワークスペースを/agentに読み取り専用でマウントします(write/edit/apply_patchは無効になります)。"rw": エージェントワークスペースを/workspaceに読み書き可能でマウントします。
追加の sandbox.docker.binds は、正規化および正準化されたソースパスに対して検証されます。ブロック対象パスの拒否リストには、/etc、/private/etc、/proc、/sys、/dev、/root、/boot、Docker ソケットを一般的に含むか参照するディレクトリ(それらの配下にある /run、/var/run、docker.sock)、および HOME の認証情報サブパス(.aws、.cargo、.config、.docker、.gnupg、.netrc、.npm、.ssh)が含まれます。親シンボリックリンクを利用する手法と正準化されたホームエイリアスは、既存の祖先を介して解決されたうえで再確認されるため、ブロック対象のルートに解決される場合は引き続き安全側に失敗します。
サブエージェント委任のガードレール
セッションツールを許可する場合は、委任されたサブエージェントの実行も境界に関する判断として扱ってください。
- エージェントが本当に委任を必要としない限り、
sessions_spawnを拒否します。 agents.defaults.subagents.allowAgentsおよびエージェントごとのagents.entries.*.subagents.allowAgentsオーバーライドは、安全であることが確認済みの対象エージェントのみに制限します。- サンドボックス化を維持する必要があるワークフローでは、
sessions_spawnをsandbox: "require"(デフォルトは"inherit")で呼び出します。対象の子ランタイムがサンドボックス化されていない場合、"require"は即座に失敗します。
読み取り専用モード
agents.defaults.sandbox.workspaceAccess: "ro"(ワークスペースへのアクセスも許可しない場合は "none")と、write、edit、apply_patch、exec、process などをブロックするツールの許可/拒否リストを組み合わせて、読み取り専用プロファイルを構築します。
tools.exec.applyPatch.workspaceOnly: true(デフォルト):サンドボックスが無効でも、apply_patchがワークスペースディレクトリ外で書き込みや削除を行うことを防ぎます。apply_patchがワークスペース外のファイルを操作することを意図的に許可する場合にのみ、falseを設定してください。tools.fs.workspaceOnly: true(任意):read/write/edit/apply_patchのパスと、ネイティブプロンプト画像の自動読み込みパスをワークスペースディレクトリに制限します。- ファイルシステムのルートは狭く保ってください。エージェント/サンドボックスのワークスペースにホームディレクトリのような広範なルートを使用すると、
~/.openclaw配下の状態や設定など、機密性の高いローカルファイルがファイルシステムツールに公開される可能性があるため、避けてください。
エージェントごとのアクセスプロファイル(マルチエージェント)
各エージェントには、フルアクセス、読み取り専用、アクセスなしのいずれかとなる独自のサンドボックスとツールポリシーを設定できます。優先順位のルールについては、マルチエージェントのサンドボックスとツールを参照してください。
一般的なパターン:個人用エージェント(フルアクセス、サンドボックスなし)、家族/仕事用エージェント(サンドボックス化+読み取り専用ツール)、公開エージェント(サンドボックス化+ファイルシステム/シェルツールなし)。
フルアクセス(サンドボックスなし)
{ 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"], }, }, ], },}ファイルシステム/シェルへのアクセスなし(プロバイダーのメッセージングは許可)
{ agents: { list: [ { id: "public", workspace: "~/.openclaw/workspace-public", sandbox: { mode: "all", scope: "agent", workspaceAccess: "none" }, tools: { // セッションツールによってトランスクリプトデータが公開される可能性があります。デフォルトのスコープは現在のセッション+生成したセッションです。 // 読み取りには、周囲のグループ認識を通じて監視している同一エージェントのグループも含まれます。 // 監視対象のセッションを除外するには、visibility: "self" を使用します。 sessions: { visibility: "tree" }, // self | tree | agent | all allow: [ "sessions_list", "sessions_history", "sessions_send", "sessions_spawn", "session_status", "discord", "slack", "telegram", "whatsapp", ], deny: [ "apply_patch", "browser", "canvas", "cron", "edit", "exec", "gateway", "image", "nodes", "process", "read", "write", ], }, }, ], },}ブラウザー制御のリスク
ブラウザー制御を有効にすると、モデルに実際のブラウザーを与えることになります。そのプロファイルにログイン済みのセッションがある場合、モデルはそれらのアカウントとデータにアクセスできます。ブラウザープロファイルは機密性の高い状態として扱ってください。
- エージェント専用のプロファイル(デフォルトの
openclawプロファイル)を推奨します。日常的に使用する個人プロファイルは避けてください。 - サンドボックス化されたエージェントを信頼している場合を除き、ホストブラウザーの制御を無効のままにしてください。
- スタンドアロンの loopback ブラウザー制御 API は共有シークレット認証(Gateway トークンの Bearer 認証または Gateway パスワード)のみを尊重し、信頼済みプロキシまたは Tailscale Serve の ID ヘッダーは使用しません。
- ブラウザーからのダウンロードは信頼できない入力として扱い、隔離されたダウンロードディレクトリを推奨します。
- 可能であれば、エージェントプロファイルでブラウザー同期とパスワードマネージャーを無効にしてください。
- リモート Gateway では、「ブラウザー制御」は、そのプロファイルから到達可能なあらゆるものへの「オペレーターアクセス」に相当します。
- Gateway と Node ホストは tailnet のみに制限し、ブラウザー制御ポートを LAN や公開インターネットに公開しないでください。
- 不要な場合は、ブラウザープロキシルーティングを無効にしてください(
gateway.nodes.browser.mode="off")。 - Chrome MCP の既存セッションモードは「より安全」ではありません。そのホストの Chrome プロファイルから到達可能なあらゆる場所で、ユーザー本人として操作できます。
- Gateway がブラウザーから離れた場所にある場合は、ブラウザーのマシンで Node ホストを実行し、Gateway にブラウザー操作をプロキシさせます(ブラウザーツールを参照)。Node のペアリングは管理者アクセスと同様に扱い、Gateway と Node ホストを同じ tailnet 上に保ち、リレー/制御ポートを LAN、公開インターネット、または Tailscale Funnel 経由で公開しないでください。
ブラウザーの SSRF ポリシー(デフォルトで厳格)
明示的にオプトインしない限り、プライベート/内部の宛先はブロックされたままです。
- デフォルト:
browser.ssrfPolicy.dangerouslyAllowPrivateNetworkは未設定であるため、プライベート/内部/特殊用途の宛先はブロックされたままです。従来のエイリアスallowPrivateNetworkも引き続き受け付けます。 - オプトイン:これらの宛先を許可するには、
dangerouslyAllowPrivateNetwork: trueを設定します。 - 厳格モードでは、明示的な例外として
hostnameAllowlist(*.example.comのようなパターン)とallowedHostnames(localhostのような本来はブロックされる名前を含む、ホストの完全一致による例外)を使用します。 - 直接ナビゲーションのリクエストは事前チェックされます。操作中および操作後の限定された猶予期間中、保護された Playwright の操作(クリック、座標クリック、ホバー、ドラッグ、スクロール、選択、キー押下、入力、フォーム入力、evaluate)は、ポリシーで拒否されたトップレベルおよびサブフレームのドキュメント読み込みを HTTP リクエストのバイト送信前にインターセプトし、その後、最終的な
http(s)URL をベストエフォートで再確認します。 - 管理対象の Chrome を新たに起動するたびに、OpenClaw はベストエフォートでネットワーク予測を無効化し、拒否された読み込みに対して Chromium で確認されている投機的な事前接続を抑止します。これは多層防御であり、ポリシー境界ではありません。制御サービスの再起動をまたいで再利用されるブラウザーや、その他のブラウザーバックエンドでは、この強化策が共有されない可能性があります。ページルーティングは引き続きリクエストレベルのインターセプトであり、ネットワークファイアウォールではありません。リダイレクトの各ホップ、ポップアップの最初のリクエスト、Service Worker のトラフィック、限定されたガード期間後に実行されるページコード、一部のバックグラウンド/サブリソース経路は、これを回避できる可能性があります。最終 URL の確認は引き続き検出/隔離の防御策です。完全に防止するには、所有者側の外向き通信の隔離またはポリシーを強制するプロキシが必要です。
{ browser: { ssrfPolicy: { dangerouslyAllowPrivateNetwork: false, hostnameAllowlist: ["*.example.com", "example.com"], allowedHostnames: ["localhost"], }, },}ネットワーク公開
バインド、ポート、ファイアウォール
Gateway は 1 つのポート(デフォルトは 18789、設定/フラグ/環境変数:gateway.port、--port、OPENCLAW_GATEWAY_PORT)で WebSocket と HTTP を多重化します。この HTTP サーフェスには、Control UI(SPA アセット、デフォルトのベースパスは /)と canvas ホスト(/__openclaw__/canvas および /__openclaw__/a2ui — 任意の HTML/JS。通常のブラウザーで読み込む場合は信頼できないコンテンツとして扱い、信頼できないネットワーク/ユーザーに公開したり、特権を持つ Web サーフェスと同じオリジンを共有したりしないでください)が含まれます。
gateway.bind は Gateway が待ち受ける場所を制御します。
"loopback"(デフォルト):ローカルクライアントのみ接続できます。"lan"、"tailnet"、"custom":攻撃対象領域を拡大します。Gateway 認証(共有トークン/パスワード、または正しく設定された信頼済みプロキシ)と実際のファイアウォールを併用する場合にのみ使用してください。
経験則:LAN バインドより Tailscale Serve を推奨します(Serve は Gateway を loopback 上に維持し、Tailscale がアクセスを処理します)。LAN にバインドする必要がある場合は、広範にポート転送するのではなく、厳密な送信元 IP 許可リストによってポートをファイアウォールで制限してください。0.0.0.0 で認証なしの Gateway を公開してはなりません。
UFW を使用した Docker ポート公開
公開されたコンテナポート(-p HOST:CONTAINER または Compose の ports:)は、ホストの INPUT ルールだけではなく、Docker の転送チェーンを経由します。DOCKER-USER(Docker 自身の許可ルールより前に評価されます)でルールを適用してください。最近のほとんどのディストリビューションでは iptables-nft フロントエンドが使用されており、これらのルールは nftables バックエンドにも適用されます。
# /etc/ufw/after.rules(独立した *filter セクションとして末尾に追加)*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 RETURNCOMMITIPv6 には個別のテーブルがあります。Docker IPv6 が有効な場合は、/etc/ufw/after6.rules に対応するポリシーを追加してください。インターフェース名(eth0)は VPS イメージ(ens3、enp* など)によって異なり、不一致があると拒否ルールが通知なしにスキップされる可能性があるため、ハードコードしないでください。
ufw reloadiptables -S DOCKER-USERip6tables -S DOCKER-USERnmap -sT -p 1-65535 <public-ip> --open外部に公開される想定のポートは、意図的に公開したものだけにしてください(ほとんどの構成では SSH+リバースプロキシのポート)。
mDNS/Bonjour 検出
同梱の bonjour Plugin が有効な場合、Gateway はローカルデバイス検出のために mDNS(_openclaw-gw._tcp、ポート 5353)で存在をブロードキャストします。フルモードには、運用上の詳細を公開する TXT レコードが含まれます。cliPath(ユーザー名とインストール場所が分かるファイルシステムパス)、sshPort(SSH が利用可能であることを通知)、displayName/lanHost(ホスト名情報)です。インフラストラクチャの詳細をブロードキャストすると、LAN の偵察が容易になります。
-
LAN 検出が必要でない限り、Bonjour は無効にしてください。macOS ホストでは自動起動し、その他の環境ではオプトインです。Gateway の直接 URL、Tailnet、SSH、または広域 DNS-SD を使用すれば、ローカルマルチキャストを回避できます。
-
最小モード(Bonjour が有効な場合のデフォルト。公開される Gateway に推奨)では、機密性の高いフィールドが省略されます。
json5 { discovery: { mdns: { mode: "minimal" } } } -
オフにすると、Plugin を有効にしたままローカル検出を抑止します。
json5 { discovery: { mdns: { mode: "off" } } } -
フルモード(オプトイン)には、
cliPath+sshPortが含まれます。json5 { discovery: { mdns: { mode: "full" } } } -
または、設定を変更せずに mDNS を無効にするには、
OPENCLAW_DISABLE_BONJOUR=1を設定します。
最小モードでは、Gateway は role、gatewayPort、transport をブロードキャストしますが、cliPath/sshPort は省略します。CLI パスが必要なアプリは、代わりに認証済みの WebSocket 接続を介して取得できます。
Gateway WebSocket 認証
Gateway 認証はデフォルトで必須です。有効な認証経路が設定されていない場合、Gateway は WebSocket 接続を拒否します(フェイルクローズ)。オンボーディングではデフォルトでトークンが生成されるため(loopback の場合も同様)、ローカルクライアントも認証する必要があります。
{ gateway: { auth: { mode: "token", token: "your-token" } } }openclaw doctor --generate-gateway-token を使用して生成できます。
wss:// を使用する場合は、gateway.remote.tlsFingerprint でリモート TLS を固定してください。平文の ws:// は、ループバック、プライベート IP リテラル、.local、および Tailnet の *.ts.net Gateway URL で使用できます。その他の信頼できるプライベート DNS 名については、非常時の回避策としてクライアントプロセスに OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 を設定してください(プロセス環境にのみ設定し、openclaw.json キーには設定しません)。モバイルペアリングと Android の手動またはスキャンによる Gateway ルートには、より厳しい制限があります。平文通信を使用できるのはループバックのみであり、プライベート LAN、リンクローカル、.local、およびドットを含まないホスト名では、信頼済みプライベートネットワークの平文通信パスを明示的に有効化しない限り TLS が必要です。
デバイスペアリングは、ローカルループバックへの直接接続では自動承認されます(これに加え、信頼済み共有シークレットのヘルパーフロー向けに、限定的なバックエンドまたはコンテナローカルの自己接続パスがあります)。Tailnet および LAN 接続は、同一ホストから Tailnet アドレスへの接続を含めてリモートとして扱われ、引き続き承認が必要です。解決された tailnet アドレス、または 127.0.0.1 と 0.0.0.0 以外の custom アドレスにより、別の 127.0.0.1 リスナーが追加されます。ループバックのセマンティクスが適用されるのは、そのローカルリスナーへの接続だけです。ループバック要求に転送ヘッダーの証拠がある場合、その要求はループバックローカルとはみなされません。メタデータアップグレードの自動承認は限定的な範囲に制限されます。Gateway のペアリングを参照してください。
認証モード:
"token":共有ベアラートークン(ほとんどのセットアップで推奨)。"password":OPENCLAW_GATEWAY_PASSWORDでの設定を推奨します。"trusted-proxy":ユーザーを認証し、ヘッダーを介してアイデンティティを渡すアイデンティティ対応リバースプロキシを信頼します。信頼済みプロキシ認証を参照してください。
ローテーションのチェックリスト(トークン/パスワード):新しいシークレットを生成して設定する(gateway.auth.token または OPENCLAW_GATEWAY_PASSWORD)。Gateway を再起動する(Gateway を管理している場合は macOS アプリを再起動する)。リモートクライアントを更新する(gateway.remote.token/.password)。古い認証情報が使用できなくなったことを確認する。
Tailscale Serve のアイデンティティヘッダー
gateway.auth.allowTailscale が true(Serve のデフォルト)の場合、OpenClaw は Control UI/WebSocket 認証に Tailscale Serve のアイデンティティヘッダー tailscale-user-login を使用できます。ローカルの Tailscale デーモン(tailscale whois)を介して x-forwarded-for アドレスを解決し、ヘッダーと照合することでアイデンティティを検証します。これは、Tailscale によって挿入された x-forwarded-for、x-forwarded-proto、および x-forwarded-host を含むループバック要求でのみ実行されます。この非同期チェックでは、同じ {scope, ip} に対する失敗した試行は、リミッターが失敗を記録する前に直列化されます。そのため、1 つの Serve クライアントから不正な再試行が同時に行われると、2 回目の試行が即座にロックアウトされることがあります。
HTTP API エンドポイント(/v1/*、/tools/invoke、/api/channels/*)では、Tailscale のアイデンティティヘッダー認証を使用しません。Gateway に設定された HTTP 認証モードに従います。
Gateway の HTTP ベアラー認証は、事実上、全権限か権限なしかのオペレーターアクセスです。/v1/chat/completions、/v1/responses、/api/v1/admin/rpc などの Plugin ルート、または /api/channels/* を呼び出せる認証情報は、その Gateway に対する全権限のオペレーターシークレットです。共有シークレットのベアラー認証では、デフォルトのオペレータースコープ一式(operator.admin、operator.approvals、operator.pairing、operator.read、operator.talk.secrets、operator.write)と、エージェントターンに対する所有者セマンティクスがすべて復元されます。より限定的な x-openclaw-scopes の値を指定しても、この共有シークレットパスの権限は縮小されません。リクエスト単位のスコープセマンティクスが適用されるのは、アイデンティティを伴うモード(信頼済みプロキシ認証)または認証なしとして明示されたプライベートイングレスからリクエストが届く場合だけです。これらのモードでは、x-openclaw-scopes を省略すると通常のデフォルトオペレータースコープ一式にフォールバックし、スコープを限定した場合、x-openclaw-model のような所有者レベルのヘッダーには operator.admin が必要です。/tools/invoke および HTTP セッション履歴エンドポイントにも、同じ共有シークレット規則が適用されます。信頼できない呼び出し元とは、これらの認証情報を共有しないでください。信頼境界ごとに個別の Gateway を使用することを推奨します。
トークンを使用しない Serve 認証は、Gateway ホスト自体が信頼されていることを前提としています。これは、同一ホスト上の悪意あるプロセスに対する保護ではありません。信頼できないローカルコードが Gateway ホスト上で実行される可能性がある場合は、allowTailscale を無効にし、明示的な共有シークレット認証(token または password)を必須にしてください。
独自のリバースプロキシから、これらのヘッダーを転送しないでください。Gateway の前段で TLS を終端する場合やプロキシを使用する場合は、allowTailscale を無効にし、代わりに共有シークレット認証または信頼済みプロキシ認証を使用してください。
リバースプロキシの設定
nginx/Caddy/Traefik などの背後で転送されたクライアント IP を適切に処理するには、gateway.trustedProxies を設定します。Gateway が trustedProxies に含まれていないアドレスからプロキシヘッダーを検出した場合、その接続をローカルとして扱いません。Gateway 認証が無効な場合、その接続は拒否されます。これにより、プロキシされた接続が localhost から発信されたように見え、自動的に信頼されることを防ぎます。
trustedProxies は、より厳格な gateway.auth.mode: "trusted-proxy" にも使用されます。デフォルトでは、ループバックを送信元とするプロキシに対してフェイルクローズします。同一ホストのループバックリバースプロキシでは、ローカルクライアントの検出と転送 IP の処理に trustedProxies を使用できますが、gateway.auth.trustedProxy.allowLoopback = true の場合に限り trusted-proxy 認証モードを満たせます。それ以外の場合は、トークン/パスワード認証を使用してください。
gateway: trustedProxies: - "10.0.0.1" # リバースプロキシの IP allowRealIpFallback: false # デフォルトは false。プロキシが X-Forwarded-For を提供できない場合にのみ有効化 auth: mode: password password: ${OPENCLAW_GATEWAY_PASSWORD}trustedProxies が設定されている場合、Gateway はクライアント IP の判定に X-Forwarded-For を使用します。gateway.allowRealIpFallback: true が明示的に設定されていない限り、X-Real-IP は無視されます。プロキシが X-Forwarded-For/X-Real-IP に値を追加するのではなく、必ず上書きするようにしてください。
# 良い例proxy_set_header X-Forwarded-For $remote_addr;proxy_set_header X-Real-IP $remote_addr; # 悪い例:信頼できないクライアント提供の値を保持/追加するproxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;信頼済みプロキシヘッダーを使用しても、Node のデバイスペアリングが自動的に信頼されるわけではありません。gateway.nodes.pairing.autoApproveCidrs は別個のオペレーターポリシーであり、デフォルトでは無効です。また、ループバックの信頼済みプロキシ認証が有効な場合でも、ループバックを送信元とする信頼済みプロキシヘッダーのパスは、Node の自動承認から除外されます(ローカルの呼び出し元がこれらのヘッダーを偽装できるためです)。
HSTS とオリジンに関する注意事項
- OpenClaw の Gateway は、ローカル/ループバックでの使用を第一に設計されています。リバースプロキシで TLS を終端する場合は、そこで HSTS を設定してください。
- Gateway 自体が HTTPS を終端する場合、
gateway.http.securityHeaders.strictTransportSecurityにより OpenClaw のレスポンスから HSTS ヘッダーが送信されます。 - ループバック以外の Control UI デプロイでは、デフォルトで
gateway.controlUi.allowedOriginsが必要です。allowedOrigins: ["*"]は明示的な全許可ポリシーであり、強化されたデフォルトではありません。厳密に管理されたローカルテスト以外では使用しないでください。 - 一般的なループバック除外が有効な場合でも、ループバック上のブラウザオリジン認証の失敗にはレート制限が適用されます。ただし、ロックアウトキーは共有の localhost バケット 1 つではなく、正規化された
Originの値ごとに設定されます。 gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=trueは Host ヘッダーによるオリジンフォールバックモードを有効にします。オペレーターが選択する危険なポリシーとして扱ってください。- DNS リバインディングとプロキシの Host ヘッダーの挙動は、デプロイ強化上の懸念事項として扱ってください。
trustedProxiesを厳格に保ち、Gateway を公共のインターネットに直接公開しないでください。 - 詳細なデプロイガイダンス:信頼済みプロキシ認証。
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:廃止された非常用入力。古い設定では、HTTPS または localhost で再度開いたブラウザが、範囲を限定した明示的な自己ペアリング移行を完了するまで、修復用の認証済みペアリング専用 Control UI アクセスが維持されます。現在の設定には追加しないでください。- これらのフラグとは別に、
gateway.auth.mode: "trusted-proxy"が成功すると、デバイスアイデンティティなしでオペレーターの Control UI セッションを許可できます。これは意図された認証モードの挙動であり、allowInsecureAuthのショートカットではありません。また、Node ロールの Control UI セッションには適用されません。
allowInsecureAuth が有効な場合、openclaw security audit が警告します。
安全でない/危険なフラグ
openclaw security audit は、有効になっている既知の安全でない/危険なデバッグスイッチごとに config.insecure_or_dangerous_flags を生成します(フラグごとに 1 件の検出結果)。本番環境では、これらを未設定のままにしてください。監査の抑制が設定されている場合、一致する検出結果が suppressedFindings に移動しても、security.audit.suppressions.active はアクティブな出力に残ります。
現在、監査で追跡されているフラグ
gateway.controlUi.allowInsecureAuth=truegateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=true- 廃止された
gateway.controlUi.dangerouslyDisableDeviceAuth=trueからインポートされた、保留中の Control UI デバイス認証移行 security.audit.suppressions configured (<count>)hooks.gmail.allowUnsafeExternalContent=truehooks.mappings[<index>].allowUnsafeExternalContent=truetools.exec.applyPatch.workspaceOnly=falseplugins.entries.acpx.config.permissionMode=approve-all
設定スキーマ内のすべての dangerous*/dangerously* キー
Control UI とブラウザ:
gateway.controlUi.dangerouslyAllowHostHeaderOriginFallbackgateway.controlUi.dangerouslyDisableDeviceAuth(廃止されたアップグレード入力)browser.ssrfPolicy.dangerouslyAllowPrivateNetwork
チャンネル名の照合(バンドルおよび Plugin チャンネル。該当する場合は accounts.<accountId> ごとの設定も含む):
channels.discord.dangerouslyAllowNameMatchingchannels.googlechat.dangerouslyAllowNameMatchingchannels.msteams.dangerouslyAllowNameMatchingchannels.slack.dangerouslyAllowNameMatchingchannels.irc.dangerouslyAllowNameMatching(Plugin チャンネル)channels.mattermost.dangerouslyAllowNameMatching(Plugin チャンネル)channels.synology-chat.dangerouslyAllowNameMatching(Plugin チャンネル)channels.synology-chat.dangerouslyAllowInheritedWebhookPath(Plugin チャンネル)channels.zalouser.dangerouslyAllowNameMatching(Plugin チャンネル)
ネットワーク公開:
channels.telegram.network.dangerouslyAllowPrivateNetwork(アカウントごとの設定も含む)
サンドボックス Docker(デフォルトおよびエージェントごと):
agents.defaults.sandbox.docker.dangerouslyAllowReservedContainerTargetsagents.defaults.sandbox.docker.dangerouslyAllowExternalBindSourcesagents.defaults.sandbox.docker.dangerouslyAllowContainerNamespaceJoin
デプロイとホストの信頼性
- Gateway ホストでフルディスク暗号化を使用してください。ホストを共有する場合は、Gateway 専用の OS ユーザーアカウントを推奨します。
- 公開パッケージの依存関係ロック:ソースチェックアウトでは
pnpm-lock.yamlを使用します。公開されているopenclawnpm パッケージおよび OpenClaw が所有する npm Plugin パッケージにはnpm-shrinkwrap.jsonが含まれているため、インストール時に新たな依存関係グラフを解決するのではなく、リリース時にレビュー済みの推移的依存関係グラフが使用されます。これはサプライチェーンの堅牢化とリリースの再現性を確保する境界であり、サンドボックスではありません。詳しくは npm shrinkwrap を参照してください。 - 安全なファイル操作:OpenClaw は、ルート配下に制限されたファイルアクセス、アトミック書き込み、アーカイブ展開、一時ワークスペース、シークレットファイル用ヘルパーに
@openclaw/fs-safeを使用します。オプションの POSIX Python ヘルパーはデフォルトで無効です。ファイル記述子相対の変更操作による追加の堅牢化が必要で、Python ランタイムをサポートできる場合にのみ、OPENCLAW_FS_SAFE_PYTHON_MODE=autoまたはrequireを設定してください。詳細:安全なファイル操作。 - 共有 Slack ワークスペースのリスク:Slack 内の全員がボットにメッセージを送信できる場合、中心的なリスクは委任されたツール権限です。許可された送信者は、エージェントのポリシーの範囲内でツール呼び出し(
exec、ブラウザ、ネットワーク/ファイルツール)を誘発できます。また、ある送信者からのプロンプト/コンテンツインジェクションが共有状態、デバイス、出力に影響を与える可能性があり、共有エージェントが機密性の高い認証情報やファイルを保持している場合、許可された送信者がツールを使用してデータを流出させる可能性があります。チームのワークフローには、ツールを最小限に制限した個別のエージェント/Gateway を使用し、個人データを扱うエージェントは非公開にしてください。 - 社内共有エージェント(許容可能なパターン):エージェントを使用する全員が同じ信頼境界内(たとえば、同じ会社のチーム)に属し、エージェントの用途が業務に厳密に限定されている場合は問題ありません。専用のマシン/VM/コンテナで実行し、専用の OS ユーザー、専用のブラウザ/プロファイル/アカウントを使用してください。また、そのランタイムを個人の Apple/Google アカウントや、個人用パスワードマネージャー/ブラウザプロファイルにサインインさせないでください。同じランタイムで個人と会社のアイデンティティを混在させると、この分離が失われ、個人データが露出するリスクが高まります。
ディスク上のシークレット
~/.openclaw/(または $OPENCLAW_STATE_DIR/)配下のすべてのデータには、シークレットまたは個人データが含まれる可能性があるものと想定してください。
| パス | 内容 |
|---|---|
openclaw.json |
設定には、トークン(Gateway、リモート Gateway)、プロバイダー設定、許可リストが含まれる場合があります。 |
credentials/** |
チャンネル認証情報(WhatsApp の認証情報など)、ペアリング許可リスト、レガシー OAuth インポート。 |
state/openclaw.sqlite |
ネイティブ MCP OAuth アクセス/更新トークン、動的クライアント登録シークレット、検出状態を含む共有ランタイム状態。 |
agents/<agentId>/agent/openclaw-agent.sqlite |
モデル認証プロファイルを含む、エージェントごとのランタイム状態。 |
agents/<agentId>/agent/auth-profiles.json |
レガシーモデル認証の移行元。doctor は、サポートされるレコードをエージェントごとの SQLite データベースにインポートします。 |
agents/<agentId>/agent/codex-home/** |
エージェントごとの Codex app-server アカウント、設定、Skills、plugins、ネイティブスレッド状態、診断(デフォルト)。 |
$CODEX_HOME/** または ~/.codex/** |
ネイティブ Codex ランタイム状態。通常のハーネスは、明示的な plugins.entries.codex.config.appServer.homeScope: "user" がある場合にのみアクセスします。独立した監督接続は、解決されたホームスコープが "user" の場合にアクセスします。これは、stdio または Unix で未設定の場合のデフォルトです。ネイティブ Codex アカウント、設定、plugins、スレッドストアが含まれます。監督はソースメタデータを一覧表示し、継続された Chat の正規ネイティブブランチと、その接続上の後続ターンを保持します。ブランチ作成では、範囲が限定された永続化済みのユーザーおよびアシスタント履歴を、認証済みでモデルが固定された OpenClaw Chat にコピーします。所有者が管理する Gateway でのみ有効にしてください。Codex ハーネスおよび Codex 監督を参照してください。 |
secrets.json(任意) |
file SecretRef プロバイダー(secrets.providers)が使用するファイルベースのシークレットペイロード。 |
agents/<agentId>/agent/auth.json |
レガシー互換性ファイル。静的な api_key エントリは、検出時に除去されます。 |
agents/<agentId>/agent/openclaw-agent.sqlite |
非公開メッセージやツール出力を含む可能性があるセッション行とトランスクリプトを含む、エージェントごとのランタイム状態。 |
agents/<agentId>/sessions/** |
非公開メッセージやツール出力を含む可能性がある、レガシーセッションの移行元とアーカイブ。 |
| バンドルされた Plugin パッケージ | インストール済みの plugins(およびその node_modules/)。 |
sandboxes/** |
ツールサンドボックスのワークスペース。サンドボックス内で読み書きされたファイルのコピーが蓄積される可能性があります。 |
認証情報の保存場所一覧
バックアップ方針の判断にも役立ちます。
- WhatsApp:
~/.openclaw/credentials/whatsapp/<accountId>/creds.json - Telegram ボットトークン: 設定/環境変数または
channels.telegram.tokenFile(通常ファイルのみ。シンボリックリンクは拒否されます) - Discord ボットトークン: 設定/環境変数または SecretRef(env/file/exec プロバイダー)
- Slack トークン: 設定/環境変数(
channels.slack.*) - ペアリング許可リスト:
~/.openclaw/credentials/<channel>-allowFrom.json(デフォルトアカウント)/<channel>-<accountId>-allowFrom.json(デフォルト以外のアカウント) - モデル認証プロファイル:
~/.openclaw/agents/<agentId>/agent/openclaw-agent.sqlite(auth_profile_store) - MCP OAuth セッション:
~/.openclaw/state/openclaw.sqlite(mcp_oauth_stores) - レガシー OAuth インポート:
~/.openclaw/credentials/oauth.json
堅牢化: 権限を厳格に保ちます(ディレクトリは 700、ファイルは 600)。Gateway ホストではフルディスク暗号化を使用し、ホストを共有する場合は専用の OS ユーザーアカウントを推奨します。
ファイル権限
~/.openclaw/openclaw.json:600(ユーザーによる読み書きのみ)~/.openclaw:700(ユーザーのみ)
openclaw doctor は警告を表示し、これらの権限を厳格化するよう提案できます。
ワークスペースの .env ファイル
OpenClaw はエージェントとツール向けにワークスペースローカルの .env ファイルを読み込みますが、Gateway のランタイム制御をそれらが暗黙に上書きすることは決して許可しません。
- 信頼されていないワークスペースの
.envファイルでは、プロバイダー認証情報の環境変数がブロックされます。たとえば、GEMINI_API_KEY、GOOGLE_API_KEY、XAI_API_KEY、MISTRAL_API_KEY、GROQ_API_KEY、DEEPSEEK_API_KEY、PERPLEXITY_API_KEY、BRAVE_API_KEY、TAVILY_API_KEY、EXA_API_KEY、FIRECRAWL_API_KEY、およびインストール済みの信頼された Plugin が宣言するプロバイダー認証キーが対象です。代わりに、プロバイダー認証情報を Gateway プロセス環境、~/.openclaw/.env($OPENCLAW_STATE_DIR/.env)、設定のenvブロック、または任意のログインシェルインポートに配置してください。 OPENCLAW_で始まるすべてのキーは、信頼されていないワークスペースの.envファイルでブロックされます。これによりランタイム名前空間全体が予約され、将来のOPENCLAW_*制御が、コミット済みまたは攻撃者が提供した.envの内容を暗黙に継承せず、デフォルトでフェイルクローズになります。- チャンネルおよびプロバイダーのエンドポイントルーティング設定も、ワークスペースの
.envによる上書きからブロックされます(たとえば、MATRIX_HOMESERVER、MATTERMOST_URL、IRC_HOST、SYNOLOGY_CHAT_INCOMING_URL、AZURE_SPEECH_ENDPOINT、および_ENDPOINTで終わるその他のキー)。そのため、クローンしたワークスペースが、ローカルのエンドポイント設定を介して同梱コネクターのトラフィックをリダイレクトすることはできません。これらは Gateway プロセス環境、グローバルランタイム dotenv、明示的な設定、またはenv.shellEnvから指定する必要があります。 - 信頼されたプロセス/OS の環境変数、グローバルランタイム dotenv、設定の
env、および有効化されたログインシェルインポートは引き続き適用されます。制限されるのは、ワークスペースの.envファイルの読み込みだけです。
ワークスペースの .env ファイルは、エージェントコードの隣に置かれることが多く、誤ってコミットされたり、ツールによって書き込まれたりします。プロバイダー認証情報をブロックすることで、クローンしたワークスペースが攻撃者の管理下にあるプロバイダーアカウントへ差し替えることを防ぎます。
ログとトランスクリプト
OpenClaw はセッションの継続性と任意のメモリインデックス作成のため、セッショントランスクリプトをディスク上の ~/.openclaw/agents/<agentId>/sessions/*.jsonl に保存します。ファイルシステムへアクセスできるすべてのプロセス/ユーザーが読み取れます。ディスクアクセスを信頼境界として扱い、~/.openclaw の権限を厳格に設定してください。より強力に分離するには、エージェントを別々の OS ユーザーまたはホストで実行します。
Gateway のログには、ツールの概要、エラー、URL が含まれる場合があります。セッショントランスクリプトには、貼り付けたシークレット、ファイルの内容、コマンド出力、リンクが含まれる場合があります。
- ログ/トランスクリプトの編集機能を有効に保ちます(
logging.redactSensitive: "tools"、デフォルト)。 logging.redactPatternsを使用して、環境固有のパターン(トークン、ホスト名、内部 URL)を追加します。- 診断情報を共有する場合は、生ログではなく
openclaw status --all(貼り付け可能、シークレットは編集済み)を推奨します。 - 長期間の保持が不要な場合は、古いセッショントランスクリプトとログファイルを削除します。
詳細: ログ
セキュアなベースライン(コピー&ペースト)
{ gateway: { mode: "local", bind: "loopback", port: 18789, auth: { mode: "token", token: "your-long-random-token" }, }, channels: { whatsapp: { dmPolicy: "pairing", groups: { "*": { requireMention: true } }, }, },}Gateway を非公開に保ち、DM のペアリングを必須にし、グループ内でボットが常時動作することを防ぎます。ツールの実行もより安全にするには、所有者以外のすべてのエージェントにサンドボックスを追加し、危険なツールを拒否します(上記の「エージェントごとのアクセスプロファイル」を参照)。
番号を分ける(WhatsApp、Signal、Telegram)
電話番号ベースのチャンネルでは、個人用とは別の番号でアシスタントを実行することを検討してください。これにより個人的な会話のプライバシーが保たれ、ボット用の番号は独自の境界内で自動化を処理できます。
インシデント対応
封じ込め
- 停止する: macOS アプリ(Gateway を管理している場合)を停止するか、
openclaw gatewayプロセスを終了します。 - 公開を停止する: 状況を把握するまで、
gateway.bind: "loopback"を設定します(または Tailscale Funnel/Serve を無効化します)。 - アクセスを凍結する: リスクのある DM/グループを
dmPolicy: "disabled"に切り替えるかメンションを必須にし、全許可の"*"エントリをすべて削除します。
ローテーション(シークレットが漏洩した場合は侵害を想定)
- Gateway の認証情報(
gateway.auth.token/OPENCLAW_GATEWAY_PASSWORD)をローテーションし、再起動します。 - Gateway を呼び出せるすべてのマシンで、リモートクライアントのシークレット(
gateway.remote.token/.password)をローテーションします。 - プロバイダー/API の認証情報(WhatsApp の認証情報、Slack/Discord のトークン、
auth-profiles.json内のモデル/API キー、および使用している場合は暗号化されたシークレットペイロードの値)をローテーションします。
監査
openclaw logs(または名前付きプロファイルの場合はopenclaw --profile <profile> logs)で Gateway のログを確認します。デフォルトパスは/tmp/openclaw/openclaw-YYYY-MM-DD.logです。logging.fileで上書きされていない限り、名前付きプロファイルでは/tmp/openclaw/openclaw-<profile>-YYYY-MM-DD.logが使用されます。- 関連するトランスクリプトを確認します:
~/.openclaw/agents/<agentId>/sessions/*.jsonl。 - アクセス範囲を広げた可能性がある最近の設定変更を確認します:
gateway.bind、gateway.auth、DM/グループポリシー、tools.elevated、Plugin の変更。 openclaw security audit --deepを再実行し、重大な検出事項が解決されたことを確認します。
レポート用の情報収集
- タイムスタンプ、Gateway ホストの OS、OpenClaw のバージョン。
- セッショントランスクリプトと短いログ末尾(編集後)。
- 攻撃者が送信した内容と、エージェントが実行したこと。
- Gateway が loopback の外部に公開されていたかどうか(LAN/Tailscale Funnel/Serve)。
シークレットスキャン
CI はリポジトリ全体に対して、pre-commit の detect-private-key フックを実行します。失敗した場合は、コミットされた鍵情報を削除またはローテーションしてから、ローカルで再現します。
pre-commit run --all-files detect-private-keyセキュリティ問題の報告
OpenClaw に脆弱性を発見した場合は、責任ある方法で報告してください。
- メール: security@openclaw.ai
- 修正されるまで公開しないでください。
- 希望しない場合を除き、報告者としてクレジットします。