深刻度: 高。CWE 908 および CWE 200。Firefox 154 で修正。Bugzilla 2057808。通常のWebページから @font-face 経由で到達可能。
Firefox は使用前に Web フォントを OTS でサニタイズします。3 つの欠陥が重なることで、細工されたフォントが未初期化のプロセスヒープをページに返します。単一の measureText 呼び出しで、64 KB のウィンドウにわたって約 2 バイトずつ読み出されます。
OTS の出力ストリームは、メモリをゼロ化しない moz_xrealloc によって拡張されます。その Seek は割り当てサイズまでの任意の位置を受け入れ、ギャップをゼロで埋めることはありません。forget は、到達した最大オフセットにバッファをサイズ調整します。したがって、最後の書き込みと前方への Seek との間のギャップは、古いヒープを保持したまま呼び出し元に渡されます。
大きな nonDefaultUVSOffset を持つ cmap format 14 サブテーブルにより、シリアライザが前方に Seek し、出力されるフォント内にギャップを残します。最後のセグメントに不自然な id_range_offset を持つ付随の format 4 サブテーブルは、そのまま出力されます。グリフルックアップの境界チェックは、サブテーブルではなく cmap 全体の残りを使用します。隣接するサブテーブル領域へのジャンプは通過します。
MapCharToGlyphFormat4 は細工されたセグメントに到達し、ギャップから読み取ったグリフ ID を返します。その hmtx のアドバンスは、canvas から直接測定できます。

pip install fonttools brotli
python3 make_poc_font.py # builds poc.woff
# serve this folder and open poc.html
poc.html は、読み取りのたびに U+FFFF のアドバンス幅を出力します。各値は、ギャップから読み取ったグリフ ID を反映します。ゼロ以外の未初期化バイトを確認するには、MSan またはジャンクを埋め込む mozjemalloc ビルドを使用します。Windows では DWrite 経由、macOS では CoreText 経由で影響を受けます。OTS はプロセス内で実行され、サンドボックス化されていません。
Web から制御可能で繰り返し可能な、未初期化プロセスヒープの開示です。ポインタや秘密情報を露呈させる可能性があります。
2 つの変更。どちらか一方でも連鎖を断ち切ります。OTS 出力ストリームで新しく割り当てられた範囲をゼロで埋めます。format 4 サブテーブルの長さをチェックして、ルックアップが残りの cmap に対して境界判定できないようにします。Firefox は両方を導入しました。
Abdulaziz Alasaiqah · https://azoz.my/writeups.html