libsixel — это реализация кодера/декодера SIXEL, созданная на основе Sixel компании kmiya. В версиях 1.8.7 и более ранних при сборке с опцией --with-gdk-pixbuf2 существует уязвимость использования после освобождения в load_with_gdkpixbuf() в loader.c. Путь очистки вручную освобождает объект Sixel_frame_t и его внутренние буферы без учета счетчика ссылок, даже если объект был создан с помощью конструктора с подсчетом ссылок Sixel_frame_new() и открыт для публичного обратного вызова.
Обратный вызов, который вызывает Sixel_frame_ref(frame) для сохранения логически допустимой ссылки, будет удерживать висячий указатель после возврата Sixel_helper_load_image_file(), и любой последующий доступ к кадру или его полям запускает использование после освобождения, подтвержденное AddressSanitizer. Основной причиной является нарушение согласованности между двумя стратегиями очистки в одной и той же базе кода: Sixel_frame_unref() используется в load_with_builtin(), а необработанный free() используется в load_with_gdkpixbuf(). Злоумышленник, предоставляющий созданный образ любому приложению, созданному на основе libsixel с поддержкой gdk-pixbuf2, может надежно инициировать это, что потенциально может привести к раскрытию информации, повреждению памяти или выполнению кода.
Эта проблема исправлена в версии 1.8.7-r1.
Показать оригинальное описание (EN)
libsixel is a SIXEL encoder/decoder implementation derived from kmiya's sixel. In versions 1.8.7 and prior, when built with the --with-gdk-pixbuf2 option, a use-after-free vulnerability exists in load_with_gdkpixbuf() in loader.c. The cleanup path manually frees the sixel_frame_t object and its internal buffers without consulting the reference count, even though the object was created via the refcounted constructor sixel_frame_new() and exposed to the public callback. A callback that calls sixel_frame_ref(frame) to retain a logically valid reference will hold a dangling pointer after sixel_helper_load_image_file() returns, and any subsequent access to the frame or its fields triggers a use-after-free confirmed by AddressSanitizer. The root cause is a consistency failure between two cleanup strategies in the same codebase: sixel_frame_unref() is used in load_with_builtin() but raw free() is used in load_with_gdkpixbuf(). An attacker supplying a crafted image to any application built against libsixel with gdk-pixbuf2 support can trigger this reliably, potentially leading to information disclosure, memory corruption, or code execution. This issue has been fixed in version 1.8.7-r1.
Характеристики атаки
Последствия
Строка CVSS v3.1