
Исследование CVE и эксплойты для получения root-прав на устройствах Pixel
Получение root на стоковом Google Pixel с заблокированным загрузчиком из непривилегированного adb shell с использованием
CVE в ядре — без разблокировки, без прошивки, без помощи вендора.
Достижимая из пользовательского пространства ошибка ядра даёт недолговечный примитив чтения/записи. Этот примитив
расходуется на позднюю загрузку модуля KernelSU в работающее
ядро GKI,
после чего root передаётся уже установленному менеджеру KernelSU.
Ни один раздел не записывается, поэтому перезагрузка — это удаление. Всё выполняется с хоста через
adb посредством единственного исполняемого файла ./pixel-ksu-root.
| CVE | ошибка | текущее состояние |
|---|---|---|
| CVE-2026-43499 — GhostLock | обход PI в futex следует за rt_mutex_waiter, который remove_waiter() оставил висящим, и читает из слота стека, который перезанял pselect(2) | даёт root, проверено на железе; рецепт default, поэтому обычный запуск использует его |
| CVE-2026-43049 — FFWheel | hidpp_probe() публикует устройство ввода до инициализации force-feedback и возвращает ошибку без hid_hw_stop(), поэтому освобождённый struct uhid_device остаётся достижимым через /dev/input/eventN | даёт root, проверено на железе; use-after-free из непривилегированного shell до произвольного чтения/записи в ядре, затем перезапись собственного cred на месте |
| CVE-2026-93189 — Joyride | hid_hw_stop() никогда не ждёт остановки ввода, поэтому неудачный probe освобождает struct hidraw, в который hidraw_report_event() всё ещё пишет на другом процессоре | кандидат-преемник; путь к освобождению пройден на железе из непривилегированного shell через /dev/uhid, и он открыт на сборках, закрывающих обе цепочки выше |
| CVE-2026-46242 — BadEpoll | __ep_remove() очищает file->f_ep и продолжает использовать файл, поэтому параллельный __fput() освобождает eventpoll, через который тот всё ещё пишет | частично; цепочки чтения и записи обе выполняются от начала до конца, но доставка через границу slab не решена |
| CVE-2026-56945 — RogueWave | bigo_iommu_fault_handler() обходит глобальный для драйвера список экземпляров без блокировки, исходя из документированного и неверного предположения о своём вызывающем | достижимо без привилегий через публичный API AMediaCodec; сам обработчик ошибок ещё не был вызван |
| CVE-2026-56914 — DirtyDock | gcip_iommu_mapping_unmap_buffer() помечает закреплённую DMA-страницу как грязную с помощью неблокирующей set_page_dirty() вместо её блокирующего варианта, состязаясь с разрушением нижележащей памяти | запускается от начала до конца, хотя узел устройства защищён привилегиями; две состязательные стратегии опровергнуты, тайминг пока не выигран |
| CVE-2026-64468 — Frostbind | binder_free_transaction() разыменовывает t->to_proc, не удерживая ссылку | охота; уязвимое чтение выполняется, но гонка проигрывается на голом железе |
| CVE-2026-64469 — Frostwalk | родственник Frostbind в той же функции: неблокирующее чтение в binder_free_transaction() состязается с binder_thread_release(), обходящим transaction_stack другого потока | охота; и освобождение, и обход подтверждены как достижимые, при этом в механизме нет зависимости от root — он достигает процесса приложения так же, как Shizuku; попытка возврата памяти без проверочного чтения (flood + pin) пока не удалась — фактическая цель записи всё ещё не выделена |
| CVE-2026-64560 — Zombietick | общепроцессный таймер POSIX CPU освобождается, оставаясь в очереди, потому что posix_cpu_timer_del() возвращается досрочно, как только de_thread() обнулил ->sighand | охота; стадия KASLR проходит, дескриптор-мост так и не валидируется |
| CVE-2026-49881 — Telecom | Telecom доверяет имени компонента, предоставленному вызывающим, и загружает его с CONTEXT_INCLUDE_CODE, поэтому приложение-приманка выполняет произвольный Java-код внутри system_server | исследование; это разворот в пользовательском пространстве, а не ошибка ядра, в паре с domainprobe/ |