Почему ядро Android не понимает, что делают приложения — и как eBPF решает это без патчей
Представьте: приложение отправляет SMS с вашего телефона. Ядро Linux в этот момент видит только
Это и есть семантический разрыв — фундаментальная проблема аудита Android, над которой бьются больше десяти лет. В отличие от десктопного Linux, где
🔍 Существующие решения делятся на два лагеря, и оба проигрывают:
• Модификация ОС (ClearScope и аналоги) — хуки внедряются прямо в Binder-драйвер и framework. Устойчиво к обходу, но каждое обновление Android требует ручного переноса патчей. Архитектурный тупик для реальных деплоев.
• User-space инструментация (BPFroid, Frida) — не трогает ядро, но обходится. Приложение с native-кодом может дёрнуть
Исследователи из TU Darmstadt и Athens University разорвали эту дихотомию проектом WOOTdroid. Идея: eBPF-программы загружаются в ядро без его пересборки, цепляются к стабильным tracepoints и перехватывают Binder-транзакции на уровне драйвера. Но в отличие от сырой трассировки, WOOTdroid ещё и декодирует содержимое — имена методов, типизированные аргументы, целевые сервисы.
📊 Цифры с Pixel 9 на Android 16 впечатляют: eBPF-трассировщик перехватил на 33% больше системных вызовов, чем штатный ftrace. При этом overhead по Geekbench — не выше 3.6%. Никаких патчей к ядру, никакой пересборки AOSP, никаких инъекций в процесс приложения.
Почему это важно на практике? Потому что малварь всё чаще использует native-код для обхода user-space мониторинга. Формирует Parcel вручную, вызывает
⚡ Отдельно интересен контринтуитивный момент: eBPF-программы работают в sandbox внутри ядра, проходят верификацию перед загрузкой и не могут уронить систему. По сути — kernel-level аудит с user-space безопасностью деплоя.
Полный разбор архитектуры, механики Binder-декодирования и результатов бенчмарков — в развёрнутой статье на форуме.
https://codeby.net/threads/wootdroid-audit-android-binder-ipc-bez-semanticheskogo-razryva.93727/
Представьте: приложение отправляет SMS с вашего телефона. Ядро Linux в этот момент видит только
ioctl(fd, BINDER_WRITE_READ, &bwr). Тот же самый вызов, что и при запросе версии ОС. Или при чтении контактов. Или при получении GPS-координат. Для ядра всё это — одинаковые байты в Binder-транзакции.Это и есть семантический разрыв — фундаментальная проблема аудита Android, над которой бьются больше десяти лет. В отличие от десктопного Linux, где
sendto() прямо говорит аудитору «тут отправка данных», на Android всё проходит через цепочку: приложение → libbinder.so → ioctl → Binder-драйвер → system_server. И на уровне системных вызовов любое действие выглядит одинаково.🔍 Существующие решения делятся на два лагеря, и оба проигрывают:
• Модификация ОС (ClearScope и аналоги) — хуки внедряются прямо в Binder-драйвер и framework. Устойчиво к обходу, но каждое обновление Android требует ручного переноса патчей. Архитектурный тупик для реальных деплоев.
• User-space инструментация (BPFroid, Frida) — не трогает ядро, но обходится. Приложение с native-кодом может дёрнуть
ioctl() на /dev/binder напрямую, минуя все хуки. Малварь так и делает.Исследователи из TU Darmstadt и Athens University разорвали эту дихотомию проектом WOOTdroid. Идея: eBPF-программы загружаются в ядро без его пересборки, цепляются к стабильным tracepoints и перехватывают Binder-транзакции на уровне драйвера. Но в отличие от сырой трассировки, WOOTdroid ещё и декодирует содержимое — имена методов, типизированные аргументы, целевые сервисы.
📊 Цифры с Pixel 9 на Android 16 впечатляют: eBPF-трассировщик перехватил на 33% больше системных вызовов, чем штатный ftrace. При этом overhead по Geekbench — не выше 3.6%. Никаких патчей к ядру, никакой пересборки AOSP, никаких инъекций в процесс приложения.
Почему это важно на практике? Потому что малварь всё чаще использует native-код для обхода user-space мониторинга. Формирует Parcel вручную, вызывает
ioctl() напрямую — и Frida, и BPFroid пропускают транзакцию полностью. WOOTdroid сидит в ядре и видит всё, независимо от того, как именно приложение сформировало вызов.⚡ Отдельно интересен контринтуитивный момент: eBPF-программы работают в sandbox внутри ядра, проходят верификацию перед загрузкой и не могут уронить систему. По сути — kernel-level аудит с user-space безопасностью деплоя.
Полный разбор архитектуры, механики Binder-декодирования и результатов бенчмарков — в развёрнутой статье на форуме.
https://codeby.net/threads/wootdroid-audit-android-binder-ipc-bez-semanticheskogo-razryva.93727/
🔥4❤2👍2🤯1