
أداة تحقق محلية فقط لإثبات المفهوم لـ CVE-2026-100671، تعيد إنتاج كشف ملف تعريف ارتباط الجلسة في ذاكرة التخزين المؤقت لصفحات Grav Twig وإعادة تشغيله ضد أهداف loopback.
أداة تحقق محلية بسيطة للاستيلاء على جلسة Grav content-Twig/page-cache الذي تم إصلاحه في Grav 2.0.25.
الإشعارات:
exploit.py مقيّد عمداً بأهداف loopback:
127.0.0.1::1localhostيرفض المضيفين البعيدين، ويتبع فقط عمليات إعادة التوجيه إلى loopback، ويستخدم عملاء HTTP من مكتبة Python القياسية، ويطبّق مهل الطلبات، ولا يطبع أبداً رموز bearer أو ملفات تعريف الارتباط أو أجسام الاستجابة.
استخدمه فقط ضد نسخة Grav تملكها أو لديك تفويض صريح لاختبارها. ينشئ السكربت صفحة إثبات عامة في المختبر المحلي. احذف تلك الصفحة بعد الاختبار إذا كان المختبر يحتفظ بالمحتوى بين التشغيلات.
get_cookie() ملف تعريف ارتباط جلسة المسؤول الزائر من جهة الخادم.يحتاج حساب كتابة الصفحات فقط إلى مسار الكتابة منخفض الصلاحيات الموثّق. لا يحتاج إلى api.pages.read أو admin.* أو وصول super-admin. يحتاج المسؤول الضحية فقط إلى زيارة الصفحة العامة مرة واحدة.
2.0.19 حتى 2.0.24: معرّضة للثغرة مع إعداد content-Twig الافتراضي المرفق.2.0.0 حتى 2.0.18، و1.7.x: متأثرة فقط عندما كان content Twig ممكّناً صراحةً.2.0.25: مُصلَح.شغّل مختبر Grav محلياً مع:
هذا المستودع المكوّن من ملفين لا يوفّر Grav أو PHP أو الإضافات أو الحسابات.
عيّن بيانات الاعتماد عبر متغيرات البيئة حتى لا تدخل أبداً إلى نظام التحكم بالمصدر:
export GRAV_BASE_URL=http://127.0.0.1:8080
export GRAV_WRITER_USERNAME=low
export GRAV_WRITER_PASSWORD='local-writer-password'
export GRAV_ADMIN_USERNAME=admin
export GRAV_ADMIN_PASSWORD='local-admin-password'
python3 exploit.py
يجب أن يبقى عنوان URL الأساسي على loopback. المسار الافتراضي عشوائي. يمكن اختيار مسار ثابت عند مقارنة التشغيلات:
python3 exploit.py --route /cookie-proof-24
النتيجة المتوقعة عند وجود الثغرة:
page_create_status=201
admin_login_status=200
victim_page_status=200
attacker_page_status=200
cached_victim_cookie_visible_to_attacker=yes
admin_cookie_value_match=yes
replayed_cookie_api_status=200
result=VULNERABLE
يخرج الأمر بالقيمة 0 عند إعادة إنتاج النتيجة المتوقعة، و1 عند عدم إعادة إنتاجها، و2 عند حدوث خطأ في الإعداد أو النقل.
شغّل الأمر نفسه ضد Grav 2.0.25:
python3 exploit.py --expect fixed
السلوك المُصلَح المتوقع: لا قيمة جلسة مرئية للمهاجم ولا إعادة تشغيل ناجحة للجلسة. تخرج النتيجة المُصلَحة النظيفة بالقيمة 0 مع --expect fixed.
قم بالترقية إلى Grav 2.0.25 أو أحدث. بالنسبة للنشرات الأقدم، يسرد الإشعار هذه الضوابط المؤقتة:
security.twig_content.process_enabled: false؛ أوsystem.pages.never_cache_twig: true؛لا تعتبر HttpOnly أو Secure أو SameSite إصلاحاً: قراءة ملف تعريف الارتباط المعرّض للثغرة تحدث من جهة الخادم أثناء عرض Twig.
تم الإبلاغ بواسطة canhieu. هذا المستودع أداة مساعدة لإعادة إنتاج إشعار عام بالفعل، وليس ماسحاً بعيداً أو أداة لجمع بيانات الاعتماد.