SockFuzzer: Marco de Fuzzing del Kernel XNU
Estado del Proyecto
SockFuzzer, diseñado originalmente como un fuzzer centrado en redes para el kernel XNU (utilizado en macOS e iOS), ha evolucionado hasta convertirse en un marco integral de fuzzing del kernel. Aunque conserva su nombre original como guiño a sus orígenes, SockFuzzer ahora cubre una amplia gama de subsistemas del kernel, incluidos BSD, Mach, memoria virtual y más. El proyecto implementa un enfoque único al convertir el kernel XNU en una biblioteca que puede "arrancarse" y someterse a fuzzing en el espacio de usuario, lo que permite el descubrimiento y la reproducción eficiente de vulnerabilidades en múltiples subsistemas.
Objetivos del Proyecto
- Probar de forma exhaustiva el kernel XNU en un entorno controlado
- Descubrir y reproducir vulnerabilidades en diversos subsistemas de XNU
- Proporcionar un marco para el fuzzing continuo y la mejora de la seguridad de XNU
- Demostrar el valor de implementar técnicas avanzadas de fuzzing en la investigación del kernel
- Permitir la prueba eficiente de interacciones y subsistemas complejos del kernel
Descripción General de la Arquitectura
SockFuzzer emplea un diseño de anfitrión/"invitado XNU", en el que el kernel XNU se compila como una biblioteca y se ejecuta dentro de un entorno personalizado en el espacio de usuario. Esta arquitectura consta de varios componentes clave:
- Entorno anfitrión
- Biblioteca invitada de XNU
- Planificador personalizado (basado en Concurrence)
- Motor de fuzzing (Centipede del proyecto fuzztest de Google)
- Ejecutor de pruebas y arnés
Entorno Anfitrión
El entorno anfitrión proporciona la base para ejecutar la biblioteca invitada de XNU y gestionar el proceso de fuzzing. Incluye:
- Implementaciones personalizadas de los servicios principales del kernel
- Interfaz de hiperllamada para la comunicación entre el anfitrión y el invitado XNU
- Ejecutor de pruebas y arnés para ejecutar pruebas de fuzzing
Biblioteca Invitada de XNU
El kernel XNU se compila como una biblioteca (libxnu) con modificaciones mínimas para ejecutarse en el espacio de usuario. Los aspectos clave incluyen:
- Prefijado y gestión de símbolos para evitar conflictos con los símbolos del anfitrión
- Exposición selectiva de funciones internas de XNU mediante un script de versiones
- Soporte para múltiples subsistemas: BSD, Mach, memoria virtual, hilos, procesos, etc.
- Capa pmap nula para el soporte de memoria virtual (con planes de admitir ARM pmap en el futuro)
Planificador Personalizado
Basado en el proyecto Concurrence mejorado, el planificador personalizado ahora admite capacidades completas de subprocesos:
- Executor: proporciona la creación, eliminación y el cambio de contexto de hilos
- FuzzedScheduler: gestiona los estados de los hilos y las decisiones de planificación
- Integración con la biblioteca invitada de XNU para un soporte adecuado de multihilo
Ejecutor de Pruebas y Arnés
El ejecutor de pruebas y el arnés gestionan la ejecución de las pruebas de fuzzing y proporcionan:
- Inicialización del entorno invitado de XNU
- Ejecución de entradas de fuzzing en varios subsistemas
- Detección y notificación de fallos
Características Principales
- Cobertura integral del kernel XNU: probar múltiples subsistemas, incluidos BSD, Mach, memoria virtual, hilos y procesos
- Ejecución de XNU en el espacio de usuario: ejecutar componentes del kernel XNU en un entorno controlado de espacio de usuario
- Soporte completo de subprocesos: aprovechar el Concurrence mejorado para capacidades multihilo adecuadas
- Soporte de memoria virtual: utilizar una capa pmap nula con planes de soporte para ARM pmap
- Fuzzing de MIG: soporte para el fuzzing de interfaces del Generador de Interfaces de Mach (MIG)
- Interfaz de hiperllamada: facilitar la comunicación entre el anfitrión y los componentes invitados de XNU
Características Soportadas
- BSD
- Mach
- Memoria virtual (con capa pmap nula)
- Hilos y procesos
- Redes
- Mensajes de Mach
- Interfaces de MIG
Flujo de Trabajo
- El kernel XNU se compila como una biblioteca con las modificaciones necesarias
- El entorno anfitrión inicializa la biblioteca invitada de XNU y el planificador personalizado
- Centipede genera entradas estructuradas utilizando definiciones de protobuf
- El arnés de pruebas ejecuta las entradas, invocando syscalls, mensajes de Mach y otras interfaces del kernel
- El planificador personalizado gestiona la ejecución de hilos dentro del invitado XNU
- ASAN supervisa los problemas de corrupción de memoria
- Se recopilan y analizan los fallos y la información de cobertura
Limitaciones y Trabajo Futuro
- Soporte de IOKit: la implementación actual no admite los subsistemas de IOKit
- Fuzzing solo binario: el enfoque actual se basa en el código fuente, que no incluye todos los módulos
El trabajo futuro incluye:
- Implementar el soporte de IOKit
- Integrar el soporte de ARM pmap para la memoria virtual
- Adaptar técnicas para escenarios de fuzzing solo binario
- Continuar ampliando la cobertura y el soporte de los subsistemas de XNU
Limitaciones de la Publicación Pública
Para mantener este repositorio bien factorizado, los usuarios deberán añadir por su cuenta varias dependencias a third_party, como xnu, bootstrap_cmds y algunas otras bibliotecas.