
CVE-2026-74945 · Offenlegung von nicht initialisiertem Heap-Speicher über eine präparierte Webschriftart (sec-high)
Schweregrad: hoch (Sicherheit). CWE 908 und CWE 200. Behoben in Firefox 154. Bugzilla 2057808. Über eine normale Webseite durch @font-face erreichbar.
Firefox bereinigt Webschriftarten vor der Verwendung durch OTS. Drei Fehler greifen ineinander, sodass eine manipulierte Schriftart nicht initialisierten Prozess-Heap an die Seite zurückgibt. Ein einzelner measureText-Aufruf liest ihn über ein 64-KB-Fenster etwa zwei Bytes auf einmal aus.
Der OTS-Ausgabestrom wächst mit moz_xrealloc, das den Speicher nie nullt. Sein Seek akzeptiert jede Position bis zur Allokationsgröße und füllt die Lücke nie mit Nullen. forget dimensioniert den Puffer bis zum höchsten erreichten Offset. Jede Lücke zwischen dem letzten Schreibvorgang und einem Vorwärts-Seek wird daher mit altem Heap-Inhalt an den Aufrufer übergeben.
Eine cmap-Format-14-Untertabelle mit einem großen nonDefaultUVSOffset veranlasst den Serializer, vorwärts zu seeken und die Lücke innerhalb der ausgegebenen Schriftart zu hinterlassen. Eine begleitende Format-4-Untertabelle mit einem ungeraden id_range_offset im letzten Segment wird unverändert ausgegeben. Die Grenzprüfung der Glyphensuche verwendet den Rest der gesamten cmap statt der Untertabelle. Ein Sprung in die benachbarte Untertabellenregion passiert die Prüfung.
MapCharToGlyphFormat4 landet auf dem manipulierten Segment und gibt eine aus der Lücke gelesene Glyphen-ID zurück. Die zugehörige hmtx-Fortschrittsbreite ist direkt von der Canvas aus messbar.

pip install fonttools brotli
python3 make_poc_font.py # builds poc.woff
# serve this folder and open poc.html
poc.html gibt die Fortschrittsbreite von U+FFFF bei jedem Lesevorgang aus. Jeder Wert verfolgt eine aus der Lücke gelesene Glyphen-ID. Um nicht initialisierte Bytes ungleich Null zu sehen, verwenden Sie einen MSan-Build oder einen mit Junk füllenden mozjemalloc-Build. Betroffen sind Windows über DWrite und macOS über CoreText. OTS läuft prozessintern und ist nicht in einer Sandbox.
Eine über das Web steuerbare und wiederholbare Offenlegung von nicht initialisiertem Prozess-Heap. Sie kann Zeiger oder Geheimnisse offenlegen.
Zwei Änderungen. Jede einzelne unterbricht die Kette. Den neu allokierten Bereich im OTS-Ausgabestrom mit Nullen füllen. Die Länge der Format-4-Untertabelle prüfen, damit die Suche nicht gegen den Rest der cmap begrenzen kann. Firefox hat beide Änderungen übernommen.
Abdulaziz Alasaiqah · https://azoz.my/writeups.html