Skip to content
KitploitKITPLOIT
ツールエクスプロイトブログ
Log in
提出
ツールエクスプロイトブログ
提出

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

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

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

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
React-Router-CVE-2025-61686- — CVE-2025-61686 の詳細分析:React Router のファイルセッションストレージにおけるパストラバーサル脆弱性の根本原因、攻撃シナリオ、コード監査結果。 | Kitploit
ツール/GitHubGitHub/kai-one001/react-router-cve-2025-61686-
静的分析脆弱性分析コード分析エクスプロイトウェブセキュリティ学習と教育
GitHubkai-one001/react-router-cve-2025-61686-

React-Router-CVE-2025-61686-

CVE-2025-61686 の詳細分析:React Router のファイルセッションストレージにおけるパストラバーサル脆弱性の根本原因、攻撃シナリオ、コード監査結果。

人気

すべて見る →

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

すべてのツールを探索

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

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

CVE-2025-61686 脆弱性分析レポート

脆弱性概要

CVE ID: CVE-2025-61686
影響バージョン: @react-router/node 7.0.0 から 7.9.3
脆弱性タイプ: パストラバーサル (Path Traversal) / ディレクトリトラバーサル

脆弱性の原理

1. 脆弱性の場所

脆弱性は packages/react-router-node/sessions/fileStorage.ts ファイル内の getFile() 関数および関連するファイル操作ロジックに存在します。

2. 核心的な問題の分析

2.1 Session ID の取得元

packages/react-router/lib/server-runtime/sessions.ts の 267 行目:

async getSession(cookieHeader, options) {
  let id = cookieHeader && (await cookie.parse(cookieHeader, options));
  let data = id && (await readData(id));
  return createSession(data || {}, id || "");
}

Session ID は Cookie から cookie.parse() メソッドによって解析されます。

2.2 Cookie 解析ロジック

packages/react-router/lib/server-runtime/cookies.ts の decodeCookieValue() 関数内:

async function decodeCookieValue(
  value: string,
  secrets: string[],
): Promise<any> {
  if (secrets.length > 0) {
    // シークレットが設定されている場合、署名を検証
    for (let secret of secrets) {
      let unsignedValue = await unsign(value, secret);
      if (unsignedValue !== false) {
        return decodeData(unsignedValue);
      }
    }
    return null;  // 署名検証失敗時は null を返す
  }
  
  // シークレットが設定されていない場合(署名なし)、デコードした値をそのまま返す
  return decodeData(value);
}

重要な問題:cookie が署名されていない場合(secrets が空配列または未設定)、decodeCookieValue はデコードされた cookie 値をそのまま返します。攻撃者はこの値を完全に制御できます。

2.3 パス構築ロジック

packages/react-router-node/sessions/fileStorage.ts 内:

export function getFile(dir: string, id: string): string {
  // Divide the session id up into a directory (first 2 bytes) and filename
  // (remaining 6 bytes) to reduce the chance of having very large directories,
  return path.join(dir, id.slice(0, 4), id.slice(4));
}

この関数は session ID を 2 つの部分に分割します:

  • 最初の 4 文字をディレクトリ名として:id.slice(0, 4)
  • 残りの文字をファイル名として:id.slice(4)

そして path.join() を使用してパスを結合します。

2.4 脆弱性の悪用手法

攻撃シナリオ:createFileSessionStorage() を使用し、cookie が 署名されていない 場合:

  1. 攻撃者は悪意のある session ID を構築できます。例:../../etc/passwd
  2. getFile() 関数の処理:
    • id.slice(0, 4) = ../.
    • id.slice(4) = /etc/passwd
    • path.join(dir, ../., /etc/passwd)
    • path.join() はパスを正規化しますが、dir がすでに相対パスであるか、処理後である場合、パストラバーサルを実現できる可能性があります。

より正確な悪用手法:

  • Session ID: ....//etc/passwd
    • id.slice(0, 4) = ....
    • id.slice(4) = //etc/passwd
    • 処理が適切でない場合、/etc/passwd へのアクセスにつながる可能性があります。

または:

  • Session ID: ../../../etc/passwd(16文字)
    • id.slice(0, 4) = ../.
    • id.slice(4) = ./etc/passwd
    • path.join() の動作と組み合わさり、パストラバーサルを引き起こす可能性があります。

3. 影響を受ける操作

以下のファイル操作が影響を受ける可能性があります:

  1. readData(id) - セッションデータの読み取り時

    async readData(id) {
      try {
        let file = getFile(dir, id);
        let content = JSON.parse(await fsp.readFile(file, "utf-8"));
        // ...
      }
    }
    
  2. updateData(id, data, expires) - セッションデータの更新時

    async updateData(id, data, expires) {
      let content = JSON.stringify({ data, expires });
      let file = getFile(dir, id);
      await fsp.mkdir(path.dirname(file), { recursive: true });
      await fsp.writeFile(file, content, "utf-8");
    }
    
  3. deleteData(id) - セッションデータの削除時

    async deleteData(id) {
      try {
        await fsp.unlink(getFile(dir, id));
      }
    }
    

4. 攻撃の影響

  1. ファイル読み取り:攻撃者はサーバー上の任意のファイルを読み取る可能性があります(Web サーバープロセスの権限に依存)
  2. ファイル書き込み:攻撃者はサーバー上にファイルを書き込む可能性があり、以下を引き起こす可能性があります:
    • データ漏洩
    • コードインジェクション
    • 権限昇格
  3. ファイル削除:攻撃者はサーバー上のファイルを削除する可能性があります

5. 脆弱性のトリガー条件

以下の条件がすべて満たされる必要があります:

  1. createFileSessionStorage() メソッドを使用していること
  2. Cookie が 署名されていない(cookie 設定で secrets が設定されていないか、secrets が空配列である)
  3. Web サーバープロセスが対象ファイルに対して読み取り/書き込み権限を持っていること

コード監査による発見

重要なコードパス

getSession(cookieHeader) 
  → cookie.parse(cookieHeader) 
    → decodeCookieValue(value, secrets)  // 署名されていない場合、value をそのまま返す
      → readData(id) 
        → getFile(dir, id)  // パス結合、パストラバーサルのリスクあり
          → fsp.readFile(file) / fsp.writeFile(file) / fsp.unlink(file)

問題の根源

  1. 入力検証の欠如:getFile() 関数は id パラメータに対する検証や正規化を行っていない
  2. path.join() の正規化への依存:path.join() はパスを正規化するが、特定の状況(結合前のパスに既に .. が含まれている場合など)では、パストラバーサルを許容する可能性がある
  3. 署名されていない cookie:攻撃者が session ID の値を完全に制御することを許す
ツールをダウンロード