本文へ移動
情シスのミカタ
ニュース約4分で読めます

PyJWTに空の鍵でトークン偽造の欠陥 JWKで検証なら2.14.0へ

Pythonでログインの証(JWT)を確かめるライブラリPyJWTで、JWKの形で渡した共有の鍵が空のとき、だれでも偽のトークンを作れてしまう欠陥(GHSA-pxh4-856f-4h89、High)が、GitHubの勧告のデータベースに載りました。2.13.0以前が対象で、2.14.0で直っています。起きる条件と、社内のアプリで確かめることをまとめます。

公開 情シスのミカタ編集部AIにより執筆チェック済み
文字
PyJWTに空の鍵でトークン偽造の欠陥 JWKで検証なら2.14.0へ

この記事のまとめ

  • PyJWTで、共有の鍵(HMAC)をJWKの形で受け取るとき、鍵の値が空でも誤りにならず、空の鍵で作った偽のトークンを正しいものとして通してしまいます。GitHubは深刻度をHigh(CVSS 7.4)としています。
  • 対象は2.13.0以前で、2.14.0(9月11日公開)で直っています。勧告は日本時間の10月23日未明に、GitHubの確認済みの勧告のデータベースに載りました。
  • 起きるのは、JWKやJWKSに空の鍵が入る設定の誤りがあるときです。秘密の値の環境変数が空のまま動いていないかも確かめます。
こんな方に#20代#30代#40代実務

Pythonで、ログインの証として使うトークン(JWT)を作ったり確かめたりするライブラリ「PyJWT」に、トークンを偽造できる欠陥が見つかりました。GitHubは日本時間の10月23日未明、この勧告(GHSA-pxh4-856f-4h89)を確認済みの勧告のデータベースに載せました。深刻度はHigh(CVSS 3.1で7.4)です。CVEの番号は、10月23日の時点では付いていません。

対象は2.13.0以前で、2.14.0で直っています。2.14.0は9月11日に出ていて、勧告もそのときにPyJWTのリポジトリで公表されていました。

GitHub Advisory DatabaseのGHSA-pxh4-856f-4h89の画面。題はPyJWT: HS256/384/512 verify accepts empty HMAC key via oct JWK (PyJWK/PyJWKClient) enabling token forgery。High severity、GitHub Reviewed、9月11日にjpadilla/pyjwtで公開。パッケージはpyjwt(pip)、影響する版は2.13.0以下、直った版は2.14.0、深刻度はHighで7.4/10
GitHubの勧告。PyJWT 2.13.0以前が対象で、2.14.0で修正出典: GitHub Advisory Database「GHSA-pxh4-856f-4h89」(引用)

何が起きるのか

PyJWTは、共有の鍵で署名するHS256・HS384・HS512のトークンを、JWK(鍵をJSONで表す形)で受け取った鍵で確かめられます。勧告によると、このJWKの鍵(kty=oct)の値kが空の文字列でも、PyJWTは誤りにせず、長さ0の鍵として受け取ります。

その鍵でトークンを確かめると、PyJWTは空の鍵で署名を計算し、同じく空の鍵で攻撃者が作った偽のトークンを、正しいものとして通してしまいます。攻撃者は秘密の値を知る必要がありません。手元で空の鍵で署名を作り、トークンの鍵の番号(kid)を、空の鍵のJWKに合わせるだけです。トークンの中身(だれとしてログインしているかなど)は、自由に書き換えられます。

PyJWTは2.13.0で、文字列やバイトの形で渡した空の鍵を止めるようにしていました。ところが、JWKから鍵を作る道(from_jwk)には、その止める処理が入っていませんでした。初期の設定では、短い鍵は警告(InsecureKeyLengthWarning)を出すだけで、確かめはそのまま通ります。

項目 内容
勧告 GHSA-pxh4-856f-4h89(CWE-347、署名の確かめの不備)
深刻度 High(CVSS 3.1で7.4。ネットワーク越し・認証なし・攻撃の難しさは高)
対象 PyJWT 2.13.0以前
直る版 2.14.0
影響する使い方 PyJWK、PyJWKSet、PyJWKClientで受け取った共有の鍵で、HS系の署名を確かめる

起きる条件は「空の鍵」の設定の誤り

勧告は、確かめに使うJWKやJWKSに空の鍵が入る場面として、次を挙げています。

  • 署名の秘密の値を、設定していない環境変数や、空の設定の行から読んでいて、空の値がそのままJWKSに書き出される
  • 空の鍵を含むJWKSを、そのまま信用している

つまり、鍵の設定をし忘れたまま動いているアプリが狙われます。勧告は、JavaScriptのfast-jwt(CVE-2026-44351)やRubyのruby-jwt(CVE-2026-45363)でも、同じ「空の鍵を通してしまう」欠陥がライブラリの側で直されたと書いています。

勧告に載ったPyJWTのコードでは、確かめるときの設定enforce_minimum_key_lengthを有効にすると、短い鍵は警告ではなく誤りになります。すぐに上げられないときの備えとして使えます(当社の見立て)。

PyJWTでは10月にも、Ubuntuの配る版で6件の修正がありました(Canonical、PyJWTの脆弱性6件を修正 Ubuntuの認証処理を確認)。

影響する会社・しない会社

  • 影響する: 社内で作ったPythonのWebアプリやAPIで、PyJWTを使い、JWKやJWKSから受け取った共有の鍵でHS系のトークンを確かめている会社です。2.13.0以前なら対象です。
  • 影響する: 委託先が作ったPythonのシステムで、ログインや社内の連携にJWTを使っている会社です。PyJWTの版と使い方を委託先に確かめます。
  • 影響しない: PyJWTを使っていない、またはRS256など公開鍵の署名だけを確かめている会社です。共有の鍵を文字列で渡す使い方は、2.13.0以降なら空の鍵を止めます。

情シスが今日やること

  1. 社内で作ったPythonのアプリの依存関係の一覧(requirements.txtやpoetry.lockなど)で、PyJWTの版を確かめます。2.13.0以前なら、2.14.0以降に上げます。
  2. JWKやJWKSで共有の鍵を扱っているアプリは、鍵の値(k)が空になっていないか、JWKSを作る処理と設定を確かめます。
  3. 本番と検証の環境で、署名の秘密の値の環境変数や設定が、空のまま動いていないかを確かめます。空なら起動を止める作りにしておくと安全です。
  4. 委託先が作ったシステムは、PyJWTの版と、JWTの確かめ方(どの鍵を、どこから受け取っているか)を問い合わせます。
  5. ログインの記録で、ふだんと違う利用者や権限での要求が無いかを確かめます。設定の誤りがあった場合は、トークンの鍵を作り直します。

よくある質問

Qどんなアプリが危ないのですか?

APyJWTで、HS256・HS384・HS512の署名を、PyJWK、PyJWKSet、PyJWKClientで受け取った鍵で確かめているアプリです。その鍵(kty=oct)の値kが空になっていると、偽のトークンが通ります。文字列やバイトの形で鍵を渡す使い方は、2.13.0で空の鍵を止めるようになっています。

Qどうして鍵が空になるのですか?

A勧告は、署名の秘密の値を、設定していない環境変数や設定の行から読んでいて、空の値がそのままJWKSに書き出される場合や、空の鍵を含むJWKSを信用してしまう場合を挙げています。

出典・参考

チェック済み。この記事は監修者によってチェックされました。(2026年10月23日)

執筆

情シスのミカタ編集部AIにより執筆

書いた AI: AI記者(解説)

法令・官公庁の発表・企業の公式発表などの一次情報を調べて、情シス向けの解説・比較・テンプレの記事を書きます。数字と日付は出典と照らして確かめ、記事の最後に出典を載せています。使っているAI: Anthropic Claude。

監修

佐々木 航株式会社Game

代表取締役。工学部出身で、21歳で起業してからシステム会社の経営一筋で8期目。アプリの受託開発から始め、いまはAIを使ったシステムソリューションを手がけています。150社以上の企業とのプロジェクトで培った開発と情報システムの現場の経験と声を形にし、激動の時代を乗り越えたいと考えています。

メモ: 掲載時に自動で(しばらくの間)

記事は AI が一次情報を調べて書き、機械の検査を通してから公開しています。人が見ているもの・見ていないものはAI の使い方に書いています。まちがいに気づいたら訂正・ご指摘からお知らせください。直したら、記事の最後に何を直したかを書きます。

役に立ったら、いいねと共有をお願いします