
Этот инструмент вычисляет сложную каноническую гистограмму Хаффмана для CVE-2023-4863.
Этот инструмент вычисляет хитрую каноническую гистограмму Хаффмана, которая способна вызвать внеполосную (OOB) запись для уязвимой библиотеки libwebp (т.е. libwebp <= 1.3.1). Эта уязвимость известна как CVE-2023-4863 или CVE-2023-41064. Мы можем переполнить предварительно выделенную таблицу Хаффмана максимум на 132 записи.
Обоснование: libwebp предполагает, что гистограмма Хаффмана, содержащаяся в каждом изображении webp, имеет правильный формат. То есть дерево декодирования должно быть полным деревом. Исходя из этого предположения, группа libwebp использовала инструмент enough для оценки максимального размера памяти, необходимого для построения таблицы декодирования Хаффмана (мощной структуры для быстрого декодирования канонических кодов Хаффмана). Однако хакеры могут построить неполное дерево, чтобы выйти за этот лимит памяти и тем самым переполнить предварительно выделенную память.
Этот инструмент для взлома был создан путем модификации enough с поддержкой неполных деревьев.
Скомпилируйте код с помощью команды ниже:
gcc -o NotEnough ./main.c
Для таблицы Хаффмана с 40 символами, 8-битной корневой таблицей и максимальной глубиной 15 максимальное количество записей таблицы равно 410. Однако, построив неполное дерево, количество записей таблицы может достигать 542. Попробуйте команду ниже:
./NotEnough 40 8 15
Пример такого дерева показан ниже:
Обратите внимание, что для краткости мы обрезали ветви без листьев.
Затем вы можете использовать инструмент craft для создания эффективного изображения webp, чтобы переполнить инструмент dwebp (версия <= 1.3.1). Соответствующим образом измените гистограмму кода Хаффмана code_lengths_counts[4] на {0, 1, 0, 0, 0, 0, 0, 0, 0, 3, 5, 9, 17, 1, 1, 3} и пересоберите инструмент:
vim craft.c # Change huffman code histogram accordingly, i.e. about line 495.
gcc -o craft craft.c
./craft -o bad_542.webp
Пожалуйста, ознакомьтесь с блогом @benhawkes, чтобы лучше понять CVE-2023-4863.