
CVE-2026-74945 · Divulgazione di heap non inizializzato tramite un font web appositamente creato (sec-high)
Gravità di sicurezza: alta. CWE 908 e CWE 200. Corretto in Firefox 154. Bugzilla 2057808. Raggiungibile da una normale pagina web tramite @font-face.
Firefox igienizza i font web tramite OTS prima dell'uso. Tre difetti si allineano così che un font manipolato restituisca alla pagina heap di processo non inizializzato. Una singola chiamata measureText lo legge circa due byte alla volta su una finestra di 64 KB.
Lo stream di output OTS cresce con moz_xrealloc, che non azzera mai la memoria. Il suo Seek accetta qualsiasi posizione fino alla dimensione dell'allocazione e non riempie mai di zeri il vuoto. forget dimensiona il buffer all'offset più alto raggiunto. Qualsiasi vuoto tra l'ultima scrittura e un Seek in avanti viene quindi consegnato al chiamante insieme a vecchio heap.
Una sottotabella cmap in formato 14 con un nonDefaultUVSOffset grande fa avanzare il serializzatore con Seek e lascia il vuoto all'interno del font emesso. Una sottotabella compagna in formato 4 con uno id_range_offset dispari sull'ultimo segmento viene emessa così com'è. Il controllo dei limiti della ricerca dei glifi usa il resto dell'intera cmap piuttosto che la sottotabella. Un salto nella regione della sottotabella adiacente passa.
MapCharToGlyphFormat4 finisce sul segmento manipolato e restituisce un id di glifo letto dal vuoto. Il suo avanzamento hmtx è direttamente misurabile da canvas.

pip install fonttools brotli
python3 make_poc_font.py # builds poc.woff
# serve this folder and open poc.html
poc.html stampa la larghezza di avanzamento di U+FFFF a ogni lettura. Ogni valore traccia un id di glifo letto dal vuoto. Per vedere byte non inizializzati diversi da zero, usa una build MSan oppure una build mozjemalloc con riempimento di spazzatura. Il problema interessa Windows tramite DWrite e macOS tramite CoreText. OTS viene eseguito in-process e non è in sandbox.
Una divulgazione controllabile e ripetibile via web di heap di processo non inizializzato. Può rivelare puntatori o segreti.
Due modifiche. Una qualsiasi delle due spezza la catena. Azzera l'intervallo appena allocato nello stream di output OTS. Controlla la lunghezza della sottotabella in formato 4 così che il controllo dei limiti non possa usare il resto della cmap. Firefox ha implementato entrambe.
Abdulaziz Alasaiqah · https://azoz.my/writeups.html