
CVE-2026-29000 - pac4j-jwt (< 4.5.9 / < 5.7.9 / < 6.3.3) JwtAuthenticator تجاوز المصادقة PoC
JwtAuthenticator ثغرة تجاوز المصادقة (PoC)إثبات المفهوم (PoC) لـ CVE-2026-29000، وهي ثغرة تجاوز المصادقة في مكون JwtAuthenticator في pac4j-jwt (CVSS 10.0، حرجة).
يقوم السكريبت بتزوير رمز مميز (token) ينتحل هوية أي مستخدم بأي دور — دون معرفة أي سر — طالما أن الهدف يعرض مفتاحه العام RSA.
[!تحذير] هذه الأداة مقدمة لأغراض تعليمية واختبارات الأمن المصرح بها فقط. تمت كتابتها لحل آلة Hack The Box "Principal"، والإعدادات الافتراضية (
iss،role،kid) مصممة خصيصًا لتلك الآلة. استخدمها فقط ضد أنظمة تملكها أو لديك إذن صريح لاختبارها.
إصدارات pac4j-jwt الأقل من 4.5.9 والأقل من 5.7.9 والأقل من 6.3.3 تحتوي على خلل منطقي في JwtAuthenticator عند معالجة JWT المشفرة (JWE).
عندما يقوم JwtAuthenticator بفك تشفير JWE، يحاول تحليل الرمز الداخلي كـ SignedJWT. إذا كان الرمز الداخلي هو PlainJWT غير موقع (alg: none)، فإن كائن SignedJWT يعود null، وبسبب الخلل المنطقي، يتم تجاوز مسار التحقق من التوقيع بالكامل. ثم يقوم المصادق ببناء ملف تعريف المستخدم مباشرة من الادعاءات غير الموثقة.
بعبارة أخرى، يتم الخلط بين تشفير JWE الخارجي — الذي يتطلب فقط المفتاح العام للخادم — وبين دليل على الأصالة، لذا يمكن لأي مهاجم يمكنه قراءة المفتاح العام إنشاء رموز مميزة موثوقة بالكامل.
/api/auth/jwks).PlainJWT غير موقع (alg: none) مع ادعاءات يختارها المهاجم (sub، role، iss، …).PlainJWT في غلاف JWE مشفر بالمفتاح العام للهدف.Bearer. يقوم JwtAuthenticator الضعيف بفك تشفيره، ويتجاوز التحقق من التوقيع، ويثق في الادعاءات المزورة.requirements.txt:pip install -r requirements.txt
(requests، jwcrypto، cryptography)
python3 exploit.py -u <username> [options]
يجب تقديم إما --target (لجلب JWKS عبر الشبكة) أو --jwks-file (لتوفيره محليًا).
تزوير رمز مميز للمسؤول عن طريق جلب المفتاح العام من الهدف وطباعته إلى stdout:
python3 exploit.py -t http://target:8080 -u admin
تزوير رمز مميز، ثم اختباره تلقائيًا ضد نقطة نهاية محمية:
python3 exploit.py -t http://target:8080 -u admin \
--verify-endpoint /api/settings -v
استخدام JWKS محفوظ محليًا وحفظ الرمز إلى ملف:
python3 exploit.py --jwks-file jwks.json -u admin -o token.jwe
قم بترقية org.pac4j:pac4j-jwt إلى إصدار مصحح:
تم الإصدار بموجب MIT License.
| العلامة | الوصف | الافتراضي |
|---|
-t, --target | عنوان URL الأساسي للهدف (مثل http://host:8080) | — |
--jwks-url | مسار نقطة نهاية JWKS | /api/auth/jwks |
--jwks-file | تحميل JWKS من ملف محلي بدلاً من الجلب من --target | — |
-u, --username | قيمة ادعاء sub (مطلوب) | — |
--role | قيمة ادعاء role | ROLE_ADMIN |
--iss | قيمة ادعاء iss | principal-platform |
--exp | صلاحية الرمز بالثواني | 3600 |
--verify-endpoint | نقطة نهاية محمية لاختبار الرمز المزور ضدها (مثل /api/settings) | — |
-k, --insecure | تعطيل التحقق من شهادة TLS | off |
-o, --output | كتابة JWE المزور إلى ملف بدلاً من stdout | stdout |
-v, --verbose | طباعة محتوى JWT المزور إلى stderr | off |