
ThrottleStop.sys में CVE-2025-7771 के लिए पूर्ण एक्सप्लॉइट चेन, जो Windows पर administrator से SYSTEM तक एस्केलेट करने के लिए अमान्य भौतिक मेमोरी R/W IOCTLs का दुरुपयोग करता है।
TechPowerUp ThrottleStop.sys ड्राइवर (CVE-2025-7771) के लिए पूर्ण proof-of-concept।
एक हस्ताक्षरित, अभी भी लोड होने योग्य कर्नेल ड्राइवर दो IOCTLs के माध्यम से अमान्य भौतिक मेमोरी पढ़ने और
लिखने को उजागर करता है। यह रेपो उस primitive को एक कार्यशील
administrator-to-SYSTEM लोकल प्रिविलेज एस्केलेशन में बदलता है और एक डिवाइस-नामकरण विचित्रता का दस्तावेजीकरण करता है
जो अधिकांश path- और filename-आधारित डिटेक्शन को तोड़ देती है।
उन्हीं IOCTLs के लिए एक PoC पहले से मौजूद था (Credits देखें)। यह एक स्वतंत्र, पूर्ण एक्सप्लॉइट चेन है, न कि केवल एक primitive प्रदर्शन।
| Field | Value |
|---|---|
| SHA256 | 16F83F056177C4EC24C7E99D01CA9D9D6713BD0497EEEDB777A3FFEFA99C97F0 |
| SHA1 | 82ED942A52CDCF120A8919730E00BA37619661A3 |
| MD5 | 6BC8E3505D9F51368DDF323ACB6ABC49 |
| Version | 3.0.0.0 ("Low-Level Driver", 2004-2020) |
| Signer | TechPowerUp LLC, DigiCert EV Code Signing |
| Cert thumbprint | 524EDA9C819321C66E22C7BABEB23DAEAFFB2182 |
| Cert validity | 2019-08-10 to 2022-06-15 |
प्रमाणपत्र 2022 में समाप्त हो गया, लेकिन हस्ताक्षर में एक विश्वसनीय countersignature timestamp है, इसलिए Windows इसे अभी भी लोड करता है। Revocation केवल तभी मदद करता है जब उसकी तारीख हस्ताक्षर समय से पहले हो, जो इस तरह के पुराने ड्राइवरों के लिए शायद ही कभी मामला होता है।
संस्करण संसाधन में कोई CompanyName, OriginalFilename या InternalName नहीं है, इसलिए
फ़ाइल को उसके स्वयं के मेटाडेटा से किसी विक्रेता के लिए जिम्मेदार नहीं ठहराया जा सकता।
दो IOCTLs बिना किसी सीमा या पता सत्यापन के भौतिक मेमोरी पढ़ते और लिखते हैं:
| IOCTL | Operation |
|---|---|
0x80006498 | Physical read |
0x8000649C | Physical write |
दोनों METHOD_BUFFERED हैं, इसलिए कोई user-pointer dereference नहीं है; दोष
caller-supplied भौतिक पते के सत्यापन की कमी है, न कि कोई अनियंत्रित pointer।
ध्यान देने योग्य: write handler 0x8000649C को FILE_READ_ACCESS घोषित किया गया है। एक हैंडल
जो केवल-पढ़ने के लिए खोला गया है, वह अभी भी भौतिक लेखन जारी कर सकता है, इसलिए घोषित access mask
उस कार्य से मेल नहीं खाता जो handler वास्तव में करता है।
डिवाइस खोलने के लिए administrator अधिकारों की आवश्यकता होती है, इसलिए यह अपने आप में एक privilege boundary crossing नहीं है। जो यह पहले से admin होने वाले हमलावर को देता है वह user mode से मनमाना kernel read/write है, जो उन सुरक्षाओं को पराजित करता है जो admin के ऊपर बनी रहनी चाहिए: HVCI code integrity, PPL, और EDR/AV self-protection। क्लासिक bring-your-own- vulnerable-driver।
एक ठोस प्रदर्शन के रूप में, PoC R/W primitive का उपयोग SYSTEM token चुराने और एक SYSTEM shell spawn करने के लिए करता है।
CVSS 4.0: AV:L/AC:H/AT:N/PR:H/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H (8.7, High)।
सब कुछ ड्राइवर के भौतिक R/W IOCTLs के विरुद्ध user mode से चलता है। इसमें कोई page-table walking और कोई CR3 शामिल नहीं है; दोनों प्रक्रियाएँ सीधे भौतिक मेमोरी को स्कैन करके स्थित की जाती हैं:
ImageFileName
System है और UniqueProcessId 4 है। स्कैन firmware के HARDWARE\RESOURCEMAP\...\Physical Memory रजिस्ट्री कुंजी से पढ़ी गई populated RAM रेंजों तक सीमित है,
न कि किसी अनुमानित विंडो तक, इसलिए MMIO holes को कभी नहीं छुआ जाता और स्थापित RAM के ऊपर कुछ भी छूटता नहीं है।Token फ़ील्ड (EPROC_TOKEN) पढ़ें।Token स्लॉट में लिखें। Token
एक _EX_FAST_REF है, इसलिए निम्न reference-count बिट्स डिफ़ॉल्ट रूप से masked हैं (--mask
व्यवहार चुनता है)।cmd.exe spawn करें; whoami लौटाता है।Offsets (EPROC_TOKEN, EPROC_PID, EPROC_IMG_NAME, आदि) एक विशिष्ट build के लिए हैं और
लक्ष्य Windows संस्करण पर dt nt!_EPROCESS के विरुद्ध पुष्टि की जानी चाहिए।
निष्पादन योग्य नाम मायने रखता है। चरण 3 हमारी स्वयं की प्रक्रिया को भौतिक मेमोरी में उसके
ImageFileName से मिलाकर स्थित करता है, और वह फ़ील्ड 15 वर्णों तक सीमित है जिसमें स्कैन पहले 8 से मेल खाता है। संकलित नाम को छोटा और विशिष्ट रखें; यदि आप बाइनरी का नाम बदलते हैं, तो उस सीमा के भीतर रहें अन्यथा self-scan प्रक्रिया को नहीं ढूँढ पाएगा।
ड्राइवर एक निश्चित डिवाइस नाम का उपयोग नहीं करता। यह डिवाइस ऑब्जेक्ट नाम को उस
service name से प्राप्त करता है जिसके अंतर्गत यह पंजीकृत है; डिस्क पर फ़ाइल नाम अप्रासंगिक है। बाइनरी को service TRIXX के अंतर्गत पंजीकृत करने पर \\.\TRIXX उत्पन्न होता है, चाहे डिस्क पर फ़ाइल का नाम कुछ भी हो।
इसलिए \Device\ThrottleStop या ThrottleStop.sys पर आधारित कोई भी डिटेक्शन तुच्छ रूप से
बायपास हो जाता है। डिटेक्शन फ़ाइल hash या हस्ताक्षर प्रमाणपत्र पर आधारित होना चाहिए:
SHA256: 16F83F056177C4EC24C7E99D01CA9D9D6713BD0497EEEDB777A3FFEFA99C97F0
Thumbprint: 524EDA9C819321C66E22C7BABEB23DAEAFFB2182
Subject: CN=TechPowerUp LLC, O=TechPowerUp LLC, L=Spokane, S=Washington, C=US
स्रोत में DEVICE_NAMES सूची केवल ज्ञात उत्पाद इंस्टॉल के लिए एक probe है। आपके द्वारा स्वयं पंजीकृत service को लक्षित करने के लिए एक डिवाइस नाम argument के रूप में पास करें।
| CVE | Driver |
|---|---|
| CVE-2019-7245 | GPU-Z.sys |
| CVE-2025-5324 | GPU-Z.sys |
| CVE-2025-7771 | ThrottleStop.sys (this repo) |
बाइनरी यहाँ शिप नहीं की गई है। किसी भी प्रति को ऊपर दिए SHA256 के विरुद्ध सत्यापित करें। नमूना LOLDrivers में सूचीबद्ध है।
cl /nologo /EHsc /W4 /O2 src\ThrottleStop.cpp /Fe:myLittleLpe.exe /link advapi32.lib
केवल प्रयोगशाला उपयोग के लिए। एक पृथक VM के भीतर चलाएँ जिसमें वापस roll back करने के लिए snapshot हो।
sc.exe create <name> type= kernel binPath= C:\path\to\ThrottleStop.sys
sc.exe start <name>
myLittleLpe.exe
sc.exe stop <name>
sc.exe delete <name>
बाइनरी कोई arguments नहीं लेती। यह भौतिक मेमोरी मैप प्रिंट करती है, SYSTEM
और स्थानीय EPROCESS के लिए स्कैन करती है, token बदलती है, और NT AUTHORITY\SYSTEM के रूप में चलने वाला cmd.exe spawn करती है।

उसी ड्राइवर पर अन्य सार्वजनिक कार्य, तुलना के लिए:
रक्षात्मक अनुसंधान और डिटेक्शन इंजीनियरिंग के लिए प्रकाशित। भेद्यता पहले से ही CVE-2025-7771 के रूप में सार्वजनिक है। यहाँ सब कुछ लेखक के स्वामित्व वाले सिस्टम पर परीक्षण किया गया था। इसे उन सिस्टमों के विरुद्ध न चलाएँ जिनके आप स्वामी नहीं हैं या जिनका परीक्षण करने के लिए आप अधिकृत नहीं हैं।
NT AUTHORITY\SYSTEM