
Покрытие-направленный внутрипроцессный фаззер для демона Bluetooth iOS (bluetoothd) с использованием FRIDA, с фаззингом по воздуху для протокола MagicPairing и возможностями воспроизведения сбоев.

ToothPicker — это внутрипроцессный, управляемый покрытием фаззер для iOS. Он был разработан для
целенаправленного анализа демона Bluetooth bluetoothd на iOS и для анализа различных
протоколов Bluetooth на iOS. Поскольку он построен с использованием FRIDA, его можно
адаптировать для любой платформы, поддерживающей FRIDA.
Этот репозиторий также включает эфирный фаззер с примером реализации
для фаззинга протокола MagicPairing от Apple с помощью
InternalBlue. Кроме того, он содержит
скрипт ReplayCrashFile.py, который можно использовать для проверки сбоев, найденных внутрипроцессным
фаззером.
Это очень простой фаззер, который только переворачивает биты и байты в активных соединениях. Никакого управления покрытием, никакой инжекции, но он хорош как демонстрация и поддерживает состояние. Работает только с Python + Frida, никаких модулей или установки не требуется. Протестировано на iOS 13.5–14.3. См. inplace-fuzzer.
Внутрипроцессный фаззер работает «из коробки» на различных версиях iOS (протестировано 13.3–13.7), но необходимо указать символы. Другие версии iOS требуют адаптации адресов функций. Кроме того, похоже, что stalker FRIDA имеет некоторые проблемы с iPhone 8. На более новых iPhone, поддерживающих PAC, производительность значительно страдает из-за подписывания указателей. Таким образом, рекомендуется запускать это на iPhone 7.
ToothPicker построен на кодовой базе
frizzer. Однако он был адаптирован для этого конкретного
применения и поэтому больше не совместим с оригинальной версией.
Существуют планы заменить его в будущем на более специализированный компонент.
На iPhone:
На Linux:
Для Arch-based Linux:
# usbmuxd обычно поставляется с libimobiledevice
# но на всякий случай мы устанавливаем его вручную
sudo pacman -S usbmuxd libimobiledevice python-virtualenv radamsa
# Подключите iPhone к компьютеру
# Разблокируйте его.
# Если появится всплывающее сообщение о сопряжении, нажмите «Доверять»
# Если всплывающее сообщение не появляется:
idevicepair pair
# Теперь должно появиться всплывающее окно, примите его, а затем снова:
idevicepair pair
# В случае ошибок подключения:
sudo systemctl restart usbmuxd
# или повторно выполните сопряжение телефона и компьютера
# Другие полезные команды
# Для SSH-подключения к iPhone:
# Checkra1n поставляется с SSH-сервером, слушающим порт 44
# Перенаправьте SSH-порт телефона на локальный порт 4444:
iproxy 4444 44
# Подключитесь:
ssh root@localhost -p 4444
# Пароль по умолчанию: alpine
# Для получения информации об устройстве:
ideviceinfo
Для Debian Linux:
Почти то же самое, что и выше. Исключения:
radamsa необходимо устанавливать из git-репозитория, так как
он не упакован.iproxy требует дополнительного пакета libusbmuxd-tools.Для macOS:
Команды немного отличаются от настройки Arch Linux...
brew install libimobiledevice usbmuxd radamsa npm
idevicepair pair
npm install frida-compile
pip3 install frida-tools
На macOS PacketLogger, который является частью Additional Tools for Xcode, может декодировать различные пакеты после установки Bluetooth Debug Profile. Кроме того, если открыть журналы сбоев iOS с помощью Xcode, он добавит некоторые символы.
Настройка:
frizzer.frizzer.projects содержит пример проекта для фаззинга протокола MagicPairing.MagicPairing в один файл.harness и установите frida-compile.
Обратите внимание, что это нужно выполнять в этой папке, и его можно установить напрямую от пользователя, выполнив npm install frida-compile.frida-compile ../projects/YOUR_PROJECT/YOUR_SPECIALIZED_HARNESS.JS -o ../projects/YOUR_PROJECT/harness.js.
Поскольку он был установлен в контексте npm, возможно, потребуется выполнить npx frida-compile вместо этого.
Каждый раз, когда изменяется harness, необходимо повторно запускать frida-compile.Фаззинг:
killall -9 bluetoothd, чтобы запустить bluetoothd заново.mkdir crashes) и выполните ../../frizzer/fuzzer.py fuzz -p .Кратко: для запуска нового проекта выполните:
cd harness
npx frida-compile ../projects/YOUR_PROJECT/YOUR_SPECIALIZED_HARNESS.JS -o ../projects/YOUR_PROJECT/harness.js
cd ../projects/YOUR_PROJECT/
mkdir crashes
../../frizzer/fuzzer.py fuzz -p .
Вы можете начать с другого сида, используя frizzer/fuzzer.py fuzz --seed 1234 -p ..
Добавление новых версий iOS:
В настоящее время различные версии iOS определены в bluetoothd.js. Вы можете найти их с помощью инструмента версионирования Ghidra, имея начальную версию со всеми требуемыми символами. Обратите внимание, что некоторые из них не названы в оригинальном бинарном файле iOS, поэтому в идеале начинайте с той, которая уже была аннотирована ранее.
Каждый раз, когда изменяется bluetoothd.js, необходимо повторно запускать frida-compile.
Увеличение ресурсов bluetoothd:
Журналы сбоев iOS хранятся в Settings -> Privacy -> Analytics & Improvements -> Analytics Data.
Если они содержат сбои bluetoothd с шаблоном bluetoothd.cpu_resource-*.ips, это указывает на то, что сбой был вызван превышением ресурсов. Их можно увеличить следующим образом.
На iPhone 7 выполните:
cd /System/Library/LaunchDaemons/
plistutil -i com.apple.jetsamproperties.D10.plist -o com.apple.jetsamproperties.D10.plist.txt
plistutil -i com.apple.jetsamproperties.D101.plist -o com.apple.jetsamproperties.D101.plist.txt
На iPhone SE2 они находятся в com.apple.jetsamproperties.D79.plist:
cd /System/Library/LaunchDaemons/
plistutil -i com.apple.jetsamproperties.D79.plist -o com.apple.jetsamproperties.D79.plist.txt
Найдите bluetoothd, измените приоритет на 19 (самый высокий допустимый приоритет) и установите ограничение памяти на очень большое значение.
Примените те же изменения к обоим файлам.
<dict>
<key>ActiveSoftMemoryLimit</key>
<integer>24000</integer>
<key>InactiveHardMemoryLimit</key>
<integer>24000</integer>
<key>EnablePressuredExit</key>
<false/>
<key>JetsamPriority</key>
<integer>19</integer>
</dict>
Запишите изменения обратно и перезапустите bluetoothd.
plistutil -i com.apple.jetsamproperties.D10.plist.txt -o com.apple.jetsamproperties.D10.plist
plistutil -i com.apple.jetsamproperties.D101.plist.txt -o com.apple.jetsamproperties.D101.plist
killall -9 bluetoothd
Соответственно на iPhone SE2:
plistutil -i com.apple.jetsamproperties.D79.plist.txt -o com.apple.jetsamproperties.D79.plist
killall -9 bluetoothd
Удаление старых журналов:
iOS перестает сохранять журналы сбоев для одной программы после достижения лимита в 25. Если загрузить журнал сбоев
с помощью Xcode (через Simulators&Devices), в стек вызовов добавляются некоторые символы.
После достижения лимита журналы можно удалить либо через Xcode, либо непосредственно на устройстве iOS,
удалив их в папке /var/mobile/Library/Logs/CrashReporter/.
A12+:
Начиная с iPhone XR/Xs, был введен PAC. Это требует вызова sign() для NativeFunction
в FRIDA. Хотя на более старых процессорах это пустая операция, это значительно снижает скорость на новых устройствах, но
необходимо для их работы. Мы заметили, что ToothPicker работает вдвое медленнее при использовании
iPhone SE2 по сравнению с iPhone 7.
Реализация MagicPairing для эфирного фаззера требует установки InternalBlue и
может быть запущена выполнением python MagicPairingFuzzer.py TARGET_BD_ADDR.
Если вы хотите воспроизвести сбои, используйте скрипт ReplayCrashFile.py, который может принять файл сбоя и инициировать эфирное соединение с полезной нагрузкой на основе сбоя.