
KslDump — अपना खुद का चाकू क्यों लाएं जब Defender पहले से ही रसोई में एक छोड़ गया है?
मैंने इस मुद्दे को 7 मार्च 2026 को माइक्रोसॉफ्ट को रिपोर्ट किया। हालांकि, लगभग 20 दिन पहले, गेम-हैकिंग समुदाय ने पहले ही इसे रिवर्स कर लिया था और सार्वजनिक रूप से चर्चा की थी। अपनी तरफ से, मैं उनके प्रोजेक्ट्स का अनुसरण नहीं करता और मुझे इस बारे में कुछ भी पता नहीं था। यह भी स्पष्ट है कि ये दो पूरी तरह से अलग और असंबंधित प्रोजेक्ट हैं।
जब डिफेंडर पहले से ही रसोई में एक चाकू छोड़ गया है तो अपना चाकू क्यों लाएं?
KslDump केवल माइक्रोसॉफ्ट-हस्ताक्षरित घटकों का उपयोग करके PPL-संरक्षित LSASS से क्रेडेंशियल निकालता है। कोई शोषण नहीं लगाया जाता। कोई ड्राइवर लोड नहीं किया जाता। पूरी हमला श्रृंखला विंडोज डिफेंडर के साथ पूर्व-स्थापित आती है। माइक्रोसॉफ्ट ने MmCopyMemory को नल करके चल रहे संस्करण (wd\KslD.sys) को पैच किया, लेकिन पुराना असुरक्षित संस्करण (drivers\KslD.sys) डिस्क पर छोड़ दिया। हमलावर कुछ भी नहीं लाता — वे बस सेवा को उस चीज़ की ओर इंगित करते हैं जिसे माइक्रोसॉफ्ट साफ करना भूल गया।
https://github.com/user-attachments/assets/78dfce25-56b3-4eb8-9de2-7c183601e597
KslD.sys एक कर्नेल ड्राइवर है जो माइक्रोसॉफ्ट डिफेंडर के साथ आता है। यह माइक्रोसॉफ्ट-हस्ताक्षरित है, एक विश्वसनीय कर्नेल मॉड्यूल के रूप में लोड होता है, और एक उपकरण ऑब्जेक्ट \\.\KslD को उजागर करता है जो यूज़रमोड से सुलभ है।
ड्राइवर कई उप-आदेशों के साथ IOCTL 0x222044 स्वीकार करता है जो डिवाइस हैंडल खोलने वाली किसी भी प्रक्रिया को अप्रतिबंधित कर्नेल और भौतिक मेमोरी एक्सेस प्रदान करते हैं।
| उप-आदेश | क्षमता | प्रभाव |
|---|---|---|
| 2 | CR3, IDTR और अन्य CPU नियंत्रण रजिस्टरों को यूज़रमोड में लौटाता है | तत्काल KASLR पराजय |
| 12 | हमलावर-नियंत्रित पते और आकार के साथ MmCopyMemory() को कॉल करता है | मनमाना कर्नेल/भौतिक मेमोरी पठन |
डिवाइस हैंडल का एकमात्र द्वार ड्राइवर की सेवा कुंजी के अंतर्गत एक रजिस्ट्री कुंजी (AllowedProcessName) में संग्रहीत प्रक्रिया नाम स्ट्रिंग है। यह मान:
अंतर CCommand::Initialize में एक पंक्ति का है:
// 82 KB version (patched) — deliberately clears the pointer:
v3 = MmGetSystemRoutineAddress(L"MmCopyMemory");
if (v3 >= 0) {
*(a1 + 24) = 0; // ← NULLs it — SubCmd 12 is dead
}
// 333 KB version (vulnerable) — stores the pointer:
ptr = MmGetSystemRoutineAddress(L"MmCopyMemory");
if (ptr) {
*(this + 0x18) = ptr; // ← Keeps it — SubCmd 12 works
}
डिफेंडर प्लेटफ़ॉर्म अपडेट पैच किए गए 82 KB संस्करण को drivers\wd\ में डालते दिखते हैं और ImagePath को उस पर इंगित करते हैं, जबकि पुराना 333 KB संस्करण drivers\ में बना रहता है। परीक्षण किए गए सिस्टम पर, पुरानी बाइनरी को कभी नहीं हटाया गया। शोषण बस ImagePath को वापस असुरक्षित संस्करण पर स्विच करता है और सेवा को पुनरारंभ करता है। दोनों बाइनरी माइक्रोसॉफ्ट-हस्ताक्षरित हैं और OS द्वारा विश्वसनीय हैं।
Microsoft का सार्वजनिक दस्तावेज़ीकरण दिखाता है कि KB4052623 Defender प्लेटफ़ॉर्म अपडेट देता है, जिसमें Defender ड्राइवरों का System32\drivers\wd में ऐतिहासिक स्थानांतरण शामिल है, जबकि Windows सर्विसिंग NTFS हार्ड लिंक के माध्यम से WinSxS-समर्थित घटक-स्टोर फ़ाइलों को रखता है और केवल सफाई के दौरान अप्रचलित घटक संस्करणों को हटाता है। परीक्षण किए गए सिस्टम पर, यह बताता है कि नया 82 KB KslD.sys Defender प्लेटफ़ॉर्म-अपडेट पथ के माध्यम से कैसे आ सकता है जबकि पुराना 333 KB System32\drivers\KslD.sys वर्तमान CBS-समर्थित घटक-स्टोर प्रतिलिपि के रूप में तब तक उपस्थित रहा जब तक कि नए CBS संस्करण द्वारा अप्रचलित नहीं कर दिया गया।
माइक्रोसॉफ्ट एक असुरक्षित ड्राइवर ब्लॉकलिस्ट (DriverSiPolicy.p7b) बनाए रखता है जो विशेष रूप से BYOVD हमलों को रोकने के लिए है। यह ब्लॉकलिस्ट HVCI के माध्यम से लागू की जाती है और ज्ञात-असुरक्षित हस्ताक्षरित ड्राइवरों को लोड होने से रोकती है।
माइक्रोसॉफ्ट के अपने दस्तावेज़ीकरण से:
"असुरक्षित ड्राइवर ब्लॉकलिस्ट विंडोज पारिस्थितिकी तंत्र में गैर-माइक्रोसॉफ्ट-विकसित ड्राइवरों के खिलाफ सिस्टम को मजबूत करने में मदद करने के लिए डिज़ाइन की गई है"
माइक्रोसॉफ्ट के अपने ड्राइवर डिज़ाइन द्वारा ब्लॉकलिस्ट से बाहर रखे गए हैं।
मूल कारण सरल है: MmCopyMemory PPL का सम्मान नहीं करता।
PPL (Protected Process Light) LSASS के खिलाफ OpenProcess और ReadProcessMemory कॉल को अवरुद्ध करके क्रेडेंशियल चोरी को रोकने के लिए डिज़ाइन किया गया था। लेकिन PPL केवल यूज़रमोड API पथ की रक्षा करता है। इसका कर्नेल-मोड भौतिक मेमोरी रीड पर कोई अधिकार नहीं है।
KslD.sys यूज़रमोड कोड को MmCopyMemory() — माइक्रोसॉफ्ट का अपना कर्नेल API जो भौतिक या आभासी पते द्वारा मेमोरी कॉपी करता है — तक सीधा रास्ता देता है। ड्राइवर निम्नलिखित करता है:
परिणाम: एक माइक्रोसॉफ्ट-हस्ताक्षरित ड्राइवर बॉक्स से बाहर एक पूर्ण PPL बाईपास प्रदान करता है।
भेद्यता का मूल उप-आदेश 12 है — एक अप्रतिबंधित MmCopyMemory() रैपर:
IOCTL: 0x222044
Input: struct {
DWORD SubCmd; // 12
DWORD Reserved; // 0
QWORD Address; // Target VA or PA
QWORD Size; // Bytes to read
DWORD Flags; // 1 = Physical, 2 = Virtual
DWORD Padding;
}
Output: Raw memory contents (up to Size bytes)
भौतिक रीड (Flags = 1) महत्वपूर्ण प्रिमिटिव है। भौतिक मेमोरी एक्सेस प्रक्रिया सुरक्षा स्तरों, EPROCESS फ़्लैग्स या किसी यूज़रमोड API प्रतिबंधों के अधीन नहीं है, यही PPL को बायपास करता है।
आभासी रीड (Flags = 2) कर्नेल आभासी पतों को सीधे पढ़ता है, जो मैन्युअल पेज टेबल अनुवाद के बिना कर्नेल संरचनाओं (EPROCESS, ntoskrnl निर्यात) को चलने के लिए उपयोगी है।