
مختبر إثبات مفهوم على مستوى المكتبة يوضح CVE-2026-29000 في pac4j-jwt، مع مقارنة الإصدارات الضعيفة والمصححة باستخدام Docker لإظهار قبول ورفض JWT المزور.
| الإصدار | خط الأساس | الهجوم | النتيجة |
|---|
6.0.3 | ✅ | ✅ | ضعيف |
6.0.4.1 | ✅ | ✅ | ضعيف |
6.3.3 | ✅ | ❌ | مصحح |
يُظهر هذا الـ PoC إنشاء ملف تعريف مصادق عليه مع subject وأدوار يتحكم بها المهاجم في الإصدارات الضعيفة، بينما يرفض الإصدار المصحح الرمز المزوّر.
هذا ليس عرضًا لتطبيق ويب.
إنه برنامج Java صغير يستدعي JwtAuthenticator مباشرة ويقارن إصدارات متعددة من pac4j-jwt داخل Docker.
الهدف هو إثبات ثلاثة أمور:
تم اختيار الإصدارات المختبرة عمدًا:
يمنح هذا المختبر ثلاث نقاط مرجعية مفيدة:
.
├── docker-compose.yml
├── Dockerfile
├── pom.xml
└── src/main/java/lab/Repro.java
docker-compose.yml
يحدد مصفوفة الاختبار لكل إصدار.
Dockerfile
يبني ويشغّل الـ PoC داخل حاوية.
pom.xml
يحدد التبعيات ويبني JAR قابلًا للتشغيل.
src/main/java/lab/Repro.java
أداة الـ PoC الفعلية.
يحدد ملف docker-compose.yml ثلاث خدمات:
v603 = اختبار pac4j-jwt 6.0.3v6041 = اختبار pac4j-jwt 6.0.4.1patched = اختبار pac4j-jwt 6.3.3إذن هذه الأوامر تعني "تشغيل الـ PoC مرة واحدة ضد هذا الإصدار المحدد":
docker compose run --rm v603
docker compose run --rm v6041
docker compose run --rm patched
--rm تعني أن الحاوية المؤقتة تُحذف بعد انتهاء التشغيل.
docker compose build --no-cache
docker compose run --rm v603
docker compose run --rm v6041
docker compose run --rm patched
لكل إصدار، يشغّل البرنامج حالتين.
يُنشئ رمزًا شرعيًا ويتحقق منه عبر JwtAuthenticator.
النتيجة المتوقعة:
يُنشئ رمزًا مزوّرًا بادعاءات يتحكم بها المهاجم ويتحقق منه عبر JwtAuthenticator.
النتيجة المتوقعة:
يجب أن ترى شيئًا مثل هذا:
[case] baseline
result: ACCEPTED
observed_subject: alice
observed_roles: [ROLE_USER]
[case] attack
result: ACCEPTED
observed_subject: admin#override
observed_roles: [ROLE_SUPERUSER, ROLE_ADMIN]
[summary]
conclusion: VULNERABLE: forged token accepted
المعنى:
يجب أن ترى شيئًا مثل هذا:
[case] baseline
result: ACCEPTED
observed_subject: alice
observed_roles: [ROLE_USER]
[case] attack
result: REJECTED
reason: CredentialsException: A non-signed JWT cannot be accepted as signature configurations have been defined
[summary]
conclusion: PATCHED: forged token rejected
المعنى:
تؤثر هذه الثغرة على مسار مصادقة على مستوى المكتبة، وليس تطبيقًا واحدًا بنموذج أدوار موحد.
الجزء القابل لإعادة الاستخدام هو شكل الهجوم:
JwtAuthenticatorما ليس موحدًا عبر التطبيقات الحقيقية:
لهذا السبب، يركز هذا المستودع على إثبات أن المكتبة تقبل الادعاءات المزوّرة التي يتحكم بها المهاجم في الإصدارات الضعيفة، بدلًا من الادعاء بوجود رمز موحد واحد يعمل تلقائيًا ضد أي تطبيق.
docker compose run --rm v603docker compose run --rm v6041docker compose run --rm patched


يُظهر هذا المشروع ثلاث حقائق أساسية:
6.0.3 و6.0.4.16.3.3هذا هو الدليل الأساسي للضعف مقابل التصحيح لهذه الثغرة في هذا المستودع.
في الإصدارات الضعيفة، لا يتم تحليل الرمز المزوّر فحسب — بل يُنتج ملف تعريف مصادق عليه مع subject وأدوار يتحكم بها المهاجم.