
قراءة خارج الحدود في html2xhtml : CVE-2022-44311
تم اكتشاف أن Html2xhtml v1.3 يحتوي على قراءة خارج الحدود في الدالة static void elm_close(tree_node_t *nodo) في procesador.c. تسمح هذه الثغرة للمهاجمين بالوصول إلى ملفات حساسة أو التسبب في رفض الخدمة (DoS) عبر ملف html معدّ بعناية.
CWE-125 قراءة خارج الحدود هي نوع من أخطاء البرمجيات التي يمكن أن تحدث عند قراءة البيانات من الذاكرة. يمكن أن يحدث ذلك إذا حاول البرنامج القراءة بعد نهاية مصفوفة (Array) على سبيل المثال. يمكن أن تؤدي القراءات خارج الحدود إلى تعطل البرنامج أو ثغرات أخرى غير متوقعة، وقد تسمح للمهاجم بقراءة معلومات حساسة لا ينبغي أن يكون لديه حق الوصول إليها.
html2xhtml/src/procesador.c. (GHSA-28fm-qh2h-3mch)Html2xhtml هي أداة سطر أوامر تحوّل ملفات HTML إلى ملفات XHTML. يمكن لـ Html2xhtml توليد مخرجات XHTML متوافقة مع أحد أنواع المستندات التالية: XHTML 1.0 (Transitional وStrict وFrameset)، وXHTML 1.1، وXHTML Basic، وXHTML Mobile Profile.
تم اكتشاف الثغرة بسبب خطأ تجزئة حدث عند استخدام خيار -t frameset. إن خطأ التجزئة أو segfault هو نوع محدد من الأخطاء يحدث بسبب الوصول إلى ذاكرة لا تخصك. وهي آلية مساعدة تمنعك من إفساد الذاكرة وإدخال أخطاء ذاكرة يصعب تصحيحها.
باستخدام Valgrind، وهي أداة لاكتشاف أخطاء الوصول إلى ذاكرة الكومة (الذاكرة المخصصة ديناميكيًا عبر new أو malloc) في برامج C وC++، تم تتبع خطأ التجزئة وتصحيحه، وأبلغت الأداة عن invalid read of size 4 في حالة الاختبار:
==1040381== Memcheck, a memory error detector
==1040381== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==1040381== Using Valgrind-3.18.1 and LibVEX; rerun with -h for copyright info
==1040381== Command: ./src/html2xhtml -t frameset report/vuln/id:000000,sig:11,src:001386+001369,time:12081510,execs:2336913,op:splice,rep:16
==1040381==
==1040381== Invalid read of size 4
==1040381== at 0x40E911: elm_close (procesador.c:944)
==1040381== by 0x410617: err_html_struct (procesador.c:1889)
==1040381== by 0x40F20A: err_content_invalid (procesador.c:0)
==1040381== by 0x40F20A: elm_close (procesador.c:959)
==1040381== by 0x40E7C4: saxEndDocument (procesador.c:233)
==1040381== by 0x40DF7A: main (html2xhtml.c:117)
==1040381== Address 0x6f20d4 is not stack'd, malloc'd or (recently) free'd
==1040381==
==1040381==
==1040381== Process terminating with default action of signal 11 (SIGSEGV)
==1040381== Access not within mapped region at address 0x6F20D4
==1040381== at 0x40E911: elm_close (procesador.c:944)
==1040381== by 0x410617: err_html_struct (procesador.c:1889)
==1040381== by 0x40F20A: err_content_invalid (procesador.c:0)
==1040381== by 0x40F20A: elm_close (procesador.c:959)
==1040381== by 0x40E7C4: saxEndDocument (procesador.c:233)
==1040381== by 0x40DF7A: main (html2xhtml.c:117)
==1040381== If you believe this happened as a result of a stack
==1040381== overflow in your program's main thread (unlikely but
==1040381== possible), you can try to increase the size of the
==1040381== main thread stack using the --main-stacksize= flag.
==1040381== The main thread stack size used in this run was 8388608.
==1040381==
==1040381== HEAP SUMMARY:
==1040381== in use at exit: 88,190 bytes in 13 blocks
==1040381== total heap usage: 22 allocs, 9 frees, 2,218,413 bytes allocated
==1040381==
==1040381== LEAK SUMMARY:
==1040381== definitely lost: 0 bytes in 0 blocks
==1040381== indirectly lost: 0 bytes in 0 blocks
==1040381== possibly lost: 0 bytes in 0 blocks
==1040381== still reachable: 88,190 bytes in 13 blocks
==1040381== suppressed: 0 bytes in 0 blocks
==1040381== Rerun with --leak-check=full to see details of leaked memory
==1040381==
==1040381== For lists of detected and suppressed errors, rerun with: -s
==1040381== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
==1040419== Memcheck, a memory error detector
قادنا سجل الأخطاء من Valgrind إلى الدالة التالية حيث حدث خطأ التجزئة:

تم اكتشاف أن الدالة تفتقد إلى فحص النوع. كان المستخدم يمرر عقدة من النوع comment بدلاً من element إلى الدالة، ويؤدي هذا إلى خطأ قراءة خارج الحدود. يمكن للمستخدم تقديم مستند تالف البنية بقيمة ELM_PTR(nodo).contenttype[doctype] غير صالحة، مما ينتج عنه المقارنة التالية في لغة التجميع:
cmp dword ptr [rbp + rax*4 + 0xc], 4
يمكن استغلال هذه الثغرة من قبل المهاجمين لقراءة ملفات أو ذاكرة أو مواقع حساسة باستخدام ملف معدّل.
| الخطورة | عالية 8.1 / 10 |
|---|
| تعقيد الهجوم | منخفضة |
| الصلاحيات المطلوبة | لا شيء |
| تفاعل المستخدم | مطلوب |
| النطاق | غير متغير |
| السرية | عالية |
| السلامة | لا شيء |
| التوفر | عالية |