
CVE-2026-74945 · 조작된 웹 폰트를 통한 초기화되지 않은 힙 정보 노출 (sec-high)
보안 심각도: 높음. CWE 908 및 CWE 200. Firefox 154에서 수정됨. Bugzilla 2057808. 일반 웹 페이지에서 @font-face를 통해 도달 가능.
Firefox는 사용 전에 OTS를 통해 웹 폰트를 정화합니다. 세 가지 결함이 결합되어 조작된 폰트가 초기화되지 않은 프로세스 힙을 페이지에 넘겨줍니다. 단 한 번의 measureText 호출로 64KB 윈도우에 대해 대략 두 바이트씩 읽어냅니다.
OTS 출력 스트림은 메모리를 0으로 초기화하지 않는 moz_xrealloc로 증가합니다. 그 Seek는 할당 크기까지의 모든 위치를 허용하며 그 사이의 공백을 0으로 채우지 않습니다. forget는 버퍼를 도달한 가장 높은 오프셋으로 크기를 조정합니다. 따라서 마지막 쓰기와 앞으로의 Seek 사이의 공백은 이전 힙 데이터를 담은 채 호출자에게 전달됩니다.
큰 nonDefaultUVSOffset를 가진 cmap format 14 서브테이블은 직렬화기가 앞으로 Seek하게 하여 생성된 폰트 내부에 공백을 남깁니다. 마지막 세그먼트에 이상한 id_range_offset를 가진 동반 format 4 서브테이블은 그대로 내보내집니다. 글리프 조회 경계 검사는 서브테이블이 아닌 전체 cmap의 나머지를 사용합니다. 인접한 서브테이블 영역으로의 점프가 통과합니다.
MapCharToGlyphFormat4는 조작된 세그먼트에 도달하여 공백에서 읽은 글리프 ID를 반환합니다. 그 hmtx 전진(advance)은 캔버스에서 직접 측정할 수 있습니다.

pip install fonttools brotli
python3 make_poc_font.py # builds poc.woff
# serve this folder and open poc.html
poc.html은 각 읽기에서 U+FFFF의 전진 너비(advance width)를 출력합니다. 각 값은 공백에서 읽은 글리프 ID를 추적합니다. 0이 아닌 초기화되지 않은 바이트를 보려면 MSan 또는 정크(junk)로 채우는 mozjemalloc 빌드를 사용하십시오. Windows에서는 DWrite를 통해, macOS에서는 CoreText를 통해 영향을 받습니다. OTS는 프로세스 내에서 실행되며 샌드박스 처리되지 않습니다.
웹에서 제어 가능하고 반복 가능한 초기화되지 않은 프로세스 힙 정보 노출입니다. 포인터나 비밀 정보를 드러낼 수 있습니다.
두 가지 변경 사항. 둘 중 하나만으로도 공격 체인이 끊깁니다. OTS 출력 스트림에서 새로 할당된 범위를 0으로 채웁니다. format 4 서브테이블 길이를 확인하여 조회가 나머지 cmap에 대해 경계를 벗어나지 못하게 합니다. Firefox는 두 가지를 모두 적용했습니다.
Abdulaziz Alasaiqah · https://azoz.my/writeups.html