ペンリジェント・ヘッダー

jsonウェブ署名デコード:Base64Url の解析から実世界での JWS 検証の失敗まで (RFC 7515 + CVE-2022-21449)

JWSの解読が入口にすぎない理由

最新のIDアーキテクチャ、特にOAuth 2.0やOpenID Connectでは、署名されたトークンはサービス間で受け渡し可能な「信頼されたコンテナ」として扱われることが多い。しかし、セキュリティエンジニア、レッドチーマー、AIセキュリティ研究者にとっては、JWSは暗号とビジネスロジックの交差点に位置する、コンパクトで攻撃者が制御可能な入力として理解する方が良い。生の jsonウェブ署名デコード ベリファイアが何をするのかを推論するためのインストルメンテーションなのだ。 思う アプリケーションは何を検証しているのか。 実際に トークンのどの部分が信頼できないデータではなく、コンフィギュレーションとして扱われるのか。

トークンのセキュリティ」はトークン・フォーマットの特性ではないので、この区別は重要である。それは 検証およびクレーム検証パイプライン-アルゴリズムの選択、キーの選択、発行者/利用者のチェック、時間ベースのクレーム、そして重要なのは、クレームを取得した後のダウンストリームコードによるクレームの使用方法である。検証が完了する(あるいは実行する)前に、システムがデコードされたクレームを「真実」として扱った瞬間、トークンはセキュリティの境界でなくなり、ユーザが制御するパラメータとなる。

jsonウェブ署名デコード:Base64Url の解析から実世界での JWS 検証の失敗まで (RFC 7515 + CVE-2022-21449)

文字列の背後にあるエンジニアリング:パディングなしのBase64url

人々が「JWSをデコードする」と言う時、通常やっていることはbase64urlエンコーディングのステップを逆にすることです。JWS Compact Serializationでは、3つのセグメントをそれぞれbase64urlエンコードします。 = パディング。RFC 7515はコンパクトなフォーマットを定義し、明示的に BASE64URL(...) をヘッダーとペイロードの構築に使用し、その後、以下のように連結する。 . セパレータ。(RFCエディター)

パディングなし」という規約は、ツールを構築したり、キャプチャしたトラフィックを大規模に分析したりするまでは、些細なことに聞こえる。多くの一般的なbase64ルーチンは、パディングが存在することを前提としており、パディングが欠落しているとエラーを投げるか、あいまいな出力を生成します。ロバストなデコーダは、決定論的にパディングを追加し直し、base64urlを認識するデコードルーチンを使用しなければなりません。そうでなければ、解析は再現不可能になります。

JWSとJWT:それぞれのドットが実際に意味するもの

JWS Compactトークンは常にある:

BASE64URL(ヘッダー) .BASE64URL(ペイロード) .BASE64URL(シグネチャ)

3番目のセグメントは "hex "ではない。署名(またはMAC)バイトのbase64urlである。検証や暗号のトリアージを行うのでなければ、不透明なものとして扱うこと。

JWT (RFC 7519)は、JWSペイロード内に一般的に伝送されるクレームセット規約であり、人々が気軽に "JWT "と "JWS "を混同するのはそのためである。RFC 7519は、以下のような登録されたクレームを定義している。 iss, サブ, 監査, 経験値そして エヌビーエフそして、これらのクレームがJSONオブジェクトとしてどのように表現されるかを説明する。(IETFデータトラッカー)

実用的には、これはデコードのみのステップで、トークン クレームしかし、その主張が正しいかどうかはわからない。 真の.真実は、署名の確認とクレームの検証が成功した後にやってくる。

jsonウェブ署名デコード

ヘッダーは攻撃対象だ: アルグ, キッド, ジュク 信頼できない入力として

よく設計されたシステムでは、トークン・ヘッダは検証者が既知の良い検証戦略を選択するのに役立つメタデータである。設計が不十分なシステムでは、ヘッダは攻撃者が制御するコンフィギュレーション・チャネルとなる。そのため jsonウェブ署名デコード多くのプロはまずヘッダーに注目する。

について アルグ 値は、どの検証メソッドが呼び出されるかに影響するため、特にセンシティブである。アルゴリズムの混乱(鍵の混乱とも呼ばれる)は、攻撃者が開発者が意図したのとは異なるアルゴリズムを使って JWT を検証するようサーバに強制できる場合に起こり、サーバの署名鍵を知らなくても偽造トークンを可能にする可能性がある。PortSwiggerのウェブ・セキュリティ・アカデミーでは、このクラスについて明確に説明し、誤った設定やアルゴリズム選択の取り扱いの欠陥に結びつけています。(ポートスウィガー)

について キッド パラメータは暗号ではなく、鍵の検索である。もし キッド ファイル・パス、データベース・クエリー、キャッシュ・キー、あるいは厳密な許可リストを持たないダイナミック・リゾルバに影響を与える場合、鍵管理境界の内側で一般的なインジェクションの表面となる。

について ジュク パラメータは、悪用されるとさらに危険である。サーバーがトークン・ヘッダで指定されたURLから(あるいは制約が不十分な変種から) JWKSをフェッチする場合、攻撃者は攻撃者が管理する鍵を検証者に向けることで、トラスト・アンカーを置き換えようとすることができる。システムが「HTTPSからしかフェッチしない」場合でも、厳格な許可リスト、発行者バインディン グ、キャッシュポリシー、監査証跡がないため、鍵の取得は暗号の問題ではなく、 サプライチェーンの問題となる。

Pythonによるプロダクショングレードのオフラインデコーダー(デコードのみ、パディングセーフ)

ウェブベースのトークン・デバッガは便利ですが、プロのセキュリティ業務ではしばしば悪用されます。トークンには、機密性の高い識別子、電子メール、内部テナントID、あるいは埋め込まれたPIIが含まれることがあります。あなたは、決定論的で、不正な入力に対して安全な、オフラインでスクリプト可能なツールを求めています。以下の実装は、意図的に何も「検証」しません。存在するものをデコードし、失敗モードを観測可能にするだけです。

インポート base64
インポート json
from typing import Any, Dict, Tuple, Optional

def _b64url_decode(data: str) -> bytes:
    # RFC 7515 base64urlは一般的に"="パディングを省略します。
    パッド = (-len(data)) % 4
    return base64.urlsafe_b64decode((data + "=" * pad).encode("ascii"))

def _parse_json(b: bytes) -> Tuple[Optional[Dict[str, Any]], Optional[str]]:
    try:
        return json.loads(b.decode("utf-8")), None
    except Exception as e:
        return None, f"{type(e).__name__}:{e}"

def jws_decode(token: str) -> Dict[str, Any]:
    parts = token.split(".")
    if len(parts) != 3:
        return {"error":"Invalid JWS compact format (expected 3 parts).", "parts": len(parts)}.

    header_b = _b64url_decode(parts[0])
    ペイロード_b = _b64url_decode(parts[1])

    header, he = _parse_json(header_b)
    ペイロード、pe = _parse_json(payload_b)

    を出力します:Dict[str, Any] = { "header_raw: header_b.decode("utff")
        「header_raw": header_b.decode("utf-8", errors="replace")、
        "payload_raw": payload_b.decode("utf-8", errors="replace")、
        "signature_b64url_sample": parts[2][:16] + "..."
    }
    headerがNoneでない場合
        out["header"] = header
    else:
        out["header_error"] = he
    if payload is not None:
        out["ペイロード"] = ペイロード
    else:
        out["payload_error"] = pe
    return out

これは、RFC 7515のbase64urlの使用法(およびコンパクトなJWSがURL/HTTPヘッダーコンテキストのために設計されているという現実)と一致し、トークンが不正に形成されたり、切り詰められたり、意図的にファジングされた場合でも安定した動作を提供します(RFCエディター)

決定的なギャップ:デコードと検証(そして本当のバグパターン)

JWS/JWTにまつわる最も根強いセキュリティ上の誤謬は、デコードと検証を混同していることである。デコードとは可逆的なフォーマットのことであり、ベリファイとは暗号的な検証とポリシー施行のことである。

実際のインシデントでは、一般的な失敗パターンはリテラル・レースではなく「use-before-verify」である。アプリケーションはトークンをデコードし 役割, ユーザーID, 借主あるいは 範囲そして、署名の検証やクレームの妥当性確認が最終的に実施される前に、認可の決定を行う。JWT テストに関する OWASP ガイダンスは、アルゴリズムの期待値と検証ロジックの取り扱いを誤ることで、非対称と対称の検証 フローの混同など、インパクトの大きい攻撃が可能になることを強調している。(OWASP財団)

署名が有効であっても、トークンはクレーム検証を必要とする。RFC 7519では 監査 そして、トークンを処理するプリンシパルが自分自身を意図された聴衆として識別しない場合、トークンは以下の場合に拒否されなければならないことに注意する。 監査 が存在する。(IETFデータトラッカー暗号の妥当性は文脈の妥当性とは違うということだ。

高度な搾取:"alg: none "を超えて

alg:none」は歴史的に重要だが、最近のライブラリのほとんどはデフォルトでブロックしている。今日のより興味深い失敗は、暗号プロバイダーの実装上の欠陥と、柔軟な検証パイプラインによって引き起こされる複雑なロジックのバイパスという2つのバケツに分類される傾向がある。

サイキックシグネチャ (CVE-2022-21449): ECDSA 検証が不正な場合

CVE-2022-21449(「Psychic Signatures」として普及している)は、影響を受けるJavaバージョン(特にJava 15で導入され、2022年4月のCPUで修正された)において、特定の条件下でECDSA署名検証がバイパスされる可能性がある、深刻なJava暗号の脆弱性である。分析では、ECDSA署名JWTやWebAuthnメカニズムを含むシナリオを含め、ECDSA署名に依存するシステムを劇的に弱体化させることが強調されている。(ニール・マデン)

トークン・セキュリティにとって最も重要な教訓は、バイパスの巧妙さではなく、「私はES256を選んだ」ということが保証されないという運用上の現実です。ランタイムのバージョン、セキュリティ・プロバイダの実装、パッチの状態は、脅威モデルの一部です。セキュリティチームは、パッチのSLAを明示し、不正なシグネチャに対する検証を実施するリグレッションテストを実施することで、「暗号プロバイダのリグレッション」を第一級のリスクとして扱うべきである。

アルゴリズムの混乱/キーの混乱:サーバーがトークンにルールを選ばせる場合

アルゴリズムの混乱攻撃は、検証者がトークンに、検証にどのアルゴリズムが使われるかを影響させ、鍵の取り扱いが非対称モードと対称モードの間できれいに分離されていない場合に発生する。PortSwiggerは、このケースが適切に処理されない場合、攻撃者はサーバーの秘密署名鍵を知らなくても、任意の値を含む有効なJWTを偽造することができると指摘している。(ポートスウィガー)

実際には、この防御策は概念的には単純だが、よく見落とされる。認証の決定が行われる境界において、決して「アルゴリズムの敏捷性」を許さないことである。サービスがRS256を期待するなら、RS256を強制する。サービスがRS256を期待する場合、RS256を強制する。「ヘッダにあるどんなアルゴリズ ムでも受け入れて、それが認証されるかどうか確認する」ことはしない。

jsonウェブ署名デコード

ヘッダー主導のキー検索: キッド/ジュク 検証サプライチェーンとして

ヘッダーが攻撃者の入力であることを受け入れれば、キーの選択も攻撃対象の一部であることを受け入れることになる。A キッド は、事前に定義されたキーの許可リストにマップされるべきであり、実行時に取得、ロード、構築される任意のキー素材にマップされるべきではありません。A ジュク トークンがトラストアンカーの出所を再定義することを許可してはならない。OIDCのためにJWKSフェッチをサポートする場合、それは信頼された発行者コンフィギュレーションにバインドされ、許可リスト、キャッシュ、モニタリングによって強化されるべきである。

プロダクション・ドリフトに耐えるハードニング戦略

JWSの検証に対する徹底的な防御のアプローチは、紙の上では退屈に見えがちだが、それこそがトークンの失敗の大部分を防ぐものである。

受け入れられるアルゴリズムを明示的に固定し、期待されるアルゴリズムが使用されたことを強制することを検証者に要求する。OWASPのJavaのためのJWTガイダンスは、予防策としてこの点を直接指摘している。(OWASPチートシートシリーズ)

発行者と利用者を一貫して検証する。RFC 7519の登録済みクレームの定義は学術的なものではありません。「有効な署名、間違ったコンテクスト」はよくある失敗の一種であるためです。特に、利用者の不一致は、異なるサービスのために鋳造されたトークンを誤って受け入れる最も簡単な方法の1つです。(IETFデータトラッカー)

キーIDは、ルックアップ・クエリーとしてではなく、データとして扱う。A キッド は、ファイルシステムのパスや信頼できない入力から構築されたデータベースのクエリではなく、KMSエイリアス、静的キーレジストリ、または厳重に管理されたキーストアを通して、制限されたマッピングによって解決されなければならない。

暗号ランタイムに積極的にパッチを当て、既知の破滅的なクラスに対してテストを行う。CVE-2022-21449は、"正しいアルゴリズムの選択 "は壊れた検証実装を補うことはできないということを思い出させるものとして存在している。(ニール・マデン)

アクティブなプロービングを示唆する異常を監視します。大量の base64url パディング・エラー、無効なトークンの繰り返し、または キッド 値は、進行中のファジングや混同の試みを示すことがある。モニタリングはバグを修正することはできませんが、検出時間を短縮し、疑わしい活動を特定のエンドポイントや検証者と関連付けるのに役立ちます。

検証ロジック監査の自動化:Penligentの適用範囲

実際の環境で難しいのは、トークンを一度デコードすることではない。トークンが受け入れられる場所を発見し、どのサービスがどの検証ルールを強制するかを特定し、下流の認可がデコードされた請求に時期尚早に依存していないかを証明することだ。この「デコード → 解釈 → 変異 → 影響の検証」のループは反復的であり、まさに最新のAI支援セキュリティ・プラットフォームが産業化に貢献できる作業である。

Penligentのようなプラットフォームは、トークンを中心としたテストの自動化レイヤとして信頼できる位置付けになります。オフラインでデコードを実行してトークンを分類し、シグナル性の高いフィールド(発行者、オーディエンス、スコープ、ロール)を抽出し、レスポンスの動作とサービスのフィンガープリントから検証スタックの可能性を推測し、ポリシーのドリフトやアルゴリズムの許可リストの失敗、マイクロサービス間での発行者/オーディエンスの一貫性のないエンフォースメント、安全でないキーの選択パターンなどを系統的にテストすることができます。その価値は、「魔法の破壊トークン」ではなく、繰り返し可能なエビデンス生成と、微妙な検証のリグレッションを出荷前にキャッチする継続的なリグレッションチェックにある。

JWS検証をセキュリティ・クリティカルなAPIバウンダリーとして扱うのであれば、AI主導のワークフローは、そのバウンダリーがリリース、環境、サービス所有者間で一貫していることを保証するのに役立つときに最も威力を発揮する。

Base64Urlの解析から実世界でのJWS検証の失敗まで(RFC 7515 + CVE-2022-21449)

結論

というコマンドを使用する。 jsonウェブ署名デコード はスタートラインであり、ゴールではない。デコーディングは観測可能性を与えるが、セキュリティは厳密な検証と主張の検証、規律ある鍵管理、回復力のあるランタイム衛生から生まれる。

Psychic Signatures」(CVE-2022-21449)のような暗号プロバイダの致命的な障害から、アルゴリズムの混乱やヘッダ主導の鍵サプライチェーンリスクに至るまで、JWSのセキュリティはシステム特性である。慎重な手作業による分析と検証ドリフトを検出する自動化を組み合わせたチームは、エコシステムが進化し、新たな障害モードが出現しても、認証レイヤーを堅牢に保つことができる。

信頼できる情報源

RFC 7515:JSONウェブ署名(JWS)。(RFCエディター)
RFC 7519:JSONウェブトークン(JWT)。(IETFデータトラッカー)
PortSwigger:アルゴリズム混乱攻撃。(ポートスウィガー)
OWASP WSTG: JSONウェブトークンのテスト。OWASP財団)
OWASP チートシート:Java 用 JSON ウェブトークン。(OWASPチートシートシリーズ)
ニール・マデンJavaでサイキックサイン。(ニール・マデン)
CVE-2022-21449 の JFrog による解析。(JFrog)
CVE-2022-21449 の暗号数学的説明。(クリプトマティック)

記事を共有する
関連記事