コンセプト
OpenClawは最近、ハッカーの攻撃対象になりやすい。OpenClaw自体の脆弱性に加え、LLMフレンドリーな様々な攻撃手法が乱立している。この問題を解決するためにClawSecCheckが開発された。
ClawSecCheckはOpenClaw AIエージェント向けのローカル・読み取り専用・オフラインのセキュリティ自己監査(self-audit)ツールである。OpenClawのスキルとしてインストールし対話的に使うことも、標準CLIとして実行することもできる。
「あなた自身のエージェントに対するワンコマンドのセキュリティ自己監査。」
核心的な設計思想は「他人のエージェントをスキャンする」ことではなく、自分のエージェントを自分で監査することにある。これにより所有権の証明や法的グレーゾーンの問題が発生しない。ツールは設定をA〜Fで採点し、最も緊急性の高い穴を平易な言葉で示し、コピー&ペースト可能な修正案と共有用の等級バッジを提供する。
OpenClawエージェントはユーザーのメッセージを読み、会話を記憶し、キーを保持し、ユーザーに代わって行動する。これらの権限はまさに攻撃者が狙う表面であり、汚染された1つのメッセージや1つの悪意あるスキルが静かにエージェントを敵に変える可能性がある。ClawSecCheckはそのリスクを事前に検知するために設定を検査し、等級を付与する。
動作原則
- 対話ベースの監査: OpenClaw内で実行すれば、エージェントがフラグを知らなくても全過程を対話的に案内する(ガイドモード)。
- 読み取り専用: 設定・スキルを一切変更しない。
--fixのような機能は存在しない。 - オフライン・非送信: ネットワーク呼び出し・APIキー・テレメトリが一切ない。読み取る対象は
~/.openclaw/openclaw.jsonとワークスペースのブートストラップMarkdownファイルのみ。 - 正直さ優先: 判断不能な項目は
UNKNOWNと表記し、採点から除外する。UNKNOWNは絶対にPASSではない。
内部的にはただ1つ、ユーザー自身のプラットフォーム監査のみを読み取り専用で呼び出し、結果を統合する。シェルなし、--fixなし、タイムアウトあり、--no-nativeでスキップ可能。
openclaw security audit --json
何を検査するのか?
Lethal Trifecta — 代表フレーム
ClawSecCheckがレポート最上部に表示する中核指標である。信頼できない入力 × 機密データへのアクセス × 外部(送信・実行)行動の3つが同時に成立すると、侵害が致命的または自明になる。ツールはこの3つのうち2つ以下の維持を推奨し、上部にScore・Grade・Trifecta比率を併記する(共有バッジには等級のみを公開)。
チェック群(チェックID基準)
チェックは以下のチェックID体系で実装される。大きく露出・権限・シークレット(B1〜B12)、サプライチェーン(B13〜B15)、備え(B16〜B17)、エージェント行動(B18〜B24)、インジェクション・深層露出(B26以降)、能力・ホスト拡張(B43・B50番台)、そしてネイティブ監査統合(A1)とリスクエンジン(RISK)に分かれる。
| チェック群 | 代表項目 |
|---|---|
| B1〜B12 | ゲートウェイ露出・チャネル認証、平文シークレット、最小権限、実行サンドボックス、TLS、ローカルモデル衛生 |
| B6 | ブートストラップファイル(SOUL.md、AGENTS.md、TOOLS.md)のプロンプトインジェクション誘発指示文を検査 |
| B13 | インストール済みサードパーティスキルのコンテンツ静的検査。ClawHavoc系マルウェアとbase64隠蔽ペイロードを検出。v0.21以降はPython ASTパースによりexec(base64.b64decode(...))等の難読化を捕捉し、v0.23以降は認証情報ファイルがネットワークシンクに流れるテイントを追跡 |
| B14 / B15 | イグレス表面 / MCPサーバー信頼境界 |
| B16 / B17 | 脅威モニタリングの有無 / 自律性・heartbeat |
| B18〜B24 | サブエージェント委任、データ・アットレスト露出、アイデンティティ・メモリファイル書き込み保護、ツール出力信頼境界、自己修正、承認バイパス、深層MCPハードニング |
| B26 | 信頼できないコンテキスト露出(contextVisibility="all"のデフォルト) |
| B30 / B31 / B32 | 送信者アイデンティティ強度 / tools.deny:["write"]がapply_patch・execを阻止できないfootgun / コントロールプレーン変更の到達可能性 |
| B33 | 既知の脆弱バージョンゲート(meta.lastTouchedVersionと照合) |
| B38 / B39 / B41 / B42 | ブラウザSSRF(169.254.169.254等) / セッション可視性・クロスユーザー漏洩 / 認証情報のブラストラディウス / インストール時サプライチェーン(preinstallフック、world-writableなスキルディレクトリ) |
| B43 / B44 (証言レイヤー) | 静的スキャンでは見えない実際のツール/verbインベントリをエージェントの自己報告で補強。EXEC/DESTRUCTIVE/EGRESS/MAILBOX_CONFIG/REVERSIBLEに分類し、configとのドリフトを確認(信頼度ATTESTED、実験的) |
| B50〜B54 (Host Watch) | エージェントが動くホスト自体が監視されているか: ネットワークIDS、ホスト監査、ファイル整合性、EDR、ホストファイアウォール。LOW深刻度で、絶対にFAILには繋がらない |
| A1 | プラットフォーム自体のopenclaw security auditを代わりに実行し、同一レポートに統合(スコアには反映されない) |
汚染入力サニタイザー・アクションゲート・テイントラベリング(B26〜B28)はまだロードマップ段階であり、最大の残存カバレッジギャップである。UNKNOWNと表記される判断不能項目が存在する理由もここにある。
リスクエンジン — RISK-01〜RISK-10
個別チェックを超えて、2つ以上の属性が同時に成立すると侵害が致命的になる組み合わせ(キャパビリティチェーン)を10種類、別途検出する。
| ID | 深刻度 | チェーン |
|---|---|---|
| RISK-01 | CRITICAL | 信頼できない送信者 → exec/write/昇格ツール → ホスト/ファイルシステム |
| RISK-02 | HIGH | 信頼できない入力 → 機密データへの到達 → 送信/実行 (Lethal Trifecta) |
| RISK-03 | HIGH | 信頼できないイングレス + サンドボックスなし → ホストで直接exec/write |
| RISK-04 | HIGH | 可変アイデンティティ(name-matching) → 昇格/execツール → 権限昇格 |
| RISK-05 | HIGH | ブラウザSSRF(プライベートネットワーク) → シークレット/認証情報 → 漏洩 |
| RISK-06 | CRITICAL | 開放/信頼できない表面 → コントロールプレーンエンドポイント → 完全な乗っ取り |
| RISK-07 | HIGH | 承認ゲートのないexec/write → 書き込み可能なブートストラップ/アイデンティティファイル → 持続的侵害 |
| RISK-08 | MEDIUM | マルチユーザーチャネル → 共有セッション(dmScope="main") → クロスユーザー漏洩 |
| RISK-09 | CRITICAL | 悪意あるインストール済みスキル(B13 fail) → 到達可能なシークレット → イグレス → 漏洩 |
| RISK-10 | MEDIUM | 信頼できない入力 → ホストexec/write → ホスト検知の不在 → 侵害が見えない |
各チェーンはすべてのリンクに陽性の証拠がある場合のみ発火(evidence-gated)するため誤検知が少ない。リスクエンジンは決定論的なA-F採点を変更せず別枠で表示され、スコアインフレを起こさずに最悪経路を一目で示す。
採点方式
加重合格率で採点する(CRITICAL=10、HIGH=6、MEDIUM=3、LOW=1)。ここに正直さのハードキャップがかかる。未解決のCRITICALが1つでもあればスコア上限は49、未解決のHIGHがあれば上限は79に固定され、致命的な穴を抱えたままAを取ることはできない。
| 等級 | スコア |
|---|---|
| A | 90+ |
| B | 80〜89 |
| C | 70〜79 |
| D | 50〜69 |
| F | <50 |
UNKNOWNは採点されず、アドバイザリー(advisory)チェックは等級を動かさない。共有カードは等級・スコア・Trifecta比率のみを公開し、発見事項は非公開のままにする — 共有が攻撃者に地図を渡すことになってはならないからだ。
長所
- プライバシー優先・完全ローカル: アカウント・APIキー・テレメトリ・ネットワークリクエストが一切ない。デフォルトで保存されるのは所有者専用のローカルスコア履歴(
~/.clawseccheck/history.jsonl)の1行のみで、--no-historyでオプトアウト可能。 - ネイティブ監査が見逃す部分を検査: プラットフォーム自体の監査が検査しないブートストラップファイル(
SOUL.md・AGENTS.md・TOOLS.md)をプロンプトインジェクションの観点(B6)から点検する。 - インストール前のリスク評価:
--vet <スキル>でスキルを、--vet-mcpで接続されたMCPサーバーをインストール・信頼前に検証する(SAFE/SUSPICIOUS/DANGEROUS)。多くのツールがスキルのみを見てMCPサーバーを見落とすサプライチェーンのギャップを狙う。ClawHavoc事件以降特に重要な機能。 - 能動的インジェクションテスト:
--canary(手動インジェクション自己テスト)、--redteam(ツールポイズニング・MCP応答インジェクション・メモリポイズニング・マルチエージェント・承認バイパス・dirty-to-exfiltrationシナリオ)、--dryrun(偽シークレット・偽ツールによる実行時挙動テスト)を提供する。 - 正直な設計:
UNKNOWN ≠ PASSであり、限界を緑色のスコアの裏に隠さない。リスクチェーンは証拠がある場合のみ発火する。 - 完全無料・オープンソース・依存ゼロ: MITライセンス、純粋なPython標準ライブラリ。
- 多様な出力とCIゲート: 人間向けレポート、
--json、--sarif(SARIF 2.1.0)、--html、--badge(SVG)、--card。CIでは--fail-under 70、--exit-codeでゲーティングする。
短所と限界
- OpenClawエコシステム専用: 他のエージェントプラットフォームには適用できない。
- 対話露出の認識が必要: OpenClawチャットで使用すると、レポートテキストが会話の一部となり、既に使用しているモデルプロバイダーによって処理される。スキャナー自体が新しいチャネルを作るわけではないが、この点は認識しておく必要がある。
- CLI使用時にはPython環境が必要: pipxインストールが推奨される(
pip install .も可能)。Windowsではposix権限チェックが省略され、Unicode非対応コンソールはASCIIにフォールバックする。 - 静的・ヒューリスティック監査: 実行時検証や形式的証明ではなく、誤検知・見逃しが発生する可能性がある。実行中のエージェントに対する敵対的テストの代替にはならない。読み取る範囲も設定ファイル・ブートストラップMarkdown・インストール済みスキルのテキストに限定される。
- 非常に新しく小規模なプロジェクト: まだpre-1.0(0.x)であり、単独著者が運営する。フラグ・スキーマ・チェックIDはマイナーリリースでも変わる可能性があり、1.0に至ってようやく契約が固定される。成熟度と検証履歴の面では、ClawSec・ClawSecureのような大規模プロジェクトに劣る。公開レポートやコラムで引用する際はこの点を明示しておくのが安全である。
類似プロジェクトとの比較
| プロジェクト | 形態 | 特徴 |
|---|---|---|
| ClawSec (prompt-security) | スキルスイート | OpenClaw・Hermes・PicoClaw・NanoClaw対象。ドリフト検出、スキル整合性検証、NVDベースのセキュリティアドバイザリーフィード |
| ClawSecure | クラウド監査プラットフォーム | 3,000以上のスキルを監査、OWASP ASI 10/10カバレッジ、3-Layer Audit Protocol、継続的モニタリング |
| ClawScan | CLI(npx clawscan) |
スキルインストール前にマルウェア・リバースシェル・プロンプトインジェクション・Unicode攻撃を検出、MIT |
| ClawVitals | スキル+プラグイン | ローカル実行ヘルスチェック、設定改ざん検知・ドリフト通知、スコアリング |
| openclaw-security-scan(legendaryabhi) | 純粋なBash CLI | Python不要、クリティカル問題の自動修正(auto-fix)、CI用JSON出力 |
はじめに
OpenClawチャットから(ターミナル不要)
openclaw skills install clawseccheck # ClawHubから(スラッグは固有)
openclaw skills install git:gl0di/clawseccheck # またはGitHubから直接
インストール後、「audit my OpenClaw setup with clawseccheck」とリクエストすれば等級と最も緊急性の高い問題がチャットに表示される。 ClawHubスキルページ: https://clawhub.ai/gl0di/clawseccheck
標準CLI
pipx install git+https://github.com/gl0di/clawseccheck # または pip install .
clawseccheck --home ~/.openclaw # 以降は clawseccheck のみ
python -m clawseccheck # 同様に動作
バンドルスクリプトを直接実行
python3 audit.py # 人間向けレポート + 共有カード
python3 audit.py --json # 機械読み取り用
python3 audit.py --card # バッジのみ
python3 audit.py --sarif results.sarif # GitHub Code Scanningアップロード用(ローカル記録)
python3 audit.py --html report.html # 単独HTMLレポート(所有者専用)
python3 audit.py --fail-under 70 # スコア70未満ならexit 1(CI)
python3 audit.py --ascii # Unicode非対応コンソール向けフォールバック
整合性確認
python3 audit.py --verify-self # ClawSecCheck自身のソースのSHA-256(改ざん防止)
リリースはタグ付けされて公開されるため、セキュリティに敏感な場合はblind auto-updateよりも更新前にタグをレビュー・ピン固定するほうが安全である。
対話コマンドと内部動作
| ユーザーリクエスト | 内部動作 |
|---|---|
| 「Audit my OpenClaw setup」 | デフォルト監査: A-F等級 + 優先度別修正リスト + Trifecta |
| 「Is this skill safe to install?」 | --vet <スキル> (SAFE/SUSPICIOUS/DANGEROUS) |
| 「Are my MCP servers safe?」 | --vet-mcp |
| 「Am I vulnerable to prompt injection?」 | --canary / --redteam |
| 「Watch my setup for changes」 | --monitor (ドリフト・スコア低下・新規スキル/MCP/チャネル通知) |
| 「What should I fix first?」 | --next (発見事項ベースの優先順位) |
| 「Give me fix prompts」 | --prompts (発見事項ごとのコピー&ペースト修正プロンプト) |
| 「Share my grade」 | --badge / --card (等級のみ公開) |
参考資料
- リポジトリ: https://github.com/gl0di/clawseccheck
- セキュリティモデル: https://github.com/gl0di/clawseccheck/blob/main/SECURITY_MODEL.md
- スキル定義: https://github.com/gl0di/clawseccheck/blob/main/SKILL.md
- ClawHubスキルページ: https://clawhub.ai/gl0di/clawseccheck
本文書はREADME v0.30.1時点を基準とする。pre-1.0プロジェクトの特性上、フラグ・スキーマ・チェックIDは以降のリリースで変更される可能性がある。