
Samsung libimagecodec.quram.so OOB Write PoC
Этот репозиторий содержит концептуальные 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 (Image File Directory) WINKJ_ReadExifField (смещение 0x13a0a8 в 64-битном бинарном файле). Эта функция обрабатывает отдельные записи IFD TIFF/EXIF, каждая из которых представляет собой 12-байтовую структуру:
Смещение Размер Поле
------ ---- -----
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, 4-байтовое поле Value рассматривается как смещение в файле (указывающее на фактические данные). Затем код выполняет проверку границ по адресу 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 |
# Генерация PoC для TIFF
python3 cve-2026-21045_tiff_oob_poc.py -o payload.tif
# Генерация PoC для DNG
python3 cve-2026-21048_dng_oob_poc.py -o payload.dng
# Передача на устройство и запуск (например, через Галерею/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 Gallery (или любом приложении, использующем декодер Quram) должно вызвать повреждение кучи, что потенциально может привести к:
На исправленном устройстве (SMR Jul-2026+) изображение должно либо быть отклонено как недействительное, либо обработано безопасно. Сбой на полностью исправленном устройстве может указывать на отдельную неисправленную проблему.
Файл: libimagecodec.quram.so (64‑битный)
SHA256: (проверьте по своей копии)
NDK: r23c (Android 21)
Собран: 2021-12-31 (заглушка)
Soname: libimagecodec.quram.so
Извлечено из WINKJ_ReadExifField:
Все типы с element_size = 1 (BYTE, ASCII, UNDEFINED) используют один и тот же обработчик и одинаково уязвимы для обхода целочисленного переполнения.
Эти PoC предоставлены исключительно для образовательных целей и исследований в области безопасности. Они демонстрируют механизм уязвимости, чтобы помочь пользователям и разработчикам понять риск. Не используйте их против систем, которыми вы не владеете или на тестирование которых у вас нет явного разрешения.
| Поле | Значение (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 байт за границей | ❌ 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 |