
Déréférencement de pointeur nul dans MuPDF , Première CVE découverte par moi
Déréférencement de pointeur nul dans la fonction de rendu EPUB de MuPDF 1.26.4
Référence CVE - CVE-2025-55780
Versions affectées : 1.26.7 et versions antérieures
Découvert et testé sur : 1.26.4
Score de sévérité CVSSv3 : 7.5 ( Élevé )
Corrigé dans le commit : https://cgit.ghostscript.com/cgi-bin/cgit.cgi/mupdf.git/commit/?id=bdd5d241748807378a78a622388e0312332513c5
Bugzilla : https://bugs.ghostscript.com/show_bug.cgi?id=708720
Emplacement du crash :-
(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=????????
Correctif :- Correction de la déréférence NULL dans la mise en page HTML.
Si nous avons un nœud de flux unique trop grand pour tenir dans la
largeur disponible, et que nous utilisons le style CSS « overflow-wrap:break-word »,
nous tentons alors de découper le nœud de flux en morceaux plus petits
afin qu'il puisse effectuer correctement un retour à la ligne.
Pour ce faire, nous parcourons le texte du nœud de flux pour le découper en clusters ;
nous voulons couper au niveau du cluster plutôt qu'au niveau du caractère afin
d'éviter les problèmes de mise en forme.
Pour le texte de droite à gauche, les clusters arrivent dans l'ordre inverse
de celui attendu et la logique existante se trompe.
Cela peut conduire le code de découpage à ne rien découper du tout,
ce qui peut à son tour conduire à ce que node->next soit NULL, et à une
tentative de déréférencement de NULL.
Le correctif consiste à découper différemment le texte de droite à gauche.
En enquêtant sur ce problème, un problème supplémentaire a été repéré :
la façon dont nous appelions harfbuzz faisait qu'il ne regroupait pas
les clusters comme nous l'attendions. En conséquence, nous étendons
le code ici afin que notre « string_walker » puisse appeler harfbuzz
en mode cluster « grapheme » plutôt qu'en mode cluster « character ».
En utilisant cela, nous mettons ensuite à jour le code pour parcourir les fragments
retournés de la chaîne, en effectuant la coupure à la position correcte
en fonction de l'espace requis, en prenant soin de gérer correctement les textes l2r et
r2l.