
OpenClaw セキュリティと攻撃の実態 - CVE-2026-25253・プロンプトインジェクション・ClawHub
OpenClaw(旧Moltbot)への実際の攻撃事例を解説。CVE-2026-25253(1-Click RCE)、CVE-2026-24763(Docker脱出)、Zenity間接プロンプトインジェクション、ClawHubサプライチェーン攻撃と、ソースコードレベルの防御機構を詳述します。
公開日2026.02.15
更新日2026.02.15
はじめに
この記事について
本記事はAIによる解説記事です。OpenClawのセキュリティに関する公開情報を整理し、AIエージェント導入時のセキュリティ検討にお役立ていただければと思い記載しています。
OpenClawは、ローカルマシン上で動くパーソナルAIアシスタントのOSSです。Discord、Slack、Telegramなど38以上のメッセンジャーからのメッセージを受け取り、LLMが判断してbash実行やファイル操作を行います。つまり「外部メッセージ → LLM判断 → ローカル実行」というアーキテクチャです。
この記事では、その仕組みが実際にどう攻撃されてきたか、そしてOpenClawがどのような防御機構で対抗しているかをソースコードと実際のインシデントの両面から掘り下げます。
対象読者
- AIエージェントのセキュリティモデルに興味がある方
- OpenClawの導入を検討しており、リスクを把握したい方
- LLMを外部メッセージングに接続する際のセキュリティ設計を学びたい方
目次
目次
OpenClawの名称変遷と攻撃の歴史
まずOpenClawの経緯を整理します。短期間に名称が変わったため、脆弱性情報やセキュリティ研究がバラバラの名前で公開されています。
| 時期 | 名称 | 経緯 |
|---|---|---|
2025年11月 | Clawdbot | Peter Steinberger氏が作成 |
2026年1月27日 | Moltbot | Anthropicの商標に関する懸念で改名 |
2026年1月30日 | OpenClaw | 最終的な改名。同日にv2026.1.29でCVE 3件を修正 |
この短い期間に、3つのCVE、512件のセキュリティ監査指摘、230以上の悪意あるClawHubスキル、42,900のインターネット公開インスタンスの発見、そしてCrowdStrike・Cisco・Palo Alto Networksからのセキュリティ分析レポートが公開されました。
実際の攻撃事例
CVE-2026-25253: 1-Click RCE(CVSS 8.8)
Reference: depthfirst - CVE-2026-25253 技術詳細
最も深刻な脆弱性です。攻撃者が用意したリンクをクリックするだけで、ローカルマシン上で任意のコードが実行される可能性がありました。
攻撃の仕組み
Attacker Victim's Browser OpenClaw Gateway
======== ================ ================
│ │ │
│── crafted link ─────────────────→│ │
│ (gatewayUrl=attacker.com) │ │
│ │ │
│ │── auto WebSocket ─────────→│
│ │ (sends auth token) │
│ │ │
│ │←── challenge nonce ─────────│
│ │ │
│ │── token in connect RPC ───→│
│ │ │
│←── token exfiltrated ─────────────│ │
│ │ │
│ With stolen operator.admin token: │
│ │
│── exec.approvals.set "off" ──────────────────────────────────→│
│── tools.exec.host "gateway" ─────────────────────────────────→│
│── arbitrary command execution ───────────────────────────────→│
│ │核心は2つの問題の組み合わせです。
-
WebSocket Origin未検証: ブラウザはWebSocket接続にSame-Origin Policyを適用しません。それはサーバー側の責務ですが、OpenClawのGatewayはOriginヘッダーを検証していませんでした(Cross-Site WebSocket Hijacking / CSWSH)。
-
自動接続: Control UIがURLクエリパラメータの
gatewayUrlを受け取ると、ユーザー確認なしにそのURLへWebSocket接続を確立し、保存済みの認証トークンを送信していました。
この2つにより、攻撃者は悪意あるリンクを送るだけで、被害者のトークンを窃取できました。さらに窃取したトークンが operator.admin スコープを持っていたため、ユーザー確認の無効化(exec.approvals.set "off")やDockerサンドボックスのバイパス(tools.exec.host "gateway")が可能でした。
修正(v2026.1.29)
gatewayUrlの自動接続を廃止し、確認モーダルを追加- WebSocket接続のOrigin検証を実装
影響範囲
v2026.1.29より前のすべてのバージョン(Clawdbot/Moltbot時代を含む)が影響を受けました。ethiack社がPoCを公開しています。
CVE-2026-24763: Dockerサンドボックス脱出(CVSS 8.8)
Reference: GitHub Advisory - GHSA-2026-24763
Docker内で実行されるべきコマンドが、PATH環境変数の不正操作によりホスト側で実行される可能性がありました。
修正後の防御コード
現在のソースコードでは、PATH操作が厳密にブロックされています。
// src/agents/bash-tools.exec-runtime.ts
// ホスト実行時のPATH変更を完全に禁止
const validateHostEnv = (env: Record<string, string>) => {
for (const key of Object.keys(env)) {
const upperKey = key.toUpperCase()
if (upperKey === 'PATH') {
throw new Error(
"Security Violation: Custom 'PATH' variable is forbidden during host execution.",
)
}
// LD_PRELOAD, DYLD_INSERT_LIBRARIES 等も同様にブロック
}
}CVE-2026-25157: SSHコマンドインジェクション(CVSS 7.8)
Reference: GitHub Advisory - GHSA-2026-25157
macOSメニューバーアプリにおいて、sshNodeCommand 関数がユーザー入力のプロジェクトパスをエスケープせずにシェルスクリプトに埋め込んでいました。また parseSSHTarget がダッシュで始まる入力(例: -oProxyCommand=...)をSSHフラグとして解釈する問題もありました。
Zenity Labs「OpenDoor」: 間接プロンプトインジェクションによるバックドア
Reference: Zenity Labs - OpenClaw or OpenDoor?
CVEベースの脆弱性とは異なり、こちらはOpenClawの「仕様上の動作」を悪用した攻撃です。ソフトウェアのバグではなく、LLMの判断を操作する手法です。
攻撃シナリオ
Attacker Google Docs OpenClaw
======== =========== ========
│ │ │
│── create doc with ──────→│ │
│ hidden payload │ │
│ │ │
│ User asks: "Summarize this doc" │
│ │ │
│ │←── fetch doc content ────│
│ │ │
│ │── doc content ──────────→│
│ │ (contains hidden │
│ │ prompt injection) │
│ │ │
│ │ ┌────────────────┤
│ │ │ LLM processes │
│ │ │ payload as │
│ │ │ instruction: │
│ │ │ │
│ │ │ 1. Create │
│ │ │ Telegram │
│ │ │ bot config │
│ │ │ │
│ │ │ 2. Add attacker│
│ │ │ to allowlist│
│ │ │ │
│ │ │ 3. Modify │
│ │ │ SOUL.md for │
│ │ │ persistence │
│ │ └────────────────┤
│ │ │
│←── Telegram bot active, attacker has persistent ────│
│ control channel │
│ │攻撃者は企業ドキュメントの深部にプロンプトインジェクションペイロードを埋め込みます。ユーザーが「このドキュメントを要約して」と依頼すると、OpenClawはドキュメントを読み込み、埋め込まれた指示に従って:
- 攻撃者が事前に用意したTelegram Botトークンで新しいチャネル統合を作成
- 攻撃者のアカウントをallowlistに追加
- SOUL.md(OpenClawの行動設定ファイル)を改変して永続化
- 定期タスクを設定してSOUL.mdへの注入を定期的に再実行
これにより、攻撃者はTelegram経由でOpenClawを遠隔操作できるようになります。企業のセキュリティシステムを経由しない永続的なバックドアが成立します。
この攻撃の本質
核心は「ユーザーの明示的な意図」と「外部コンテンツ」の境界をLLMが区別できない点にあります。OpenClawは通常のタスク実行でチャット、ドキュメント、Web検索結果など外部コンテンツを日常的に取り込みますが、これらは直接的なユーザー指示と同じ推論コンテキストで処理されます。
ClawHubサプライチェーン攻撃
Reference: Snyk - ToxicSkills Study / CrowdStrike - What Security Teams Need to Know
OpenClawのスキルマーケットプレイス「ClawHub」に対する大規模な攻撃が確認されています。
被害規模
Koi Securityの監査によると、ClawHubに登録された2,857スキルのうち341件(約12%)が悪意あるものでした。Snykの調査では3,984スキル中1,467件(36%)にセキュリティ上の問題が確認されています。
ClawHavocキャンペーン
「hightower6eu」というアカウントが300以上のスキルを公開しました。solana-wallet-tracker、youtube-summarize-pro、polymarket-trader といった一見有用な名前と、作り込まれたドキュメントで信頼性を装っていました。
これらのスキルには Atomic Stealer(AMOS) マルウェアが仕込まれており、以下を窃取します。
- ブラウザのパスワード・Cookie
- macOS Keychainの認証情報
- 暗号通貨ウォレットの秘密鍵
- SSH鍵
- OpenClawの
~/.clawdbot/.envに保存されたAPIキー
すべてのAMOS配布スキルが単一のC2 IP(91.92.242[.]30)を共有していたことから、組織的なキャンペーンと見られています。
偽VS Code拡張機能
2026年1月30日、「ClawdBot Agent - AI Coding Assistant」という偽のVS Code拡張機能が発見されました。公式チームはVS Code拡張機能を公開していないにもかかわらず、インストールするとScreenConnect(リモートアクセスツール)がインストールされ、攻撃者がマシンをリモート操作できるようになっていました。
OpenClawの対応
OpenClawはClawHubへのVirusTotal統合スキャンを導入しました。CiscoもオープンソースのSkill Scanner(静的解析+LLM意味解析+VirusTotal連携)を公開しています。
防御機構のソースコード解説
ここからは、OpenClawがこれらの脅威に対してどのような防御を実装しているかをソースコードレベルで解説します。
External Content Wrapping
外部コンテンツをLLMに渡す前に、「信頼できないデータ」として明示的にマーキングする仕組みです。
不審パターンの検出
// src/security/external-content.ts
// 12パターンのプロンプトインジェクション検出
const SUSPICIOUS_PATTERNS = [
/ignore\s+(all\s+)?(previous|prior|above)\s+(instructions?|prompts?)/i,
/disregard\s+(all\s+)?(previous|prior|above)/i,
/forget\s+(everything|all|your)\s+(instructions?|rules?|guidelines?)/i,
/you\s+are\s+now\s+(a|an)\s+/i,
/new\s+instructions?:/i,
/system\s*:?\s*(prompt|override|command)/i,
/\bexec\b.*command\s*=/i,
/elevated\s*=\s*true/i,
/rm\s+-rf/i,
/delete\s+all\s+(emails?|files?|data)/i,
/<\/?system>/i,
/\]\s*\n\s*\[?(system|assistant|user)\]?:/i,
]Unicodeホモグリフ検出
攻撃者がマーカーを全角文字やCJK括弧で偽装することを防ぎます。
// src/security/external-content.ts
// Unicode全角・類似文字をASCIIに正規化してマーカー偽装を検出
const ANGLE_BRACKET_MAP = {
0xff1c: '<', // fullwidth <
0xff1e: '>', // fullwidth >
0x2329: '<', // left-pointing angle bracket
0x232a: '>', // right-pointing angle bracket
0x3008: '<', // CJK left angle bracket
0x3009: '>', // CJK right angle bracket
0x27e8: '<', // mathematical left angle bracket
0x27e9: '>', // mathematical right angle bracket
// ... 他にも複数
}
// <<<EXTERNAL_UNTRUSTED_CONTENT>>> の偽装を検出し
// [[MARKER_SANITIZED]] に置換ラッピングの全体像
// 外部コンテンツのラッピング構造
const wrapped = [
EXTERNAL_CONTENT_WARNING, // セキュリティ警告
'<<<EXTERNAL_UNTRUSTED_CONTENT>>>', // 開始マーカー
'Source: Email', // メタデータ
'From: user@example.com',
'---',
sanitizedContent, // マーカー偽装を除去済みの本文
'<<<END_EXTERNAL_UNTRUSTED_CONTENT>>>', // 終了マーカー
].join('\n')コマンド実行のセキュリティ
危険な環境変数のブロック
// src/agents/bash-tools.exec-runtime.ts
// ホスト実行時にブロックされる環境変数(15種 + 2プレフィックス)
const DANGEROUS_HOST_ENV_VARS = new Set([
'LD_PRELOAD', // ライブラリインジェクション
'LD_LIBRARY_PATH', // ライブラリパスの操作
'LD_AUDIT', // 動的ローダー監査
'DYLD_INSERT_LIBRARIES', // macOS版LD_PRELOAD
'DYLD_LIBRARY_PATH', // macOS版LD_LIBRARY_PATH
'NODE_OPTIONS', // Node.js起動フラグの注入
'NODE_PATH', // Node.jsモジュールパス
'PYTHONPATH', // Pythonモジュールパス
'PYTHONHOME', // Pythonホームの上書き
'RUBYLIB', // Rubyライブラリパス
'PERL5LIB', // Perlライブラリパス
'BASH_ENV', // Bash初期化ファイル
'ENV', // シェル初期化ファイル
'GCONV_PATH', // 文字変換ライブラリ
'IFS', // シェルのフィールド分割
'SSLKEYLOGFILE', // SSL鍵のログ出力
])
const DANGEROUS_HOST_ENV_PREFIXES = ['DYLD_', 'LD_']shell=falseによるインジェクション防止
OpenClawは child_process.spawn を shell: false で使用し、コマンドをargv配列として渡します。これにより ;、|、&& などのメタキャラクタがリテラルとして扱われ、シェルインジェクションが防止されます。
// SECURITY: never enable `shell` for argv-based execution.
// `shell` routes through cmd.exe on Windows, which turns untrusted argv values
// (like chat prompts passed as CLI args) into command-injection primitives.3段階のセキュリティモード
| モード | 動作 | デフォルト適用先 |
|---|---|---|
deny | コマンド実行を完全にブロック | Sandbox |
allowlist | 許可リストに一致する場合のみ実行。不一致はユーザー承認 | Gateway / Node |
full | 制限なし(明示的な設定が必要) | なし |
Dockerサンドボックス
// src/agents/sandbox/config.ts のデフォルト値
const sandboxDefaults = {
capDrop: ['ALL'], // すべてのLinux capabilityを削除
network: 'none', // ネットワーク隔離
readOnlyRoot: true, // ルートファイルシステム読み取り専用
securityOpt: 'no-new-privileges', // 権限昇格の禁止
tmpfs: ['/tmp', '/var/tmp', '/run'], // 書き込み可能領域
}ツールポリシー
サブエージェントに常に拒否されるツール
// src/agents/pi-tools.policy.ts
const SUBAGENT_TOOL_DENY_ALWAYS = [
'gateway', // システム管理
'agents_list', // システム列挙
'whatsapp_login', // 対話的セットアップ
'session_status', // ステータス管理
'cron', // スケジューリング
'memory_search', // システムメモリ
'memory_get', // メモリアクセス
'sessions_send', // 他セッションへの直接送信
]HTTP経由で拒否される危険なツール
// src/security/dangerous-tools.ts
const DEFAULT_GATEWAY_HTTP_TOOL_DENY = [
'sessions_spawn', // セッション生成 = リモートコード実行
'sessions_send', // セッション間メッセージ注入
'gateway', // Gateway設定変更
'whatsapp_login', // 対話的セットアップ
]レートリミット
// src/gateway/auth-rate-limit.ts
// ブルートフォース攻撃の防止
const DEFAULT_MAX_ATTEMPTS = 10 // 最大試行回数
const DEFAULT_WINDOW_MS = 60_000 // 1分間のウィンドウ
const DEFAULT_LOCKOUT_MS = 300_000 // 5分間のロックアウト認証スコープは3つに分離されています。
shared-secret— トークン/パスワード認証device-token— デバイストークン認証default— その他
ループバックアドレス(127.0.0.1)からの接続はデフォルトでレートリミット対象外です。
openclaw security audit
OpenClawには組み込みのセキュリティ監査ツールがあります。openclaw security audit --deep で実行すると、以下を自動チェックします。
openclaw security audit --deep
┌──────────────────────────────────────────────┐
│ Gateway Configuration │
│ - bind mode (loopback / lan / tailnet) │
│ - auth mode (token / password / none) │
│ - Tailscale Funnel exposure │
│ - Control UI device auth status │
│ - trusted proxy configuration │
│ - rate limiting configuration │
├──────────────────────────────────────────────┤
│ Filesystem Permissions │
│ - state dir: world-writable? │
│ - config file: readable by others? │
│ - symlink detection │
│ - iCloud / Dropbox sync detection │
├──────────────────────────────────────────────┤
│ Channel Security │
│ - DM policy per channel (open / pairing) │
│ - group policy (open / allowlist) │
│ - multi-user DM session isolation │
├──────────────────────────────────────────────┤
│ Tool & Execution Security │
│ - elevated exec allowlist wildcards │
│ - HTTP /tools/invoke dangerous allows │
│ - sandbox Docker configuration │
│ - node command deny patterns │
├──────────────────────────────────────────────┤
│ Deep Probe (--deep) │
│ - live gateway connectivity test │
│ - installed skills code safety │
│ - plugin trust verification │
│ - secrets in config detection │
└──────────────────────────────────────────────┘各指摘には critical、warn、info のいずれかの重要度が付与され、修正コマンドも提示されます。
セキュリティモデルの全体像
Threat Defense Layer
====== =============
Unknown sender DM → DM Pairing (default-deny)
Channel allowlist
Group chat injection → Group tool policy
Per-sender tool restrictions
Prompt injection → External Content Wrapping
(in messages/docs) SUSPICIOUS_PATTERNS detection
Unicode homoglyph normalization
WebSocket hijack → Origin validation (post CVE-2026-25253)
(CSWSH) Gateway URL confirmation modal
Auth brute force → Rate limiting (10 attempts / 60s)
5-minute lockout
Per-scope tracking
Command injection → shell=false (argv-based execution)
15 dangerous env vars blocked
PATH modification forbidden
Container escape → cap_drop ALL
read-only root filesystem
no-new-privileges
network: none
Tool misuse → Default-deny tool scope
(by agent/subagent) SUBAGENT_TOOL_DENY_ALWAYS
HTTP tool deny list
Supply chain → VirusTotal integration
(malicious skills) Cisco Skill Scanner
openclaw security audit --deep
Config misconfiguration → openclaw security audit
openclaw doctor warnings
Filesystem permission checks防御は多層であるが万全ではない
OpenClawのセキュリティモデルは多層防御(defense in depth)に基づいています。しかし、以下の構造的な課題は残っています。
LLMの判断に依存する防御
External Content Wrappingは「LLMがセキュリティ警告に従う」ことが前提です。Zenityの研究が示したように、間接プロンプトインジェクションでこの境界を越えることは可能です。OpenClawの公式ドキュメントでは、プロンプトインジェクション耐性の観点からClaudeモデルを推奨しています。
なお、SECURITY.mdではプロンプトインジェクション攻撃はセキュリティ脆弱性の**対象外(Out of Scope)**と明記されています。これはLLMの挙動が確率的であり、従来のソフトウェア脆弱性と同じ枠組みでは対処できないという判断によるものです。
デフォルト設定のリスク
デフォルトではDockerサンドボックスが無効であり、Embeddedモードで動作します。LLMが exec ツールを呼び出せば、ユーザー権限でコマンドが実行されます。サンドボックスの有効化が推奨されますが、必須ではありません。
まとめ
OpenClawに対する攻撃と防御を調査した結果、以下のことが分かりました。
- CVE-2026-25253(1-Click RCE)は、WebSocket Origin未検証と自動接続の組み合わせで、リンク1つからトークン窃取→完全なRCEが可能だった。v2026.1.29で修正済み
- 間接プロンプトインジェクション(Zenity「OpenDoor」)は、ドキュメント経由でTelegramバックドアを作成する攻撃を実証した。これはLLMの判断を操作する手法であり、ソフトウェアバグの修正では防げない
- ClawHubには約12%の悪意あるスキルが混入していた。AMOS(Atomic Stealer)の配布が確認されている
- OpenClawは12パターンの検出、Unicodeホモグリフ正規化、shell=false、15の危険環境変数ブロック、Docker隔離、レートリミット、組み込み監査ツールなど多層の防御を実装している
- ただし、LLMの判断に依存する防御とデフォルト設定の緩さには注意が必要
「外部メッセージ → LLM判断 → ローカル実行」というアーキテクチャに対してセキュリティを設計するのは、従来のソフトウェアセキュリティとは異なる挑戦です。OpenClawの攻防の歴史は、AIエージェントのセキュリティモデルを考える上で貴重な事例といえます。
参考リンク
- depthfirst - CVE-2026-25253 技術詳細
- Zenity Labs - OpenClaw or OpenDoor?
- CrowdStrike - What Security Teams Need to Know
- Cisco - Personal AI Agents Are a Security Nightmare
- Snyk - ToxicSkills Study
- OpenClaw GitHub リポジトリ
- OpenClawの通信経路を追う — なぜDiscordからbashを操作できるのか
- OpenClaw アーキテクチャ徹底解剖 — 5レイヤー構成の全体像
この記事が参考になったら
この記事が役に立ったと思いましたら、よろしければフォローをお願いします。
AIエージェントのセキュリティ設計やリスク評価に興味がありましたら、お気軽にご連絡ください。
株式会社hanzochangお問い合わせフォーム最新の記事

FDE(Forward Deployed Engineering)とは - 中小企業のAI導入で活きる場面
FDE(Forward Deployed Engineering)はPalantirが体系化した顧客現場型エンジニアリング手法です。中小企業のAI導入においてFDEが活きる具体的な場面と、従来のSIer・コンサル・SaaSとの違いを解説します。

OpenClaw 通信・接続の仕組み - なぜDiscordのメッセージでローカルのbashが動くのか
OpenClawはなぜDiscordやSlackからローカルのbashを操作できるのか?外向きWebSocket接続の仕組み、Gateway内部のメッセージフロー、Node.jsプロセスの権限継承まで、ソースコードを追いながら通信経路を解説します。

OpenClawの仕組み アーキテクチャ解剖 - ソースコードで読む5レイヤー設計
OpenClaw(旧Moltbot/Clawdbot)のソースコードを徹底解読。Input Sources・WebSocket Gateway・Agent Runtime・LLM Providers・Output & Storageの5レイヤー構成、ChannelPluginインターフェース、エージェントループ、スキルシステムの設計思想を解説します。
![[並列作業] ClaudeCodeに声でリマインダさせて、待ち時間放置時間をゼロに!](/_next/image?url=https%3A%2F%2Fs3.ap-northeast-1.amazonaws.com%2Fhanzochang.com%2F_v2%2F1770701250089_eaz028bl2ee.png&w=3840&q=75&dpl=dpl_BtBZuFBVgbWiVY8kSTnA52T6Bt1u)
[並列作業] ClaudeCodeに声でリマインダさせて、待ち時間放置時間をゼロに!
Claude Codeが完了や質問待ちになったら音声で喋って教えてくれる。放置が続けば繰り返しリマインド、応答したら自動停止。セッション終了後のリマインダ残留問題の対策と、ミュート切り替え機能も解説。プロンプト付き。
![[並列作業] ClaudeCodeの進捗を「音+案件名」で通知!プロンプト付き!](/_next/image?url=https%3A%2F%2Fs3.ap-northeast-1.amazonaws.com%2Fhanzochang.com%2F_v2%2F1770700583435_vn59k4qd8b.png&w=3840&q=75&dpl=dpl_BtBZuFBVgbWiVY8kSTnA52T6Bt1u)
[並列作業] ClaudeCodeの進捗を「音+案件名」で通知!プロンプト付き!
Claude Codeを複数プロジェクトで並列に走らせていると、どこが終わったか見失いがち。Hooksとsayコマンドで「効果音+案件名の読み上げ」を設定すれば、画面を見なくても進捗が分かります。コピペで設定できるプロンプト付き。

MCP Apps入門 - Skill付き!AIチャット内にオリジナルUIを埋め込む
Model Context Protocol Appsを使ってAIクライアント内にHTML UIを埋め込む方法を解説します。テキストだけでは伝えきれない色やチャートのようなビジュアル情報をインタラクティブに表示する技術を学べます。
