CVE-2025-59420

7.5 HIGH

📋 TL;DR

Authlib versions before 1.6.4 fail to properly validate JWS tokens with unknown critical header parameters, violating RFC 7515 requirements. Attackers can craft tokens that bypass strict verification in mixed-language environments, potentially leading to authentication bypass or privilege escalation. This affects any Python application using Authlib for OAuth/OpenID Connect token validation.

💻 Affected Systems

Products:
  • Authlib
Versions: All versions before 1.6.4
Operating Systems: All platforms running Python
Default Config Vulnerable: ⚠️ Yes
Notes: Only affects JWS token verification functionality. Applications must be using Authlib's JWS validation for OAuth/OpenID Connect tokens.

📦 What is this software?

⚠️ Risk & Real-World Impact

🔴

Worst Case

Complete authentication bypass allowing attackers to impersonate any user, escalate privileges to administrative levels, or replay tokens indefinitely.

🟠

Likely Case

Policy bypass in mixed-language fleets where some services reject crafted tokens but Authlib accepts them, leading to inconsistent authorization decisions.

🟢

If Mitigated

Limited impact if all services use Authlib consistently or if additional token validation layers exist.

🌐 Internet-Facing: HIGH - Authentication endpoints are typically internet-facing and directly process attacker-controlled tokens.
🏢 Internal Only: MEDIUM - Internal services using Authlib for service-to-service authentication could be compromised if tokens are intercepted.

🎯 Exploit Status

Public PoC: ⚠️ Yes
Weaponized: LIKELY
Unauthenticated Exploit: ⚠️ Yes
Complexity: LOW

Proof of concept available in advisory. Attack requires ability to submit crafted JWS tokens to vulnerable endpoints.

🛠️ Fix & Mitigation

✅ Official Fix

Patch Version: 1.6.4

Vendor Advisory: https://github.com/authlib/authlib/security/advisories/GHSA-9ggr-2464-2j32

Restart Required: Yes

Instructions:

1. Update Authlib: pip install --upgrade authlib==1.6.4
2. Restart all Python applications using Authlib
3. Verify no downgrades occur in dependency resolution

🔧 Temporary Workarounds

Implement custom JWS header validation

all

Add pre-validation to reject tokens with unknown critical header parameters before Authlib processes them.

# Python code to validate JWS headers before Authlib verification
import json
import base64

def validate_jws_header(token):
    parts = token.split('.')
    if len(parts) != 3:
        return False
    header = json.loads(base64.urlsafe_b64decode(parts[0] + '==').decode())
    if 'crit' in header:
        for param in header['crit']:
            if param not in ['alg', 'jku', 'jwk', 'kid', 'x5u', 'x5c', 'x5t', 'x5t#S256', 'typ', 'cty', 'crit']:
                return False
    return True

🧯 If You Can't Patch

  • Implement strict token validation at API gateway or load balancer level to reject malformed JWS tokens
  • Deploy WAF rules to block requests containing JWS tokens with unusual critical header parameters

🔍 How to Verify

Check if Vulnerable:

Check Authlib version: python -c "import authlib; print(authlib.__version__)" - if version < 1.6.4, system is vulnerable.

Check Version:

python -c "import authlib; print('Authlib version:', authlib.__version__)"

Verify Fix Applied:

After update, verify version is 1.6.4+ and test with crafted JWS token containing unknown critical header - should be rejected.

📡 Detection & Monitoring

Log Indicators:

  • Authentication failures for tokens that previously worked
  • Unusual critical header parameters in JWS tokens
  • Inconsistent authentication decisions across services

Network Indicators:

  • HTTP 401/403 responses followed by successful authentication with similar tokens
  • Tokens with 'crit' header containing unusual values

SIEM Query:

source="auth_logs" AND ("crit" OR "critical") AND NOT ("alg" OR "kid" OR "typ")

🔗 References

📤 Share & Export