JWTの署名検証が無効

JWTの署名検証が無効

説明

JWTのデコード時に署名検証を無効にすると、攻撃者が作成したトークンをアプリケーションが信頼するおそれがあります。PyJWTのjwt.decode(..., options={"verify_signature": False})のような設定は、認証の回避や権限昇格につながる可能性があります。

想定される影響

  • 攻撃者が任意のユーザーID、ロール、権限のクレームを含むトークンを作成できます。
  • 有効期限、audience、issuerの検証も回避される可能性があります。
  • トークンの内容を改変するだけで認証の境界を越えられるおそれがあります。

対処方法

  • 本番コードではverify_signature=Falseを使用しないでください。
  • jwt.decode()に検証鍵と許可するアルゴリズムを明示してください。
  • exp、iss、audなどの重要なクレームも検証してください。
  • テスト専用のデコード処理は本番の処理経路から分離してください。

例

変更前

python
import jwt

def bad_decode(token):
    return jwt.decode(token, options={"verify_signature": False})

変更後

python
import jwt

def safe_decode(token, key):
    return jwt.decode(token, key, algorithms=["HS256"], audience="api")

説明:

  • 変更前: トークンの署名を検証しません。
  • 変更後: 鍵、アルゴリズム、audienceを指定して、トークンの完全性と対象サービスを検証します。

参考資料