JWT 認証ライブラリ fast-jwt に重大な脆弱性が発見された。公開鍵の先頭に空白文字や改行があるだけで認証が突破される可能性があり、影響はバージョン 6.1.0 以下に及ぶ。

fast-jwt とは

fast-jwt は Node.js 向けの高速な JWT(JSON Web Token)の署名・検証ライブラリ。パフォーマンスを重視した実装で広く利用されているが、今回その内部の文字列処理と正規表現の甘さが致命的な脆弱性につながった。

CVE-2026-34950: 空白文字による認証バイパス

問題の概要

CVSS スコア 9.1(Critical) の深刻な脆弱性。公開鍵の検証に使われている正規表現が、文字列の先頭を厳密に検証していないという欠陥に起因する。

攻撃メカニズム

公開鍵の先頭にスペースや改行文字(\n)が含まれると、正規表現による公開鍵の検証が失敗する。その結果、公開鍵が HMAC 用の秘密鍵として誤って扱われ、攻撃者は任意のトークンを署名できてしまう。

1
2
3
4
5
6
7
8
9
// 通常の公開鍵(検証成功)
-----BEGIN PUBLIC KEY-----
...
-----END PUBLIC KEY-----

// 先頭に空白が入った場合(検証失敗 → HMAC 鍵として扱われる)
 -----BEGIN PUBLIC KEY-----
...
-----END PUBLIC KEY-----

これは過去に修正されたはずの CVE-2023-48223(アルゴリズム混同攻撃)と同様の攻撃を再び可能にする。前回の修正が不完全だったことが根本原因だ。

現実的な発生シナリオ

この脆弱性は机上の空論ではなく、現実の環境で容易に発生しうる:

  • データベースに保存された公開鍵に改行が混入している
  • 設定ファイルの記述ミスで先頭に空白が入っている
  • テキストをコピー&ペーストした際に不可視文字が混入している

秘密鍵側には空白除去処理が実装されているのに、公開鍵側には適用されていないという非対称な実装が問題の核心だ。

CVE-2026-35039: キャッシュ機構の権限混同

もう一つの脆弱性はキャッシュの設計ミスに起因する。不適切なキー設計により、異なるユーザーや権限レベルのトークンが混同される恐れがある。

最悪のケースでは、一般ユーザーが管理者権限として扱われるリスクがある。識別子が不十分な場合にキャッシュのキーが衝突し、権限情報が入れ替わってしまうという問題だ。

影響範囲と対策

影響するバージョン

6.1.0 以下のすべてのバージョンが対象。

推奨される対策

  1. アルゴリズムの明示指定: algorithms オプションで許可するアルゴリズムを明示的に制限する

    1
    2
    3
    4
    
    const verifier = createVerifier({
      key: publicKey,
      algorithms: ['RS256']  // 使用するアルゴリズムを明示
    })
    
  2. 鍵文字列のトリミング: 公開鍵・秘密鍵を使用する前に .trim() を適用する

    1
    
    const publicKey = process.env.PUBLIC_KEY.trim()
    
  3. 設定値の精査: 環境変数や設定ファイルから読み込む鍵文字列に不要な空白が含まれていないか確認する

  4. バージョンアップ: 修正済みバージョンへの更新が最も確実な対策。

まとめ

今回の脆弱性は「過去に修正したはずのバグが再発する」典型例だ。正規表現の記述における ^(行頭)と文字列先頭の違いという細かな仕様差異が、認証全体を崩壊させる欠陥につながった。

JWT を扱うアプリケーションでは、鍵文字列のバリデーションを入力段階で徹底し、使用するアルゴリズムを明示的に制限することが重要だ。fast-jwt を利用しているプロジェクトは早急にバージョンを確認し、対策を講じることを強く推奨する。

参考