JWTの脆弱性:alg=noneと鍵の取り違え
よくあるJWTのセキュリティ上の誤りを悪用し、修正します。
「JWTの脆弱性:alg=noneと鍵の取り違え」はCoddyKit上の無料Cryptology Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCryptology Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Cryptology Academyコースには全4レッスンが含まれています。
JWTの攻撃対象領域
JWTは暗号学的に署名されていますが、多くのライブラリに深刻な脆弱性がありました。最も多く悪用されたのは、alg=none攻撃、RS256→HS256の混同攻撃、弱いシークレットの総当たり攻撃です。これらはすべて、攻撃者が制御できるヘッダーフィールドを信頼することに起因します。
alg=none攻撃
JWT仕様では、保護されていないトークンにalg:"none"を指定できます。脆弱なライブラリはこれを受け入れ、署名検証を完全に省略していました。攻撃者はペイロード(例: "role":"admin")を変更し、alg:"none"を設定して署名を削除すると、サーバーに受け入れさせることができます。
alg=none攻撃の例
元のトークン: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1c2VyIn0.SIG 攻撃: eyJhbGciOiJub25lIn0.eyJzdWIiOiJhZG1pbiJ9. (空の署名、末尾のドット)。脆弱なサーバーは検証に成功し、管理者アクセスを許可します。
alg=none攻撃への対策
本番環境ではalg:"none"を決して受け入れないでください。許可するアルゴリズムを明示的にホワイトリストへ登録してください: jwt.decode(token, key, algorithms=["HS256"])。最新のライブラリの多く(PyJWT 2+、jsonwebtoken 9+)は、デフォルトでalg=noneを拒否します。
RS256 → HS256の鍵混同
サーバーがRS256を使用していて、クライアントがalgをHS256に変更すると、サーバーはRSA公開鍵をHMACシークレットとして使って検証する可能性があります。公開鍵はその名のとおり公開されているため、攻撃者はその鍵で任意のペイロードに署名でき、サーバーはそれを検証してしまいます。
鍵混同攻撃の例
手順: 1) JWKSエンドポイントから公開鍵を取得します。2) 悪意のあるペイロードを作成します。3) 公開鍵の生のPEMバイト列をHMACシークレットとして、HMAC-SHA256で署名します。4) ヘッダーにalg:"HS256"を設定します。5) サーバーのHS256処理で検証が成功します。
鍵混同攻撃への対策
検証呼び出しでは、想定するアルゴリズムを必ず明示的に指定してください。トークンヘッダーからアルゴリズムを決定しないでください。RS256とHS256には、呼び出し元が切り替えられない別々のコードパスを使用してください。
弱いシークレットの総当たり攻撃
エントロピーが256ビット未満の弱いシークレットを使うHS256は、オフラインで総当たり攻撃を受ける可能性があります。hashcatなどのツールはJWTのクラッキングに対応しています: hashcat -a 0 -m 16500 token.txt wordlist.txt。少なくとも32バイトの暗号学的にランダムなシークレットを使用してください。
kidによるヘッダーインジェクション
kid(鍵ID)ヘッダーは、使用する鍵を選択します。サーバーがkidをサニタイズせずにSQLクエリパラメータやファイルシステムパスとして使用すると、kid="../../dev/null" → 空の鍵を使ったHMAC → 偽造トークンが受け入れられる、という事態が起こります。kidは必ずサニタイズしてください。
jwkヘッダーインジェクション
jwkヘッダーには、検証用の公開鍵を埋め込めます。脆弱なサーバーは埋め込まれた鍵をそのまま使用してしまう可能性があり、攻撃者は自分の鍵ペアを指定し、秘密鍵でトークンに署名して公開鍵を埋め込めます。検証には登録済みの鍵だけを使用してください。
期限切れトークンの回避
実装によっては、expクレームのチェックを忘れていたり、サーバー時刻を一貫性なく扱っていたりします。exp、nbf、iatは必ず明示的に検証してください。これらをデフォルトでチェックするライブラリを使用し、本番環境ではクレームの検証を決して無効にしないでください。
確認問題
RS256→HS256の鍵混同攻撃で、攻撃者は何をHMACシークレットとして使用しますか。
まとめ
JWTの脆弱性は、algヘッダーを信頼すること、alg=noneを受け入れること、弱いシークレットから生じます。対策は、検証側でアルゴリズムを固定し、強力なシークレットを使用し、kidをサニタイズすることです。次は、安全なJWT実装の実践について学びます。
よくある質問
「JWTの脆弱性:alg=noneと鍵の取り違え」レッスンは無料ですか?
はい。「JWTの脆弱性:alg=noneと鍵の取り違え」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Cryptology Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Cryptology Academyコースには全4レッスンが含まれています。
「JWTの脆弱性:alg=noneと鍵の取り違え」で何を学びますか?
よくあるJWTのセキュリティ上の誤りを悪用し、修正します。 ブラウザで直接実行するハンズオンコードでCryptology Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Cryptology Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのCryptology Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「JWTの脆弱性:alg=noneと鍵の取り違え」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このCryptology Academyレッスンでコードを書いて実行できますか?
はい。すべてのCryptology Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- JWTの構造:ヘッダー、ペイロード、署名
- HS256とRS256:対称鍵JWTと非対称鍵JWT
- JWTの脆弱性:alg=noneと鍵の取り違え
- 安全なJWT実装のベストプラクティス