
CVE-2026-74945 · Divulgation de tas non initialisé via une police web spécialement conçue (sec-high)
Sévérité : haute. CWE 908 et CWE 200. Corrigé dans Firefox 154. Bugzilla 2057808. Atteignable depuis une page web ordinaire via @font-face.
Firefox assainit les polices web via OTS avant utilisation. Trois défauts se combinent pour qu'une police contrefaite transmette à la page du tas de processus non initialisé. Un seul appel measureText le lit environ deux octets à la fois sur une fenêtre de 64 Ko.
Le flux de sortie d'OTS croît avec moz_xrealloc, qui ne remet jamais à zéro la mémoire. Son Seek accepte toute position jusqu'à la taille d'allocation et ne remplit jamais l'écart de zéros. forget dimensionne le tampon à l'offset le plus élevé atteint. Tout écart entre la dernière écriture et un Seek vers l'avant est donc transmis à l'appelant avec l'ancien tas.
Une sous-table cmap de format 14 avec un grand nonDefaultUVSOffset fait avancer le Seek du sérialiseur et laisse l'écart à l'intérieur de la police émise. Une sous-table de format 4 associée, avec un id_range_offset impair sur le dernier segment, est émise telle quelle. La vérification des limites de la recherche de glyphe utilise le reste de la cmap entière plutôt que la sous-table. Un saut dans la région voisine de la sous-table passe.
MapCharToGlyphFormat4 atterrit sur le segment contrefait et renvoie un identifiant de glyphe lu dans l'écart. Son avancement hmtx est directement mesurable depuis le canvas.

pip install fonttools brotli
python3 make_poc_font.py # builds poc.woff
# serve this folder and open poc.html
poc.html affiche la largeur d'avance de U+FFFF à chaque lecture. Chaque valeur suit un identifiant de glyphe lu dans l'écart. Pour voir des octets non initialisés non nuls, utilisez une version MSan ou avec mozjemalloc rempli de déchets. Affecté sous Windows via DWrite et sous macOS via CoreText. OTS s'exécute dans le processus et n'est pas sandboxé.
Une divulgation contrôlable par le web et répétable du tas de processus non initialisé. Elle peut révéler des pointeurs ou des secrets.
Deux changements. L'un ou l'autre rompt la chaîne. Remettre à zéro la plage nouvellement allouée dans le flux de sortie d'OTS. Vérifier la longueur de la sous-table de format 4 afin que la recherche ne puisse pas être bornée par le reste de la cmap. Firefox a intégré les deux.
Abdulaziz Alasaiqah · https://azoz.my/writeups.html