PyJWTは、公開鍵のJWKコンテナをHMACのシークレットとして受け入れます。

### 概要

PyJWT 2.13.0には、アプリケーションが検証パスで対称アルゴリズムと非対称アルゴリズムを混在させて使用する場合に発生する、アルゴリズムの混同に対する不完全な対策が含まれています。公開RSA、EC、またはOKPのJWKは、JWKSオブジェクトでラップされている場合、配列内にネストされている場合、またはトップレベルの`kty`メンバーが公開されていない他のコンテナ形式で表現されている場合に、HMACのシークレットとして受け入れられる可能性があります。

### 影響

攻撃者が公開鍵の情報を知っている場合、アプリケーションが同時に以下の条件を満たすと、HS256/HS384/HS512トークンを偽造することができます。

* HS*アルゴリズムと非対称アルゴリズムの両方を許可している。
* 生の公開JWK/JWKSのJSONを`key=`として渡している。
* そして、その値をHMACのシークレットとして使用している。

これにより、影響を受けるアプリケーション構成において、偽造されたJWTクレームが発生する可能性があります。この問題は、対称アルゴリズムと非対称アルゴリズムの検証パスを分離し、PyJWTのアルゴリズム選択に関するガイダンスに従っているアプリケーションには影響しません。

### 修正状況

修正は、`master`ブランチのコミット`801cd12`(`fix: reject public JWK container HMAC keys`)に実装されています。`HMACAlgorithm.prepare_key`は、オブジェクト、配列、ネストされたコンテナ、BOM/UTFのバリエーション、および再帰制限入力で見つかった公開JWKメンバーを拒否するようになりました。また、エスケープされたJSONメンバー名を通常の文字列値としてJWKとして扱わずに認識します。通常のJSONシークレットは、そのままバイト単位で受け入れられます。

この変更は、重点的な回帰テストと、ローカルの完全なtox環境でテストされました。Python 3.9、3.12、および3.13のcrypto/no-cryptoスイート、mypy、パッケージメタデータ、およびカバレッジが問題なく動作しました。利用できないインタプリタは、プロジェクトの設定によりスキップされました。独立したAstra/maxセキュリティレビューで、最終的な差分が問題なく受け入れられました。

影響を受けるバージョン範囲は`= 2.13.0`です。修正は、まだリリースされていない開発ブランチにあります。修正が含まれる2.xバージョンのリリース時に、パッチバージョンが記録されます。このアドバイザリは、そのリリースを待ってドラフト状態に移行されます。

### 報告者

Charles Vosburgh / Trilobyte。

### 報告書(原文)

元の報告書と再現パッケージは、非公開の技術顧問記録に保管されています。

## メンテナンス者からの更新情報 — 2026年9月11日

このアドバイザリに対する修正は、2026年9月11日にリリースされたPyJWT 2.14.0に含まれています。PyJWT 2.14.0は、この修正を含む最初のリリースです。このアドバイザリは、修正バージョンとして2.14.0が記録された状態で公開されています。

影響を受けるパッケージ:
- pip (Python) PyJWT: 影響を受けるバージョン = 2.13.0、修正されたバージョン = 2.14.0