
CVE-2020-1362 का राइटअप
WalletService ने पिछले Patch Tuesday में Elevation of Privilege दोषों को ठीक किया है, इनमें से एक दोष को CVE-2020-1362 नामित किया गया है। यह दोष सेवा में एक सीमा-बाहर (out-of-bound) दोष का लाभ उठाता है। यहाँ हम इसे शोषित करने की अपनी तकनीकें साझा करते हैं।
हमने walletservice.dll में निम्नलिखित फ़ंक्शनों का बाइनरी विश्लेषण किया:
SetGroup फ़ंक्शन ने उपयोगकर्ता-नियंत्रित ऑफ़सेट पर मेमोरी में उपयोगकर्ता-नियंत्रित डेटा लिखा।
signed __int64 __fastcall Wallet::WalletCustomProperty::SetGroup(__int64 this, int a2, int a3, int a4)
{
signed __int64 result; // rax
result = 0i64;
if ( a2 == 1 )
{
if ( a3 & 0xFFFFFFDF )
return 0x80070057i64;
}
else if ( a3 == 0x20 )
{
return 0x80070057i64;
}
if ( a4 == -1 )
{
*(_DWORD *)(this + 8i64 * a2 + 0x74) = 0;
*(_DWORD *)(this + 8i64 * a2 + 0x78) = 0x7FFFFFFF;
}
else
{
*(_DWORD *)(this + 8i64 * a2 + 0x74) = a3;
*(_DWORD *)(this + 8i64 * a2 + 0x78) = a4;
}
return result;
}
हम देख सकते हैं कि फ़ंक्शन उस ऑफ़सेट की सीमा की जाँच नहीं करता जिसे उपयोगकर्ता नियंत्रित कर सकता है। तो यही वह जगह है जहाँ कमजोरी होती है।
अब हम सीमा-बाहर मेमोरी लिख सकते हैं। अवलोकन करके हम पा सकते हैं कि उसी वर्ग में BSTR सेट और प्राप्त करने के लिए एक फ़ंक्शन है:
इसलिए हम oobw के माध्यम से BSTR के सूचक को आसानी से संशोधित कर सकते हैं ताकि किसी भी पते को पढ़ने और लिखने की क्षमता प्राप्त कर सकें।
एक बार हमारे पास WWW (लिखें-क्या-कहाँ) हो जाता है, तो हम RIP को नियंत्रित करने के लिए ढेर पर Wallet::WalletCustomProperty ऑब्जेक्ट्स का vtable लिख सकते हैं। शुरुआत में, हमने इसे सीधे oobw से संशोधित करने का प्रयास किया, लेकिन हमने पाया कि oobw 8 बाइट्स के साथ संरेखित नहीं था। इसलिए हमें दौड़ की स्थिति (race condition) का उपयोग करके vtable अपहरण प्राप्त करने के लिए दो बार लिखना पड़ा। लेकिन इससे शोषण अस्थिर हो सकता है। इससे बचने के लिए कुछ अन्य विधियाँ हैं। लेकिन हमारे POC में हमने ढेर का पता लीक करने के लिए एक अन्य जानकारी लीक कमजोरी (CVE-2020-1361) का उपयोग किया और vtable को सीधे लिखने के लिए www का उपयोग किया। वैसे, हालाँकि CVE-2020-1361 को एक जानकारी लीक कमजोरी के रूप में चिह्नित किया गया है, वास्तव में इसका उपयोग EOP प्राप्त करने के लिए किया जा सकता है। हम भविष्य में इसके लिए एक राइटअप बनाएंगे।
हमें dxgi.dll में ATL::CComObject<CDXGIAdapter>::`vector deleting destructor फ़ंक्शन मिला जो मनमाने फ़ंक्शनों से मनमाना कोड निष्पादन तक जाने में हमारी सहायता करता है। यह फ़ंक्शन loadlibraryEx फ़ंक्शन को कॉल करता है और loadlibraryEx के पहले पैरामीटर के रूप में एक वैश्विक सूचक लेता है। फिर हम एक कस्टम DLL लोड करके मनमाना कोड निष्पादन प्राप्त कर सकते हैं।
एक उदाहरण POC POC निर्देशिका में प्रदान किया गया है।
इस कमजोरी के माध्यम से, हम मीडियम से NT AUTHORITY\system तक विशेषाधिकार उन्नयन प्राप्त कर सकते हैं।
Windows 10.0.18363.815, x64 में परीक्षण

Haoran Qin
Zhiniang Peng (@edwardzpeng) of Qihoo 360
10 अप्रैल 2020: कमजोरियों की सूचना दी गई
21 अप्रैल 2020: MSRC ने जांच की और दोष की पुष्टि की
14 जुलाई 2020: पैच जारी किया गया
17 जुलाई 2020: राइटअप प्रकाशित किया गया