
CVE-2026-74945 · Divulgación de heap sin inicializar mediante una fuente web manipulada (sec-high)
Severidad alta (seguridad). CWE 908 y CWE 200. Corregido en Firefox 154. Bugzilla 2057808. Alcanzable desde una página web ordinaria mediante @font-face.
Firefox sanea las fuentes web mediante OTS antes de usarlas. Tres defectos se alinean para que una fuente manipulada entregue montón de proceso no inicializado de vuelta a la página. Una única llamada a measureText lo lee aproximadamente dos bytes a la vez en una ventana de 64 KB.
El flujo de salida de OTS crece con moz_xrealloc, que nunca pone a cero la memoria. Su Seek acepta cualquier posición hasta el tamaño de la asignación y nunca rellena el hueco con ceros. forget dimensiona el búfer hasta el mayor desplazamiento alcanzado. Cualquier hueco entre la última escritura y un Seek hacia adelante se entrega a la persona que llama con montón antiguo.
Una subtabla cmap de formato 14 con un nonDefaultUVSOffset grande hace que el serializador avance con Seek y deje el hueco dentro de la fuente emitida. Una subtabla complementaria de formato 4 con un id_range_offset impar en el último segmento se emite literalmente. La comprobación de límites de la búsqueda de glifos usa el resto de la cmap completa en lugar de la subtabla. Un salto a la región de la subtabla vecina pasa.
MapCharToGlyphFormat4 aterriza en el segmento manipulado y devuelve un id de glifo leído del hueco. Su avance hmtx se puede medir directamente desde canvas.

pip install fonttools brotli
python3 make_poc_font.py # builds poc.woff
# serve this folder and open poc.html
poc.html imprime el ancho de avance de U+FFFF en cada lectura. Cada valor sigue un id de glifo leído del hueco. Para ver bytes no inicializados distintos de cero, usa una compilación de mozjemalloc con MSan o relleno de basura. Afecta a Windows a través de DWrite y a macOS a través de CoreText. OTS se ejecuta dentro del proceso y no está aislado.
Una divulgación controlable y repetible desde la web de montón de proceso no inicializado. Puede revelar punteros o secretos.
Dos cambios. Cualquiera de ellos rompe la cadena. Pon a cero el rango recién asignado en el flujo de salida de OTS. Comprueba la longitud de la subtabla de formato 4 para que la búsqueda no pueda acotar contra el resto de la cmap. Firefox incorporó ambos.
Abdulaziz Alasaiqah · https://azoz.my/writeups.html