SockFuzzer: Фреймворк для фаззинга ядра XNU
Статус проекта
SockFuzzer, изначально задуманный как фаззер, ориентированный на сетевые функции ядра XNU (используемого в macOS и iOS), превратился в комплексный фреймворк для фаззинга ядра. Сохранив своё первоначальное название как дань уважения к истокам, SockFuzzer теперь охватывает широкий спектр подсистем ядра, включая BSD, Mach, виртуальную память и другие. Проект реализует уникальный подход, превращая ядро XNU в библиотеку, которую можно «загрузить» и фаззить в пользовательском пространстве, что позволяет эффективно обнаруживать и воспроизводить уязвимости в различных подсистемах.
Цели проекта
- Всесторонне тестировать ядро XNU в контролируемой среде
- Обнаруживать и воспроизводить уязвимости в различных подсистемах XNU
- Предоставить фреймворк для непрерывного фаззинга и улучшения безопасности XNU
- Продемонстрировать ценность применения передовых методов фаззинга в исследованиях ядра
- Обеспечить эффективное тестирование сложных взаимодействий и подсистем ядра
Обзор архитектуры
SockFuzzer использует архитектуру «хост/гость XNU», в которой ядро XNU компилируется как библиотека и выполняется в специальном пользовательском окружении. Эта архитектура состоит из нескольких ключевых компонентов:
- Среда хоста
- Библиотека гостя XNU
- Пользовательский планировщик (на основе Concurrence)
- Движок фаззинга (Centipede из проекта fuzztest от Google)
- Исполнитель тестов и тестовая обвязка (harness)
Среда хоста
Среда хоста обеспечивает основу для запуска библиотеки гостя XNU и управления процессом фаззинга. Она включает:
- Собственные реализации основных служб ядра
- Интерфейс гипервызовов для связи между хостом и гостем XNU
- Исполнитель тестов и тестовую обвязку для выполнения фазз-тестов
Библиотека гостя XNU
Ядро XNU компилируется как библиотека (libxnu) с минимальными изменениями для работы в пользовательском пространстве. Ключевые аспекты включают:
- Префиксацию и управление символами для избежания конфликтов с символами хоста
- Выборочное раскрытие внутренних функций XNU через version script
- Поддержку нескольких подсистем: BSD, Mach, виртуальная память, потоки, процессы и т.д.
- Слой null pmap для поддержки виртуальной памяти (с планами поддержки ARM pmap в будущем)
Пользовательский планировщик
Основанный на улучшенном проекте Concurrence, пользовательский планировщик теперь поддерживает полные возможности многопоточности:
- Executor: обеспечивает создание, удаление потоков и переключение контекста
- FuzzedScheduler: управляет состояниями потоков и решениями планировщика
- Интеграция с библиотекой гостя XNU для корректной поддержки многопоточности
Исполнитель тестов и тестовая обвязка
Исполнитель тестов и тестовая обвязка управляют выполнением фазз-тестов и обеспечивают:
- Инициализацию среды гостя XNU
- Выполнение фазз-входных данных в различных подсистемах
- Обнаружение и сообщение о сбоях
Ключевые особенности
- Всестороннее покрытие ядра XNU: тестирование нескольких подсистем, включая BSD, Mach, виртуальную память, потоки и процессы
- Выполнение XNU в пользовательском пространстве: запуск компонентов ядра XNU в контролируемом пользовательском окружении
- Полная поддержка многопоточности: использование улучшенного Concurrence для корректных возможностей многопоточности
- Поддержка виртуальной памяти: использование слоя null pmap с планами поддержки ARM pmap
- Фаззинг MIG: поддержка фаззинга интерфейсов Mach Interface Generator (MIG)
- Интерфейс гипервызовов: обеспечение связи между хостом и компонентами гостя XNU
Поддерживаемые функции
- BSD
- Mach
- Виртуальная память (со слоем null pmap)
- Потоки и процессы
- Сеть
- Сообщения Mach
- Интерфейсы MIG
Рабочий процесс
- Ядро XNU компилируется как библиотека с необходимыми изменениями
- Среда хоста инициализирует библиотеку гостя XNU и пользовательский планировщик
- Centipede генерирует структурированные входные данные с использованием protobuf-определений
- Тестовая обвязка выполняет входные данные, вызывая системные вызовы, сообщения Mach и другие интерфейсы ядра
- Пользовательский планировщик управляет выполнением потоков внутри гостя XNU
- ASAN отслеживает проблемы повреждения памяти
- Сбои и информация о покрытии собираются и анализируются
Ограничения и будущие работы
- Поддержка IOKit: текущая реализация не поддерживает подсистемы IOKit
- Фаззинг только бинарных файлов: текущий подход полагается на исходный код, который не включает все модули
Будущие работы включают:
- Реализацию поддержки IOKit
- Интеграцию поддержки ARM pmap для виртуальной памяти
- Адаптацию методов для сценариев фаззинга только бинарных файлов
- Продолжение расширения покрытия и поддержки подсистем XNU
Ограничения публичного выпуска
Для поддержания аккуратной структуры этого репозитория пользователям необходимо самостоятельно добавить несколько зависимостей в third_party, таких как xnu, bootstrap_cmds и некоторые другие библиотеки.