
CVE-2023-21716 माइक्रोसॉफ्ट वर्ड हीप भ्रष्टाचार के लिए अवधारणा का प्रमाण
फरवरी 2023 में, Microsoft ने Microsoft Word में एक गंभीर कमज़ोरी को पैच किया, जिसे CVE-2023-21716 के रूप में पहचाना गया, जिसका CVSS स्कोर 9.8 था, जो हमलावरों को बिना प्रमाणीकरण के रिमोट कोड निष्पादित करने की अनुमति दे सकता था। यह कमज़ोरी Outlook पूर्वावलोकन फलक को भी प्रभावित करती थी, जिसका अर्थ है कि इसे केवल फ़ाइल का पूर्वावलोकन करके ट्रिगर किया जा सकता है। जबकि Microsoft ने एक पैच और एक वर्कअराउंड जारी किया, उन्होंने मुद्दे के बारे में विवरण प्रकट नहीं किया। 6 मार्च को, बग की खोज करने वाले शोधकर्ता (Joshua J.Drake - @jduck) ने Twitter पर एक प्रूफ ऑफ कॉन्सेप्ट (PoC) साझा किया।
CVE-2023-21716 इस तरह से उत्पन्न होता है जैसे Microsoft Word Rich Text Format (RTF) फ़ाइलों को संभालता है, विशेष रूप से \fonttbl नियंत्रण शब्द, जो \f फ़ॉर्मेट का उपयोग करके दस्तावेज़ में फ़ॉन्ट परिभाषित करता है। wwlib.dll के अंदर \fonttbl को हीप के अंदर एक निश्चित मात्रा में स्थान आवंटित किया जाता है (ऐसा इसलिए है क्योंकि हीप आवंटन आमतौर पर गतिशील डेटा के लिए उपयोग किया जाता है, जैसे कि फ़ॉन्ट तालिका जैसी बड़ी संरचनाओं को पार्स करना, जहाँ इनपुट के आधार पर आकार भिन्न हो सकता है)। क्रैश एक बफ़र ओवरफ़्लो के कारण होता है जब फ़ॉन्ट की संख्या सीमा (POC द्वारा 32760 सिद्ध) से अधिक हो जाती है। आवंटित हीप स्थान को ओवररन करने से रिटर्न इंस्ट्रक्शन पॉइंटर (RIP) ओवरराइट हो जाता है, जिससे एप्लिकेशन क्रैश हो जाता है।
उपयोगकर्ताओं को दृढ़ता से सलाह दी जाती है कि वे Microsoft से नवीनतम सुरक्षा पैच स्थापित करें, क्योंकि उन्होंने इस मुद्दे को हल कर दिया है। जो लोग अपग्रेड करने में असमर्थ हैं, उनके लिए Microsoft ने कई वर्कअराउंड भी प्रदान किए हैं, जो यहाँ पाए जा सकते हैं: https://msrc.microsoft.com/update-guide/vulnerability/CVE-2023-21716।
WinDbg का उपयोग करके, हम क्रैश के कारण को समझने के लिए करीब से देख सकते हैं। यहाँ प्रक्रिया है:
WinDbg स्वचालित रूप से तब ब्रेक होगा जब क्रैश होता है, जिससे हम इसका और विश्लेषण कर सकते हैं। शुरू करने के लिए, हम कॉल स्टैक देखने के लिए 'k' टाइप कर सकते हैं:
0:000> k
# ChildEBP RetAddr
00 012f5134 77a5feb5 ntdll!RtlReportCriticalFailure+0x4b
01 012f5170 77a5dda9 ntdll!RtlpReportHeapFailure+0x2f
02 012f5170 77a66220 ntdll!RtlpHpHeapHandleError+0x89
03 012f5188 77a5dab7 ntdll!RtlpLogHeapFailure+0x43
04 012f51ec 779b400d ntdll!RtlpAnalyzeHeapFailure+0x281
05 012f5348 779f806d ntdll!RtlpFreeHeap+0x24d
06 012f53a4 779b3d66 ntdll!RtlpFreeHeapInternal+0x783
07 012f53c4 6ea4aa24 ntdll!RtlFreeHeap+0x46 //ntdll के अंतर्गत दिखाए गए फ़ंक्शन हीप भ्रष्टाचार की त्रुटि प्रबंधन से संबंधित हैं
08 012f53d8 6ea4a9cb mso20win32client!Ordinal1068+0xab
09 012f53e8 6ea4a995 mso20win32client!Ordinal1068+0x52
0a 012f53f4 6cccda52 mso20win32client!Ordinal1068+0x1c
0b 012f5410 03657fea mso!Ordinal1387+0x24
0c 012f5424 03990115 wwlib!PTLS7::FsUpdateFinitePage+0x7e26f //wwlib फ़ॉन्ट तालिका को संभालने के लिए जिम्मेदार है
0d 012f5670 034ea593 wwlib!PTLS7::LsDestroyContext+0x245f90
0e 012f6f5c 033a68ef wwlib!PTLS7::FsUpdateBottomlessPage+0x17494
0f 012f7484 035054ed wwlib!PTLS7::LsAssert+0x2bd1c
10 012f888c 03503d3b wwlib!PTLS7::FsUpdateBottomlessPage+0x323ee
11 012f8910 0400be52 wwlib!PTLS7::FsUpdateBottomlessPage+0x30c3c
12 012f9e9c 0390013a wwlib!wdGetApplicationObject+0xdf8a0
13 012faf48 03ebf20e wwlib!PTLS7::LsDestroyContext+0x1b5fb5
14 012faf90 0410ab2a wwlib!DllCanUnloadNow+0xcc314
15 012fcfe0 03752fb4 wwlib!wdGetApplicationObject+0x1de578
16 012ff538 03385b93 wwlib!PTLS7::LsDestroyContext+0x8e2f
17 012ff578 75e6173b wwlib!PTLS7::LsAssert+0xafc0
18 012ff5a4 75e57eaa USER32!_InternalCallWinProc+0x2b
19 012ff68c 75e57666 USER32!UserCallWinProcCheckWow+0x33a
1a 012ff6c4 75e55e8b USER32!CallWindowProcAorW+0x7f
1b 012ff6dc 7500ae9d USER32!CallWindowProcW+0x1b
.....
.....
हमारी दो प्रमुख लाइब्रेरी wwlib.dll हैं, जो एक कोर वर्ड लाइब्रेरी है जो फ़ॉन्ट, टेक्स्ट और लेआउट जैसी दस्तावेज़ सामग्री का प्रबंधन करती है, और ntdll.dll, जो मेमोरी प्रबंधन और त्रुटि प्रबंधन जैसे निम्न-स्तरीय सिस्टम कार्यों को संभालती है। क्रैश तब होता है जब Word RTF फ़ाइल से बड़ी संख्या में फ़ॉन्ट संसाधित करता है। जैसे ही ntdll.dll पता लगाता है कि Word अमान्य मेमोरी (संभवतः फ़ॉन्ट ओवरफ़्लो के कारण दूषित) तक पहुँचने या मुक्त करने का प्रयास कर रहा है, यह एक हीप भ्रष्टाचार त्रुटि उठाता है, जिससे क्रैश होता है।
गहराई में जाने के लिए हम wwlib लाइब्रेरी के अंतिम भाग में एक ब्रेकपॉइंट रख सकते हैं ताकि यह देख सकें कि हमारे फ़ॉन्ट मेमोरी के अंदर कैसे लोड हो रहे हैं, और समझ सकें कि मुद्दा किसने ट्रिगर किया:
bc * //अन्य सभी ब्रेकपॉइंट हटाएं
bp wwlib!PTLS7::FsUpdateFinitePage+0x7e26f //ब्रेकपॉइंट बनाएं
अब हमें एक एक्सेस वायलेशन मिलता है:
(ba4.1a14): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
eax=004f1ce4 ebx=00000001 ecx=000004e4 edx=ffff7ffc esi=13474fe8 edi=00008002
eip=02b300d5 esp=004f1c3c ebp=004f1c48 iopl=0 nv up ei pl nz na pe nc
cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00210206
wwlib!PTLS7::FsUpdateFinitePage+0x7635a:
02b300d5 66894c5604 mov word ptr [esi+edx*2+4],cx ds:002b:13464fe4=???? //ब्रेक यहाँ हो रहा है
चूंकि हमने प्रोग्राम को पहले रोक दिया, उस बिंदु पर जहां wwlib.dll पहली बार अमान्य मेमोरी (FsUpdateFinitePage में) तक पहुँचने या संशोधित करने का प्रयास कर रहा है, यह हमें प्रारंभिक एक्सेस वायलेशन (जो मेमोरी भ्रष्टाचार का कारण बनता है) देखने देता है, जिससे हमें यह जांचने का मौका मिलता है कि ntdll.dll द्वारा हीप भ्रष्टाचार त्रुटि का पता लगाने से पहले क्या गलत हुआ।
अधिक सटीक होने के लिए, प्रोग्राम wwlib!PTLS7::FsUpdateFinitePage+0x7635a फ़ंक्शन के अंदर mov word ptr [esi+edx2+4],cx निर्देश पर एक एक्सेस वायलेशन (कोड c0000005) के कारण रुका। यह त्रुटि इंगित करती है कि Word ने एक अमान्य मेमोरी स्थान तक पहुँचने का प्रयास किया, विशेष रूप से जब esi+edx2+4 स्थान पर मेमोरी में एक मान (cx) संग्रहीत करने का प्रयास किया गया।
यदि हम ESI रजिस्टर में और देखें, तो हम देख सकते हैं कि इसमें फ़ॉन्ट डेटा है:
लिटिल-एंडियन प्रारूप में प्रत्येक 16-बिट मान (दो बाइट्स) फ़ॉन्ट प्रविष्टि को \fA; प्रारूप में दर्शाता है।
ESI के अंदर दर्शाया गया अंतिम मान f8 7f है जो समाप्ति (29-00 द्वारा प्रतीकित) तक पहुँचने से पहले {\f32760A;} से मेल खाता है।

अब जब फ़ॉन्ट तालिका ESI रजिस्टर द्वारा इंगित मेमोरी स्थान पर लोड हो गई है, इतनी बड़ी संख्या में फ़ॉन्ट संसाधित होने के साथ, गणना की गई मेमोरी स्थान (esi + edx*2 + 4) संभवतः फ़ॉन्ट तालिका के लिए आवंटित मेमोरी से अधिक हो जाती है। इसके परिणामस्वरूप आउट-ऑफ-बाउंड्स राइट होता है, जिससे एक्सेस वायलेशन त्रुटि उत्पन्न होती है। एक्सेस वायलेशन का पता ntdll.dll द्वारा लगाया जाता है, जो मेमोरी प्रबंधन और त्रुटि रिपोर्टिंग को संभालता है। परिणामस्वरूप, ntdll.dll ऐसे फ़ंक्शन लागू करता है जो हीप भ्रष्टाचार का पता लगाते हैं, अंततः एप्लिकेशन को क्रैश करने का कारण बनता है।