Proof-of-concept приложение для перезаписи шрифтов на iOS с помощью CVE-2022-46689.
Работает на iOS 16.1.2 и ниже (протестировано на iOS 16.1) на устройствах без джейлбрейка.
IPA доступен в разделе Releases.
Включенные шрифты:
- DejaVu Sans Condensed
- DejaVu Serif
- DejaVu Sans Mono
- Go Regular
- Go Mono
- Fira Sans
- Segoe UI
- Comic Sans MS
- Choco Cooky
Вы также можете импортировать пользовательские шрифты, портированные для iOS.
Скриншоты
DejaVu Sans Condensed | DejaVu Serif | DejaVu Sans Mono | Choco Cooky

Go Regular | Go Mono | Segoe UI | Comic Sans MS

Hanna Soft + JoyPixels | Bronkoh | Noto Serif SC | Fira Sans

Автор скриншота: @ev_ynw за портированные шрифты Hanna Soft и Bronkoh, JoyPixels за шрифт эмодзи
Где найти портированные шрифты
Известные проблемы
- Встроенные шрифты портированы некорректно (я не умею портировать шрифты). Для наилучшего результата используйте пользовательский шрифт.
- со встроенными шрифтами:
- Только обычный текст использует изменённый шрифт: тонкий/средний/жирный текст вместо этого использует Helvetica.
- Если шрифт вообще не отображается, отключите «Жирный текст» в настройках доступности.
- Средства выбора файлов в приложениях не откроются с ошибкой «Something went wrong while displaying documents».
- Это происходит, если вы заменяете шрифт эмодзи или устанавливаете шрифты с несколькими начертаниями
- Попробуйте экспериментальное исправление .ttc, используя «Import custom with fix for .ttc»
- Устройства на iOS 14.x, которые имеют джейлбрейк или были взломаны ранее, не смогут вернуться к исходному шрифту.
- Обходной путь: не используйте это приложение, если у вас iOS 14.x и вы ранее делали джейлбрейк. Вместо этого просто сделайте джейлбрейк и замените шрифты обычным способом.
Конвертация шрифтов
Проблема CVE-2022-46689, насколько я знаю, позволяет перезаписать только 16383 байта из каждых 16384: последний байт страницы записать нельзя.
(Могу ошибаться)
Чтобы обойти это, я упаковываю шрифт в веб-формат WOFF2, который поддерживается на iOS. WOFF2 использует Brotli для сжатия, что позволяет мне вставлять отступы, чтобы пропустить последний байт.
Подробности см. в repackfonts/make_woff2src.sh: этот скрипт:
- переименовывает шрифт в .SFUI-Regular с помощью TTX согласно этому ответу
- пересобирает шрифт в .woff2
- запускает
repackfonts/BrotliPadding.swift для распаковки WOFF2-файла и вставки отступов, чтобы пропустить 16384-й байт
Благодарности
- Ian Beer из Project Zero за обнаружение CVE-2022-46689.
- Apple за тестовый пример и патч. (Я ничего не менял: я только обернул тестовый пример в библиотеку.)
- Все в Twitter, кто помогал и экспериментировал с CVE-2022-46689, особенно @dedbeddedbed, @AppleDry05 и @haxi0sm за исследование возможностей этой проблемы..
- WOFF2 compressor от Google
- ttcpad от LIJI32
- Fontforge stripttc
- Шрифты DejaVu распространяются в соответствии с их лицензией.
- Шрифты Go распространяются в соответствии с их лицензией.
- Шрифт Fira Sans сконвертирован @jonpalmisc — спасибо!
- Segoe UI и Comic Sans MS являются собственностью Microsoft.
- Choco Cooky является собственностью Samsung.
- У меня нет прав на их распространение, но я всё равно их выкладываю, потому что #yolo.