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

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

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

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

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
CVE-2026-32722 — Bloomberg Memray のエスケープされていないコマンドラインメタデータによる保存型XSS | Kitploit
ツール/GitHubGitHub/0xmrma/cve-2026-32722
静的コード分析 (SAST)脆弱性分析ウェブアプリケーション悪用ペネトレーションテスト論文と研究学習と教育
GitHub0xmrma/cve-2026-32722

CVE-2026-32722

Bloomberg Memray のエスケープされていないコマンドラインメタデータによる保存型XSS

リポジトリを見る
175ヶ月前未レビュー

人気

すべて見る →

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

すべてのツールを探索

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

すべてのツールを見る →
共有

CVE-2026-32722

Bloomberg Memray のエスケープされていないコマンドライン・メタデータを介した保存型 XSS

はじめに

Memray(Bloomberg の Python メモリプロファイラ)をレビューしていた際、私はシンプルな疑問を胸にこの問題を発見しました。

攻撃者が制御するランタイム・メタデータは、ブラウザでレンダリングされるレポート出力に、安全でない形で混入し得るのか?

このケースでは、答えはイエスでした。

バグは Memray の HTML レポート生成経路にあり、コマンドライン・メタデータがエスケープされることなく、ブラウザで開かれるレポートにレンダリングされていました。これにより、運用上のフィールドが実行可能な HTML シンクへと変わり、最終的に CVE-2026-32722 になりました。

プロジェクト: Memray on GitHub
アドバイザリ: GHSA-r5pr-887v-m2w9 /CVE-2026-32722

photo0

攻撃チェーン

attacker-controlled argv → metadata.command_line → HTML template sink without escaping → raw markup in generated report → browser-side JavaScript execution


Memray が行うこと

Memray は Python メモリプロファイラです。

Python プロセスを計測し、アロケーションの挙動を記録して、開発者が以下を理解するのに役立つレポートを生成します:

  • メモリがどこで確保されるか
  • どのコールパスが原因か
  • ピークメモリ使用量がどのようなものか
  • メモリが時間とともにどのように変化するか

これらのレポートの一部は HTML として出力され、ブラウザで開かれます。

そのため、レポート生成は現実のセキュリティ境界となります。

重要な問いは、Memray が「ローカルツール」であるかどうかではありません。
重要な問いは、攻撃者が制御するデータがブラウザでレンダリングされる出力に、安全でない形で混入し得るか です。

このケースでは、それは可能でした。


このバグを調査する価値があった理由

多くの人々は開発者向けツールを過小評価しています。

それは誤りです。

ツールが一度でも:

  • ランタイム・メタデータを記録し、
  • 攻撃者の影響を受けた値を保存し、
  • そして後でそれらを HTML にレンダリングするなら、

そのツールは Web アプリケーションと同じ出力エンコーディングのリスクを引き継ぎます。

これが今回の核心的な問題でした。

このバグはプロファイリングロジックにあったのではありません。 アロケーション追跡にあったのでもありません。 ネイティブメモリ処理にあったのでもありません。

これは古典的な信頼境界の失敗でした:

  • 信頼されていないメタデータがシステムに入り、
  • HTML シンクへと到達し、
  • エスケープされずにレンダリングされました。

それだけで、現実の脆弱性を生み出すのに十分です。


私が着目した境界

私は Memray に対して、ランダムな CLI オプションをファジングしたり、クラッシュを追いかけたりするアプローチは取りませんでした。

より強力なアプローチは、まず最初に最も可能性の高いセキュリティ面を特定することでした。

Memray にとって、それは HTML レポート生成 でした。

なぜでしょうか?

なぜなら HTML 出力はブラウザシンクを導入し、ブラウザシンクは以下の条件が揃うと、ありふれたメタデータのバグをセキュリティ問題へと変えるからです:

  • 入力が攻撃者の影響を受けている
  • 出力がエスケープされていない
  • ブラウザがその結果をテキストではなくマークアップとして解釈する

今回起きたのはまさにこれです。


根本原因

このバグは 2 行に要約できます。

以下の箇所で:

root@kitploit:~
def get_render_environment() -> jinja2.Environment:
    loader = jinja2.PackageLoader("memray.reporters")
    env = jinja2.Environment(loader=loader)

Jinja 環境が autoescape なしで作成されています。

そして以下の箇所で:

root@kitploit:~
Command line: <code>{{ metadata.command_line }}</code><br>

metadata.command_line が直接 HTML にレンダリングされます。

これが脆弱性の全体です。

なぜこれが悪用可能なのか

なぜなら metadata.command_line は攻撃者の影響を受けるからです。

Memray は、プロファイリング対象のプログラムを実行するために使われたコマンドラインを記録します。 つまり、argv からのユーザー制御の値がメタデータとして保持され、後でレポートに挿入されるということです。

したがって、悪用チェーンは単純明快です:

  • 攻撃者がコマンドラインの内容を制御する
  • Memray がそれを metadata.command_line に保存する
  • テンプレートがそれを HTML に出力する
  • 環境がそれを autoescape しない
  • ブラウザがそれを生きたマークアップとして解析する

これにより、メタデータが実行可能なブラウザコンテンツへと変わります。


これを単なるレンダリング不良ではなくセキュリティ問題にしているもの

重要な違いは「実行」です。

フォーマットが崩れた HTML を生み出すバグは数多くあります。 それだけでは不十分です。

今回、攻撃者が制御するコンテンツは、単にページソースに表示されるだけではありませんでした。 ブラウザによってアクティブな HTML として解釈され、JavaScript として実行されました。

これが以下の違いです:

  • フォーマットの破損
  • そして真の XSS シンク

したがって問いは、次のようなものではありませんでした:

「HTML がレポートに現れ得るのか?」

本当の問いは次の通りでした:

「レポートを開いたとき、攻撃者が制御する HTML は実行可能になり得るのか?」

答えはイエスでした。


PoC

私の最初の再現コードは、明示的なスクリプトと攻撃者が制御する引数を使用しました:

root@kitploit:~
cat > victim.py <<'PY'
x = [b"A" * 1024 for _ in range(1000)]
print("done")
PY

python -m memray run -o poc.bin victim.py ''
python -m memray flamegraph -o poc.html poc.bin

生成された HTML には、攻撃者が制御する生のマークアップが含まれていました:

root@kitploit:~
Command line: <code>~/memray/src/memray/__main__.py run -o poc.bin victim.py </code><br>

生成されたレポートを開くか更新すると、JavaScript の実行が引き起こされました。

これにより、中心的な主張が確立されました:

  • 値がエスケープされていなかった
  • ブラウザがそれをマークアップとして解析した
  • そしてシンクが実行可能だった

その後、協調的な開示の過程で、メンテナは再現コードをさらに簡素化しました:

root@kitploit:~
python -m memray run -o poc.bin -c '# '

このバージョンの方が優れているのは、脆弱な境界をより直接的に切り出しているからです:

  • 追加のファイルがない
  • 追加のアプリケーションロジックがない
  • 攻撃者が制御するコマンドラインの内容がレポートパイプラインに入るだけ

ペイロードが選ばれた理由

ペイロードは意図的に単純なものにしました:

root@kitploit:~

これは派手なペイロードの話ではありません。

これはクリーンな実行プローブです。なぜなら:

  • 外部インフラを必要としない
  • レンダリングされた HTML で一目で分かる
  • HTML として解釈されることを即座に証明する
  • リモートコンテンツに依存せずにブラウザ側での実行を証明する

この種のバグにとって、それで十分です。


影響範囲の検証

1 つのレポート種別だけでも、この問題を報告するには十分でした。

しかし私は、これが孤立した問題なのか、構造的な問題なのかを知りたいと思いました。

同じ挙動を以下のレポートで確認しました:

  • flamegraph レポート
  • table レポート
  • --no-web で生成された flamegraph レポート

これには 2 つの理由がありました。

第一に

脆弱なシンクが複数の HTML 出力にわたって再利用されていることが示されました。

第二に

このバグが CDN でホストされた外部アセットに依存していないことが証明されました。

--no-web でも問題が再現しました。つまり、問題はリモートの JS の動作ではなく、Memray 自身が生成する HTML とテンプレート処理にあったということです。 そのため、この主張ははるかに強力になりました。


これが低重大度に分類された理由

メンテナの主な懸念は、現実的な攻撃者の制御可能性でした。

それは妥当です。

これは、認証されていないリモート攻撃者が露出した HTTP エンドポイントに到達して即座に影響を得る、といった種類の問題ではありません。

悪用の条件はより狭いものです:

  • 攻撃者がコマンドライン入力を操作する
  • 被害者が後で生成されたレポートをブラウザで開く

そのため、現実的な分類は低重大度でした。

だからといって、これは弱いバグではありません。

重大度は悪用条件と想定される影響に関するものです。 妥当性は、その問題が現実のものかどうかに関するものです。

この問題は明らかに現実のものでした:

  • 攻撃者が制御するソース
  • HTML シンク
  • エスケープの欠如
  • 実際の JavaScript 実行
  • 確定的な修正

だからこそ、これは依然として CVE になりました。


修正の分析

修正は最小限かつ正しいものでした。

メンテナは以下の箇所を:

root@kitploit:~
{{ metadata.command_line }}

以下のように変更しました:

root@kitploit:~
{{ metadata.command_line|e }}

これは脆弱なシンクに直接対処するため、正しい修正です。

以下のような生のマークアップを出力する代わりに:

root@kitploit:~

テンプレートは現在、エスケープされたテキストを出力します:

root@kitploit:~
&lt;img src=x onerror=alert(1)&gt;

これにより、ブラウザでの実行経路を排除しつつ、コマンドラインフィールドの情報としての価値が保持されます。

メンテナはまた、テンプレートの残りのコンテキストをレビューし、以下のように結論付けました:

  • いくつかのフィールドは数値である
  • 一部の文字列は Memray が完全に制御している
  • スクリプトに渡される値は |tojson でレンダリングされている

そのため、この問題は正しく metadata.command_line に限定されました。

これはまさに、実際の開示プロセスで期待される修正レビューのあり方です。


開示

これは GitHub Security Advisories を通じて非公開で報告されました。

メンテナたちは:

  • 問題を検証し
  • 修正すべき自分たちのバグであると認め
  • 再現コードを簡素化し
  • 脆弱なシンクにパッチを適用し
  • 1.19.2 で修正をリリースし
  • CVE を申請し
  • アドバイザリを公開しました

この問題には次の ID が割り当てられました: CVE-2026-32722


このバグが実際に教えること

ここでの重要な教訓は単純です:

メタデータは、運用上のものに見えるというだけで、自動的に信頼されるべきではない。

  • コマンドラインは無害に感じられます。
  • レポートのモーダルは無害に感じられます。
  • ローカルの HTML ファイルは無害に感じられます。

攻撃者が制御するコンテンツが、エスケープされずにブラウザでレンダリングされる出力へ混入してしまえば、それらはどれも意味を持ちません。

ツールが HTML を出力する瞬間から、そのツールは HTML を生成するアプリケーションとして扱われる必要があります。

それが本当の教訓です。


重要なポイント

  • HTML レポート生成はセキュリティ面である
  • 開発者向けツールにも出力エンコーディングの規範が必要である
  • ローカルのレポート成果物には実際の XSS シンクが含まれ得る
  • 攻撃者が制御するメタデータがシンクに到達する場合、テンプレートでのエスケープ欠如だけで十分である
  • 低重大度は低品質を意味しない
  • ここで正しい考え方は、闇雲なファジングではなく、信頼境界の分析だった

最後に

この脆弱性は、巧妙なペイロードの話ではありません。

適切な境界を特定することでした。

Memray は、攻撃者の影響を受けたコマンドライン・メタデータを受け取り、それをエスケープせずに生成された HTML へレンダリングしました。 残りはブラウザが行いました。

だからこそ、これは CVE-2026-32722 になりました。

Memray 1.19.2 で修正されました。

photo0
ツールをダウンロード