
إثبات مفهوم واستشارة لثغرة اجتياز المسار CWE-22 في معالج السحب والإفلات في InputLeap، مع خطوات إعادة الإنتاج، ونص الاستغلال، وإرشادات المعالجة.
المنتج: InputLeap v3.0.3
المورّد: input-leap
الثغرة: اجتياز المسار
CWE: CWE-22 التقييد غير الصحيح لاسم المسار إلى دليل مقيّد ('اجتياز المسار')
يحاول معالج السحب والإفلات في InputLeap تعقيم أسماء الملفات من خلال إيجاد آخر فاصل مسار والاحتفاظ فقط بالجزء الذي يليه. عندما لا يتم العثور على فاصل، تُرجع عملية البحث في سلاسل C++ قيمة حارسة خاصة تُسمى npos للإشارة إلى الفشل. ومع ذلك، لا يتحقق الكود أبدًا من هذه القيمة الحارسة قبل استخدام النتيجة في العمليات الحسابية. ولأن npos مُعرَّفة على أنها أكبر عدد صحيح غير مُوقَّع ممكن، فإن طرحها يلتف بصمت ويُنتج إجابة تبدو صحيحة لكنها خاطئة تمامًا: فبدلاً من إرجاع اسم الملف فقط، تُرجع السلسلة الأصلية الكاملة غير المُعقَّمة. يمكن للمهاجم استغلال ذلك عبر صياغة رسالة يفتقر فيها أحد العناصر إلى فاصل بينما يحتوي عنصر آخر على فاصل غير متطابق — فتنقلب استدلالية الكشف عن الفواصل العامة في الكود، ويفشل البحث بصمت، ويمرّ ..\..\AppData\...\Startup\evil.exe دون أي تعديل. ثم تُدمج هذه السلسلة مع دليل الإفلات وتُسلَّم إلى نظام التشغيل، الذي يفسّر تسلسلات .. ويكتب الملف خارج المجلد المقصود. توجد الثغرة لأن فحصًا دفاعيًا لحالة "غير موجود" مفقود.
--enable-drag-drop على الهدف (اختياري، معطّل افتراضيًا).DragInformation::parseDragInfo الخاصة بـ find_last_of(slash, ...) القيمة npos لمقطع اسم الملف المفصول بـ "\"، مما يسبب التفاف الحساب غير المُوقَّع وإرجاع المسار الكامل غير المقطوع.DropHelper::writeToDir هذا المسار مع دليل الإفلات الخاص بالمستخدم (سطح المكتب افتراضيًا) وتكتب الملف دون أي تقنين، فيستقر في مجلد Startup./src/lib/inputleap/DragInformation.cpp
/src/lib/inputleap/DropHelper.cpp
تم توفير POC يدعم اتصالات TLS وغير المشفّرة إلى الخادم.
يمكن للمهاجم استغلال هذه الثغرة لرفع ملف إلى مسار عشوائي خارج المجلد الافتراضي أو المُعيَّن. وقد يؤدي ذلك إلى تنفيذ الكود
DragInformation::parseDragInfo، استبدل استدلالية الكشف عن الشرطة المائلة بـ std::filesystem::path(filename).filename() لضمان استخراج الاسم الأساسي فقط.DropHelper::writeToDir، قنّن المسار النهائي باستخدام std::filesystem::canonical وارفضه إذا لم يبدأ بـ destination.