
रियोलिंक डेस्कटॉप एप्लिकेशन में कैश क्लियरिंग शेड्यूलर के माध्यम से OS कमांड इंजेक्शन भेद्यता
रीलिंक डेस्कटॉप एप्लिकेशन (संस्करण 8.18.12) में इसके कैश क्लियरिंग शेड्यूलर (coverCacheClearScheduler) सुविधा में OS कमांड इंजेक्शन भेद्यता मौजूद है। एप्लिकेशन %LOCALAPPDATA% के भीतर स्थित एक कॉन्फ़िगरेशन फ़ाइल से पढ़े गए अस्थायी फ़ोल्डर पथ का उपयोग करके OS शेल कमांड का निर्माण करता है। चूंकि यह पथ मान उचित इनपुट सैनिटाइज़ेशन की कमी रखता है, एक हमलावर इसमें हेरफेर करके मनमाने OS कमांड इंजेक्ट कर सकता है।
यह भेद्यता शेड्यूलर द्वारा ट्रिगर होती है, जो प्रतिदिन सुबह 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());
}
},
}
शेड्यूलर द्वारा निष्पादित फ़ंक्शन निम्नलिखित तर्क का उपयोग करके एक शेल कमांड स्ट्रिंग का निर्माण करता है:
p(
"darwin" === process.platform
? "rm -rf ".concat(t)
: "rd /s /q ".concat(t),
function (t) {
//...
विंडोज़ पर, परिणामी कमांड है:
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 बजे स्वचालित रूप से पुनः निष्पादित करके स्थिरता प्रदान करता है। यह स्थिरता एप्लिकेशन की भौतिक सुरक्षा उपकरण होने की प्रकृति से और बढ़ जाती है, जिसे अक्सर 24/7 चालू रखा जाता है। यह 'स्टार्ट ऑन बूट' सुविधा का भी समर्थन करता है, जिससे यह सुनिश्चित होता है कि पेलोड रीबूट के बाद भी बना रहे।
इसके अलावा, हमलावर को महत्वपूर्ण छिपाव प्राप्त होता है। कमांड विश्वसनीय, डिजिटल रूप से हस्ताक्षरित 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
अधिक विवरण के लिए, कृपया AES-CFB IV जनरेशन भेद्यता हेतु CVE-2025-56801 और AES-CFB कुंजी जनरेशन और प्रबंधन भेद्यता हेतु CVE-2025-56802 देखें।
इस OS कमांड इंजेक्शन भेद्यता को मौलिक रूप से हल करने के लिए, आपको उपयोगकर्ता कॉन्फ़िगरेशन फ़ाइलों जैसे अविश्वसनीय बाहरी स्रोतों से पढ़े गए मानों को सीधे OS शेल कमांड स्ट्रिंग्स में शामिल करने से बचना चाहिए। अनुशंसित समाधान rd या rm जैसे शेल कमांड के उपयोग को नेटिव APIs से बदलना है जो पथ को कमांड के रूप में नहीं, बल्कि शुद्ध डेटा के रूप में मानते हैं, जैसे Node.js का fs.rm()। यह विधि इस श्रेणी की भेद्यता को पूरी तरह से समाप्त कर देती है।
यदि शेल कमांड का निर्माण पूरी तरह से अपरिहार्य है, तो कमांड इंजेक्शन का कारण बन सकने वाले सभी विशेष वर्णों, जैसे &, |, और ;, को सख्ती से मान्य करने और या तो सैनिटाइज़ करने या एस्केप करने के लिए एक रक्षात्मक तर्क लागू किया जाना चाहिए।