
يكتشف وحدات Apache Shiro وإصداراتها المثبّتة فعليًا على نظامك، ويحدد واحدًا تلو الآخر أيًّا من الـ 26 CVE الرسمية ينطبق عليك حقًا. يعتمد التقييم على «CVE × وحدة»، بدون أي تبعيات وملف jar واحد. CVE-2026-49268
يكشف وحدات Apache Shiro التي ثبّتها فعليًا مع إصداراتها، ويقيّم الإدخالات الرسمية الـ 26 من CVE واحدًا تلو الآخر ليحدد أيها ينطبق عليك فعلًا.
jar واحد بلا أي تبعيات، لا يتصل بالإنترنت، ولا يقرأ ملف pom الخاص بك — يفحص نواتج البناء مباشرة (jar / war / fat jar / directory).
java -jar shiro-check.jar --utf8 your-app.jar
CVE الخاصة بـ Shiro ليست معلّقة على «Shiro» نفسه، بل على وحدات محددة. الرقم نفسه يعني قواعد مختلفة باختلاف الوحدة:
| CVE | الوحدات المتأثرة | من يستخدم shiro-core فقط |
|---|---|---|
| CVE-2020-17510 | shiro-spring | لا يتأثر |
| CVE-2020-17523 | shiro-web / shiro-spring / shiro-spring-boot-starter | لا يتأثر |
| CVE-2023-34478 | shiro-web | لا يتأثر |
| CVE-2026-56091 | shiro-guice | لا يتأثر |
من بين الإدخالات الرسمية الـ 26، 13 إدخالًا لا تمسّ shiro-core إطلاقًا. اختصارها في جملة واحدة مثل «Shiro < 1.7.1 به ثغرات» يعني اتخاذ القرار الذي كان ينبغي للمستخدم اتخاذه بنفسه — مع أن ذلك القرار خاطئ.
تعمل هذه الأداة بدقة CVE × الوحدة: تتوسع 26 CVE إلى 37 قاعدة تغطي 7 وحدات.
يطابق Dependabot نصائح GitHub (advisories) وفق إحداثيات التبعية. خمسة من أصل 26 إدخالًا لا تتطابق:
أما shiro-root فهو POM رئيسي (parent POM) بنوع packaging=pom — لا يوجد
jar مطابق له على Maven Central (HTTP 404)،
ولا يعتمد عليه أي مشروع، لذا لن يتطابق أبدًا عبر المطابقة الإحداثية.
ℹ️
unreviewedهي حالة سير عمل طبيعية في GitHub (استيراد تلقائي من NVD دون تحديد يدوي للحزم المتأثرة بعد)، والمطابقة الإحداثية تصميم منطقي أيضًا. نذكر هنا حقيقة «عدم الوصول إلى التنبيهات» فحسب، ولا نقول إن أحدًا أخطأ في الإبلاغ.
shiro-all هو uber jar يضُم وحدات متعددة داخل حزمة واحدة. الفحص الفعلي لـ shiro-all-1.3.2.jar يُظهر 6 ملفات
META-INF/maven/org.apache.shiro/<module>/pom.properties:
shiro-all shiro-core shiro-web shiro-spring shiro-ehcache shiro-quartz
بعبارة أخرى، المشروع الذي يكتفي بكتابة shiro-all في ملف pom لديه اسم واحد فقط على مستوى الإحداثيات
(من بين 26 إدخالًا، فقط CVE-2016-6802 معلّقة على هذا الإحداثي)، بينما يحوي الـ jar فعليًا كود ثلاث وحدات: core / web / spring.
فحص الأثر الفعلي يكشف هذه الطبقة. عند فحص shiro-all-1.3.2.jar فعلًا، تُبلغ الأداة عن 20 إدخالًا موزعة على 3 وحدات.
بالنسبة إلى ثلاثة advisories تكون قيمة first_patched_version هي 3.0.0-alpha-2، وهذا الإصدار لم يُنشر إلى Maven Central مطلقًا
(أصدرت الجهة الرسمية النسخة المستقرة 3.0.0 مباشرة). الترقية إليه غير ممكنة — لذا تعلّم الأداة على هذه الحالات
وتستبدل اقتراح الترقية بإصدار يمكن الحصول عليه فعلًا.
«الإصابة» = الوحدة موجودة والإصدار يقع ضمن النطاق الرسمي المتأثر. وهي لا تعني «تم استغلالها» أو «قابلة للاستغلال حتمًا».
معظم الإدخالات الـ 26 لا تنطبق إلا بتهيئة معينة، لذا تعرضها الأداة في قوائم منفصلة:
أمثلة على الشروط (مطابقة حرفيًا لنص الوصف الرسمي دون أي استقراء إضافي):
CVE-2026-49268 يُصاب فقط عند استخدام DefaultLdapRealm(إدماج اسم المستخدم في LDAP DN دون تهريب)
CVE-2023-22602 يُصاب فقط عند الاستخدام مع Spring Boot 2.6+ مع عدم إعادة
spring.mvc.pathmatch.matching-strategy إلى ant_path_matcher
CVE-2026-23903 يُصاب فقط عند وضع الملفات الثابتة على نظام ملفات غير حساس لحالة الأحرف(مثل إعداد macOS الافتراضي)،
مع تكوين مسارات filter بأحرف صغيرة فقط في Shiro;يؤثر على الملفات الثابتة فقط
🔴 الأداة لا تحلل تهيئتك. يمكن ضبط Shiro في shiro.ini / application.yml / كود Java، والاستنتاج المستخلص من التحليل أخطر من عدم التحليل. تُسرد الشروط نصًا صريحًا ويُترك الحكم لك — هذا تصميم مقصود، لا تكاسل.
# فحص jar / war
java -jar shiro-check.jar your-app.jar
# فحص دليل كامل (بشكل تكراري)
java -jar shiro-check.jar /path/to/libs
# عرض الإدخالات «غير المنطبقة» أيضًا
java -jar shiro-check.jar --all your-app.jar
# عند ظهور أحرف صينية مشوّهة في وحدة التحكم على Windows
java -jar shiro-check.jar --utf8 your-app.jar
القدرة على التعرّف: jar عادي · Spring Boot fat jar (BOOT-INF/lib/) · WAR تقليدي (WEB-INF/lib/) ·
uber jar (shiro-all، يُفكك الوحدات المضمّنة) · jar أعيدت تسميته (يُعتمد على pom.properties) ·
أرشيفات مشوّهة تستخدم شرطات مائلة عكسية في المسارات.
يتطلب JDK 17+. صفر تبعيات في وقت التشغيل.
لا يوجد سطر واحد مكتوب يدويًا. يولّد tools/gen_rules.py الجدول من مصدرين أوليين:
| المصدر | ما يوفره |
|---|---|
| shiro.apache.org/security-reports.html | مجموعة الإدخالات الكاملة، نص الوصف الأصلي، نص شروط التفعيل الأصلي |
| GitHub Advisory API | إحداثيات الوحدات المتأثرة، نطاقات الإصدارات المهيكلة، درجة الخطورة |
تتضمن عملية التوليد 12 تأكيدًا (assertions)؛ إذا لم يتحقق أي منها يتوقف التنفيذ دون كتابة الملف (لمنع «فشل التحليل فيولّد جدولًا أجوف بينما تبقى الاختبارات خضراء بالكامل»):
قبل النشر توجد أداة أخرى tools/recheck_before_publish.py تعيد التحقق من الحجج الأساسية باستخدام معايير تحقق مستقلة ثانية
(لا تستورد سكربت التوليد ولا تقرأ مخرجاته — إعادة استخدام منطق التحليل نفسه تعني إعادة إنتاج الأخطاء (bugs) معه).
unreviewed إلى reviewed في أي وقتshiro-check يفحص نواتج البناء لديك (jar / war / fat jar / directory) ليكتشف وحدات Apache Shiro التي تُصدّرها فعليًا، ثم يقيّم جميع CVE الرسمية الـ 26 مقابل تركيبتك الدقيقة من الوحدة + الإصدار.
لماذا وُجدت هذه الأداة؟ CVE الخاصة بـ Shiro تتعلق بـ الوحدات، لا بـ «Shiro». 13 من أصل 26 لا تمسّ shiro-core إطلاقًا. تعمل الأداة بدقة CVE × الوحدة (37 قاعدة، 7 وحدات).
ثلاثة أمور لا يستطيع المطابقة القائم على الإحداثيات رؤيتها:
unreviewed مع قائمة حزم متأثرة فارغة؛ و2 مرفقة فقط بـ org.apache.shiro:shiro-root، وهو POM رئيسي بنوع packaging=pom بلا jar على Maven Central (HTTP 404)، لذا لا يعتمد عليه أي مشروع إطلاقًا.shiro-all هو uber jar — يحتوي shiro-all-1.3.2.jar على 6 مدخلات pom.properties (core وweb وspring وehcache وquartz + نفسه). يعرض ملف pom لديك إحداثيًا واحدًا؛ بينما يحمل الـ jar كودًا يكافئ ثلاث وحدات.3.0.0-alpha-2 بوصفه الإصلاح، وهو إصدار لم يُنشر إلى Maven Central مطلقًا. تعلّم الأداة على هذه الحالات وتقترح إصدارًا يمكنك الترقية إليه فعلًا.«الإصابة» تعني وحدة موجودة وإصدار ضمن النطاق الرسمي المتأثر. وهي لا تعني قابلية الاستغلال — معظم الإدخالات تتطلب تهيئة محددة تسردها الأداة حرفيًا من الـ advisory الرسمي. وهي لا تحلل تهيئتك عن قصد.
java -jar shiro-check.jar [--all] [--utf8] <jar | war | directory> ...
يتطلب JDK 17+. بلا تبعيات وقت تشغيل. يُولَّد جدول القواعد من مصدرين أوليين ويتضمن 12 تأكيدًا يتوقف التنفيذ عند فشلها؛ راجع tools/gen_rules.py.
Apache License 2.0
| الإدخال | سبب عدم التطابق |
|---|
| CVE-2026-56091 (تجاوز مصادقة shiro-guice، بدرجة high) | الـ advisory ما يزال بحالة unreviewed، وقائمة الحزم المتأثرة فارغة |
| CVE-2026-56130 (cookie الخاصة بـ RememberMe لا تنتهي أبدًا) | نفس السبب أعلاه |
| CVE-2014-0074 (تجاوز كلمة مرور فارغة في LDAP) | نفس السبب أعلاه |
| CVE-2023-22602 (تجاوز مصادقة Spring Boot 2.6+، بدرجة high) | الـ advisory مرفق فقط بـ org.apache.shiro:shiro-root |
| CVE-2010-3863 | نفس السبب أعلاه |