Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
CVE-2026-66421-OpenClaw-Dashboard-Stored-XSS-via-lastMessage-Session-Field — セキュリティアドバイザリ: エージェントメッセージ経由の格納型クロスサイトスクリプティングによるセッショントークン窃取 (openclaw-dashboard) | Kitploit
ツール/GitHubGitHub/theopaid/cve-2026-66421-openclaw-dashboard-stored-xss-via-lastmessage-session-field
脆弱性分析エクスプロイトウェブアプリケーション悪用ウェブセキュリティAPIセキュリティAIセキュリティ
GitHubtheopaid/cve-2026-66421-openclaw-dashboard-stored-xss-via-lastmessage-session-field

CVE-2026-66421-OpenClaw-Dashboard-Stored-XSS-via-lastMessage-Session-Field

セキュリティアドバイザリ: エージェントメッセージ経由の格納型クロスサイトスクリプティングによるセッショントークン窃取 (openclaw-dashboard)

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有
リポジトリを見る
17日前未レビュー

セキュリティアドバイザリ: エージェントメッセージを介したセッショントークン窃取につながる保存型クロスサイトスクリプティング (openclaw-dashboard)

タイトル: OpenClawダッシュボードのlastMessageセッションフィールドを介した保存型XSS CVE ID: CVE-2026-66421

https://github.com/tugcantopaloglu/openclaw-dashboard

概要

ダッシュボードのランディングページにあるセッションテーブルには、各エージェントセッションの最後のメッセージが表示されます。そのテキストはエージェントの会話トランスクリプトから取得され、innerHTML を使ってエスケープ処理なしでページに書き込まれます。OpenClawはマルチチャネルエージェントゲートウェイであるため、メッセージテキストはチャットグループやウェブフックなど、エージェントに話しかけられる誰からでも取得され得ます。HTMLペイロードを含むメッセージは、管理者がダッシュボードを開くとすぐに、そのブラウザ上でスクリプトとして実行されます。

  • CWE-79: Improper Neutralization of Input During Web Page Generation (Cross-site Scripting)
  • CVSS 4.0: 8.8 (High). Vector: CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:P/VC:H/VI:H/VA:N/SC:H/SI:H/SA:N

影響を受けるバージョン

最初の公開リリースから存在します。脆弱なレンダリングは、最初のタグ(v1.1.0)と、現在の main(d6198d0)までのすべての以降のコミットに存在します。執筆時点では修正されていません。

脅威モデル

攻撃者は、エージェントのセッションのトランスクリプトに格納されるメッセージを送信できる者です。ダッシュボードのアカウントは不要です。一般的なOpenClawのデプロイでは、これには接続されたチャットチャネルのメンバーや、ウェブフック経由でエージェントに到達するあらゆる送信元が含まれるため、攻撃者は多くの場合、運用者の信頼境界の外側にいます。

ペイロードはトランスクリプトに保存され、管理者がセッションページを表示するたびにレンダリングされます。そのページはデフォルトのランディングビューであり、タイマーで更新されるため、必要な操作は管理者が通常使用するダッシュボードを読み込むことだけです。AT:P は攻撃者が依存する唯一の条件、つまりデプロイが攻撃者のメッセージをダッシュボードが表示するセッションにルーティングすることを反映しています。

根本原因

ステップ1: メッセージテキストはトランスクリプトから抽出されます。 サーバーは最新のメッセージを読み取り、そのテキストを80文字に切り詰めて、サニタイズなしで返します。

root@kitploit:~
// server.js:474-481
if (typeof msg.content === 'string') {
  text = msg.content;
} else if (Array.isArray(msg.content)) {
  for (const b of msg.content) {
    if (b.type === 'text' && b.text) { text = b.text; break; }
  }
}
if (text) return text.replace(/\n/g, ' ').substring(0, 80);

ステップ2: セッションAPI経由で公開されます。 getSessionsJson は、各セッションの lastMessage フィールドにテキストを設定します。

root@kitploit:~
// server.js:538
lastMessage: getLastMessage(s.sessionId || key),

GET /api/sessions はこの配列をブラウザに返します。

ステップ3: エスケープなしでDOMに書き込まれます。 セッションテーブルは、文字列の連結によって各行を構築し、innerHTML で代入します。

root@kitploit:~
// index.html:3758
const lastMsg = s.lastMessage ? s.lastMessage.substring(0, 60) + (s.lastMessage.length > 60 ? '…' : '') : '';
root@kitploit:~
// index.html:3773
<div class="table-cell" style="..." onclick="toggleSessionExpand('${escapedKey}', event)">${lastMsg}</div>

lastMsg はそのままHTML文字列に挿入されます。この経路にはエンコード処理は一切ありません。

同じテーブルは、s.label(index.html:3770)と s.key(index.html:3767)も同じ方法で行のマークアップに補間します。これらのフィールドには60文字という上限がないため、それらに影響を与えられる攻撃者により多くのペイロードのスペースを与えます。

server.js:298 の Content-Security-Policy はインラインイベントハンドラを許可しているため(script-src 'self' 'unsafe-inline')、onerror ハンドラが実行されます。

概念実証

  1. エージェントにメッセージを送信できる者は、60文字という制限に収まる短いペイロードをテキストとして含むメッセージを送信します。例:

    root@kitploit:~

    これは56文字で、通常のメッセージと同様にエージェントのセッショントランスクリプトに到達します。

  2. サーバーがペイロードをエスケープせずに返すことを確認します:

    root@kitploit:~
    curl -H "Authorization: Bearer ADMIN_TOKEN" http://TARGET:7000/api/sessions
    

    影響を受けるセッションの lastMessage フィールドには、そのままの `` 文字列が含まれます。

  3. 管理者がダッシュボードを開きます。セッションページはデフォルトビューであるため、追加のナビゲーションは不要です。行がレンダリングされると、ブラウザが `` タグを解析し、onerror ハンドラが実行され、ペイロードによって管理者のセッショントークンが読み取られます。

console.log の本体を、同一オリジンの認証付きエンドポイントへの fetch に置き換えると、ペイロードはログイン済みユーザーの権限で動作できます。

影響

ログイン中のユーザーとしてダッシュボードオリジンでスクリプトが実行される可能性があり、これはエージェントにメッセージを送信するだけでよい攻撃者によって到達可能です。ペイロードはセッショントークンを読み取り、エージェント自身の指示ファイルやOpenClaw設定を編集するエンドポイントを含む、認証付きエンドポイントを呼び出すことができます。デフォルトページで発火するため、管理者は特別な操作を行う必要はありません。

修復策

  • 行マークアップに挿入する前に lastMessage、label、key をHTMLエンコードするか、HTML文字列ではなく textContent でセルを構築してください。
  • innerHTML を介してレンダリングされる他のセッションフィールドにも同じエンコードを適用してください。
  • script-src から 'unsafe-inline' を削除して、たとえエンコード手順が欠落しても、挿入されたマークアップが実行されないようにしてください。
ツールをダウンロード