
إثبات مفهوم قابل لإعادة الإنتاج لـ CVE-2026-36834 يوضح قراءة مصفوفة خارج الحدود في مفكك Panasonic RW2 في LibRaw، مع سكربت طفرة وإعادة إنتاج الانهيار القائم على المطهر.
توجد قراءة خارج حدود المصفوفة في src/decoders/pana8.cpp. يمكن للدالة GetDBit() إرجاع القيمة 17 عندما لا يتم العثور على تطابق في جدول هوفمان، ولكن المصفوفة huff_coeff[] مُعرَّفة بـ 17 عنصرًا فقط (المؤشرات الصالحة من 0 إلى 16). يؤدي هذا إلى الوصول إلى huff_coeff[17]، مما يسبب سلوكًا غير محدد تم تأكيده بواسطة UBSan وAddressSanitizer.
التطبيقات التي تعالج ملفات RW2 المقدمة من المستخدم، مثل برامج تحرير الصور أو أدوات إدارة الصور التي تستخدم LibRaw، قد تتعطل أو قد تسرّب ذاكرة العملية عند فتح ملف خبيث.
CWE: CWE-125 (قراءة خارج الحدود), CWE-129 (التحقق غير السليم من فهرس المصفوفة) CVSS v3.1: AV:L/AC:L/PR:N/UI:R/S:U/C:L/I:N/A:H (~6.5 متوسط) Git commit: 777f20ae21c611a78021bd051fbbf1e71eae78f2
الملف: src/decoders/pana8.cpp الدالة: pana8_param_t::DecodeC8()
السبب الجذري هو في GetDBit():
uint32_t pana8_param_t::GetDBit(uint64_t a2)
{
for (int i = 0; i < 16; i++)
if ((a2 & hufftable2[i]) == hufftable1[i])
return i;
return uint32_t((hufftable2[16] & a2) == hufftable1[16]) ^ 0x11u;
// When comparison is false: returns 0 ^ 17 = 17
}
ثم يتم استخدام القيمة المرجعة مباشرةً كفهرس مصفوفة دون أي فحص للحدود:
huff_index = int(GetDBit(pixbits)); // can be 17
int32_t v37 = (huff_coeff[huff_index] >> 24) // line 250: OOB
uint32_t hc = huff_coeff[huff_index]; // line 251: OOB
// ... and lines 254, 273
سلسلة الاستدعاء المؤكدة (مخرجات UBSan) LibRaw::unpack() -> panasonicC8_load_raw() pana8.cpp:125 -> pana8_decode_loop() pana8.cpp:132 -> pana8_decode_strip() pana8.cpp:155 -> DecodeC8() pana8.cpp:250 <-- OOB triggered
أخطاء UBSan التي تم إطلاقها: pana8.cpp:250 index 17 out of bounds for type 'unsigned int [17]' pana8.cpp:251 index 17 out of bounds for type 'unsigned int [17]' pana8.cpp:254 index 17 out of bounds for type 'unsigned int [17]' pana8.cpp:254 shift exponent -17 is negative pana8.cpp:273 index 17 out of bounds for type 'unsigned int [17]' pana8.cpp:303 left shift of negative value -1
قم ببناء LibRaw مع sanitizers:
./configure CXXFLAGS="-fsanitize=address,undefined -g -O1" \
LDFLAGS="-fsanitize=address,undefined"
make -j$(nproc)
شغّل سكربت التحوير (mutator) على أي ملف RW2 من باناسونيك:
python3 mutate_rw2.py input.rw2 mutated_pana8.rw2
ASAN_OPTIONS=halt_on_error=0:print_stats=1 ./bin/dcraw_emu -v mutated_pana8.rw2
https://github.com/LibRaw/LibRaw/commit/02da167e0f819a37dbb7d714e87c5b40df6c5917