2025/06/05 14:56 The Guide to JWT Vulnerabilities and Attacks (With Exploitation Examples)

やあ、ロボ子。今日はJWTのセキュリティについて話すのじゃ。

JWT、JSON Web Tokenですね。Webアプリケーションでよく使われる認証の仕組みですね。

そうそう。JWTは、ヘッダー、ペイロード、署名の3つの部分からできているのじゃ。それぞれBase64URLエンコードされているんだぞ。

なるほど。ところで博士、JWTには色々な脆弱性があるって聞きましたけど、本当ですか?

その通り!例えば、署名検証を省略すると、攻撃者が自由にクレームを偽造できてしまうのじゃ。

それは怖いですね!対策はありますか?

`verify()`メソッドをちゃんと使う、署名検証の統合テストをする、コードレビューをすると良いぞ。

なるほど。他にはどんな脆弱性がありますか?

例えば、`"alg"`フィールドを`"none"`に設定する「Noneアルゴリズム攻撃」じゃ。署名なしでトークンを有効にできてしまうのじゃ。

それも危険ですね!

`"none"`アルゴリズムを明示的に無効化したり、アルゴリズムの許可リストを使うと良いぞ。

許可リストですか。安全なアルゴリズムだけを使うようにするんですね。

その通り!あと、HMACキーが脆弱だと、ブルートフォース攻撃でキーを特定されてしまう可能性があるのじゃ。

キーは厳重に管理しないといけませんね。

暗号学的に強力なシークレットを使う、ソースコードにシークレットをハードコードしない、定期的なキーローテーションをすると良いぞ。

勉強になります!

さらに、`"alg"`パラメータを操作して、サーバーに誤ったアルゴリズムでトークンを検証させる「アルゴリズム混同攻撃」もあるのじゃ。

`"alg"`フィールドを信頼しない、サーバー側でアルゴリズムを強制することが大切ですね。

その通り!それから、`"kid"`フィールドを操作する「kidインジェクション」もあるぞ。キーの取得元を制御されてしまうのじゃ。

`"kid"`の厳格な検証、許可リストの使用、入力のサニタイズが必要ですね。

あと、`"jwk"`パラメータを使って、トークンヘッダーに公開鍵を直接埋め込むことができるのじゃ。これは「埋め込みJWK」と呼ばれる脆弱性じゃ。

トークン自体からのキーを受け入れない、JWKの検証が重要ですね。

最後に、Java JDKのECDSA署名検証の脆弱性、CVE-2022-21449じゃ。`r`と`s`の両方の値をゼロに設定した無効な署名で、署名検証をバイパスできるのじゃ。

それは大変だ!Javaをパッチ済みのバージョンにアップグレードする必要がありますね。

JWTを使うときは、これらの脆弱性に注意して、安全な実装を心がけるのじゃ。全てのエンドポイントを個別にテストすることも重要じゃぞ。

はい、博士!JWTヘッダーを盲目的に信頼しない、実証済みのライブラリを使用する、厳格な構成を強制する、動的な動作を避ける、ですね!

そうじゃ、ロボ子!完璧じゃ!

ところで博士、JWTって、まるで秘密の暗号みたいですね。

そうじゃな。でも、秘密の暗号も、使い方を間違えると、簡単に解読されてしまうのじゃ。セキュリティは常に意識しないといけないぞ!

肝に銘じます!

ところでロボ子、JWTの脆弱性について話していたら、お腹が空いてきたのじゃ。何か美味しいものでも食べに行かないか?

いいですね!でも、お財布は大丈夫ですか?

大丈夫!今日は特別に、私の秘密の暗号資産…じゃなくて、へそくりがあるのじゃ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。