
ثغرة حقن أوامر نظام التشغيل عبر جدولة تنظيف ذاكرة التخزين المؤقت في تطبيق Reolink لسطح المكتب
يحتوي تطبيق Reolink لسطح المكتب (الإصدار 8.18.12) على ثغرة حقن أوامر نظام التشغيل في ميزة مُجدوِل تنظيف ذاكرة التخزين المؤقت (coverCacheClearScheduler). يقوم التطبيق ببناء أمر shell لنظام التشغيل باستخدام مسار مجلد مؤقت يُقرأ من ملف إعدادات موجود داخل %LOCALAPPDATA%. وبما أن قيمة هذا المسار تفتقر إلى التعقيم الصحيح للمدخلات، يمكن للمهاجم التلاعب بها لحقن أوامر نظام تشغيل عشوائية.
يتم تشغيل هذه الثغرة بواسطة المُجدوِل، الذي يعمل تلقائيًا كل يوم في الساعة 3:00 صباحًا، مما يمنح المهاجم استمرارية على النظام. علاوة على ذلك، يتم تنفيذ الأمر المُحقون كجزء من عملية Reolink.exe الشرعية الموقّعة رقميًا، مما يوفر التخفي عبر تفادي اكتشاف حلول الأمان.
يقوم التطبيق بتهيئة مُجدوِل للعمل كل يوم في الساعة 3:00 صباحًا:
{
key: "clearCoverCacheRegularly",
value: function () {
if (this.coverCacheClearScheduler) {
var e = new Date(),
t = new Date(
e.getFullYear(),
e.getMonth(),
e.getDate(),
3,
0,
0,
).getTime();
(e.getTime() > t &&
(t = new Date(
e.getFullYear(),
e.getMonth(),
e.getDate() + 1,
3,
0,
0,
).getTime()),
this.coverCacheClearScheduler.add({
id: this.clearCoverCacheTaskId,
name: "clearCoverCache",
unit: r.ETaskUnit.DAY,
interval: 1,
args: !1,
execute: this.removeCoverCacheDir,
nextTime: t,
isInExact: !0,
}),
this.coverCacheClearScheduler.start());
}
},
}
تقوم الدالة التي ينفذها المُجدوِل ببناء سلسلة أمر shell باستخدام المنطق التالي:
p(
"darwin" === process.platform
? "rm -rf ".concat(t)
: "rd /s /q ".concat(t),
function (t) {
//...
على نظام Windows، يكون الأمر الناتج:
rd /s /q %LOCALAPPDATA%\Temp\reolink\<TEMP_FOLDER>\playback-covers
على نظام macOS، يكون الأمر الناتج:
rm -rf ~/Library/Caches/reolink/<TEMP_FOLDER>/playback-covers
نظرًا لأن <TEMP_FOLDER> لا يتم تعقيمه بشكل صحيح، يمكن للمهاجم حقن أوامر إضافية عبر التلاعب باسم المجلد، مما يؤدي إلى تنفيذ الأوامر:
rd /s /q %LOCALAPPDATA%\Temp\reolink\& <COMMAND> &\playback-covers
rm -rf ~/Library/Caches/reolink/& <COMMAND>; echo /playback-covers
يتطلب تشغيل الهجوم تعديل ملف محلي، مما يستلزم ثغرة أخرى، أو تنفيذ برمجيات خبيثة، أو وصولًا فعليًا إلى النظام.
على الرغم من أن التشغيل الأولي صعب نسبيًا، إلا أن الهجوم فعال للغاية بمجرد نجاحه، حيث يوفر استمرارية عبر إعادة تنفيذ الحمولة تلقائيًا كل يوم في الساعة 3:00 صباحًا. وتتعزز هذه الاستمرارية بطبيعة التطبيق كأداة أمان مادية، والتي غالبًا ما تُترك تعمل على مدار الساعة طوال أيام الأسبوع. كما يدعم ميزة "البدء عند الإقلاع"، مما يضمن بقاء الحمولة بعد إعادة تشغيل النظام.
علاوة على ذلك، يحقق المهاجم تخفيًا كبيرًا. يتم تنفيذ الأمر كجزء من عملية Reolink.exe الموثوقة والموقّعة رقميًا، مما يجعله فعالًا للغاية في تجاوز حلول EDR وقوائم السماح للتطبيقات. هذه تقنية كلاسيكية من تقنيات العيش على الأرض (LOTL).
يمكن تنفيذ الهجوم عن طريق تشغيل poc.py، الذي يعدّل ملف الإعدادات المحلي. وهذا ممكن من خلال ربط ثغرات أخرى تتعلق بالتشفير غير الكافي (CVE-2025-56801 وCVE-2025-56802)، والتي تُستخدم لفك تشفير ملف الإعدادات وإعادة تشفيره.
عادةً، لن يتم تشغيل الحمولة إلا في الساعة 3:00 صباحًا. ومع ذلك، نظرًا لأن التطبيق لا يستخدم تغليف ASAR، يمكن تصحيح الكود لتشغيل الثغرة فورًا لأغراض العرض التوضيحي.
نتيجة التنفيذ كما يلي:
https://github.com/user-attachments/assets/44bf4d84-b8bf-4f4a-853c-07380ce26783
لمزيد من التفاصيل، يرجى الرجوع إلى CVE-2025-56801 لثغرة توليد IV الخاص بـ AES-CFB وCVE-2025-56802 لثغرة توليد وإدارة مفتاح AES-CFB.
لحل ثغرة حقن أوامر نظام التشغيل هذه بشكل جذري، يجب تجنب تضمين القيم المقروءة من مصادر خارجية غير موثوقة، مثل ملفات إعدادات المستخدم، مباشرة في سلاسل أوامر shell لنظام التشغيل. الحل الموصى به هو استبدال استخدام أوامر shell مثل rd أو rm بواجهات برمجة تطبيقات أصلية تتعامل مع المسار كبيانات خالصة، وليس كأمر، مثل fs.rm() في Node.js. هذه الطريقة تقضي تمامًا على هذه الفئة من الثغرات.
إذا كان بناء أمر shell أمرًا لا مفر منه تمامًا، فيجب تنفيذ منطق دفاعي للتحقق الصارم وتعقيم أو تهريب جميع الأحرف الخاصة التي قد تسبب حقن الأوامر، مثل & و| و;.