
Null Pointer Dereference в MuPDF , первое CVE, обнаруженное мной
Разыменование нулевого указателя в функции рендеринга EPUB MuPDF 1.26.4
CVE Reference - CVE-2025-55780
Затронутые версии : версия 1.26.7 и более ранние затронуты
Обнаружена и протестирована на : 1.26.4
Серьёзность CVSSv3 : 7.5 (Высокая)
Исправлено в коммите : https://cgit.ghostscript.com/cgi-bin/cgit.cgi/mupdf.git/commit/?id=bdd5d241748807378a78a622388e0312332513c5
Bugzilla : https://bugs.ghostscript.com/show_bug.cgi?id=708720
Место сбоя :-
(1a44.55c0): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
mupdf!break_word_for_overflow_wrap+0x243:
00007ff7`6dbf2a23 8b00 mov eax,dword ptr [rax] ds:00000000`00000000=????????
Исправление :- Исправление разыменования NULL в HTML-макете.
Если у нас есть один узел потока, который слишком велик, чтобы
поместиться в доступную ширину, и мы используем CSS-стиль
"overflow-wrap:break-word", то мы пытаемся разбить узел потока на
более мелкие части, чтобы он мог правильно переноситься.
Для этого мы проходим по тексту узла потока, разбивая его на
кластеры; мы хотим разбивать на уровне кластеров, а не на уровне
символов, чтобы избежать проблем с формированием.
Для текста справа налево кластеры идут в порядке, обратном
ожидаемому, и существующая логика работает неправильно.
Это может привести к тому, что код разбиения ничего не разбивает,
что в свою очередь может привести к тому, что node->next будет
NULL, и мы попытаемся разыменовать NULL.
Исправление заключается в ином разбиении для текста справа налево.
В ходе исследования была обнаружена дополнительная проблема: то,
как мы вызывали harfbuzz, означало, что он не группировал
кластеры так, как мы ожидали. Соответственно, мы расширяем код
здесь, чтобы наш 'string_walker' мог вызывать harfbuzz в
режиме кластеризации по графемам, а не по символам.
Используя это, мы обновляем код для прохода по возвращённым
фрагментам строки, разбивая код в правильной позиции для
требуемого пробела, с осторожностью, чтобы правильно
обрабатывать как текст l2r, так и r2l.