
OPPO Find X6 Pro GhostLock (CVE-2026-43499) адаптация эксплойта
Данный проект посвящен адаптации уязвимости CVE-2026-43499 (GhostLock) на устройстве OPPO Find X6 Pro (PGEM10).
Основан на архитектуре оригинального эксплойта NebuSec CyberMeowfia с использованием подхода к адаптации из oppo-ghostlock.
| Параметр | Значение |
|---|---|
| Устройство | OPPO Find X6 Pro (PGEM10) |
| Чип | Snapdragon 8 Gen 2 (SM8550) |
| Ядро | Linux 5.15.149-android13 #1 SMP PREEMPT |
| Дата сборки | Thu Feb 13 2025 |
| Android | 15 (ColorOS 15.0) |
| Версия ПЗУ | PGEM10_15.0.0.600(CN01) |
| PAC | CONFIG_ARM64_PTR_AUTH_KERNEL=y |
| BTI | CONFIG_ARM64_BTI_KERNEL=y |
| KASLR | CONFIG_RANDOMIZE_BASE=y |
| VA_BITS | 39 |
| Смещение VA | P0_PAGE_OFFSET = 0xffffff8000000000 |
| Модуль | Статус | Описание |
|---|---|---|
| Perf KASLR bypass | ✅ | Ключевой прорыв — через perf_event_open + выборка callchain, получение текущего KASLR slide менее чем за 1 секунду |
| Коррекция MM_STRUCT_SZ | ✅ | Исправлено с 0x500 на 0x400 (1024Б), KernelSnitch сразу заработал |
| Полная верификация смещений в IDA | ✅ | Все ключевые символы/структуры/функции перекрёстно верифицированы через IDA |
| FUTEX_CMP_REQUEUE_PI | ✅ | UAF-срабатывание GhostLock выполнено успешно |
| Верификация ashmem | ✅ | C ashmem доступен, путь type confusion теоретически возможен |
| Анализ цепочек вызовов | ✅ | Подтверждено отсутствие в ядре цепочек глубиной ≥ 0x800 |
| Сканирование конфигурации ядра | ✅ | Полная оценка поверхности атаки |
| Модуль | Статус | Первопричина |
|---|---|---|
| SLIDE перезапись стека | ❌ | PAC приводит к расширению фрейма цепочки futex до 0xA70, pselect — всего 0x620 |
| Перезапись fops | ❌ | Требуется SLIDE, блокируется PAC |
| Type confusion | ❌ | Зависит от перезаписи fops |
| Pipe physrw | ❌ | Зависит от type confusion |
| Root | ❌ | Зависит от указанной цепочки |
oppo-pgem10-ghostlock/
├── README.md # Данный файл
├── 问题描述.md # Подробный анализ проблемы
├── docs/
│ ├── architecture.md # Архитектура и цепочки вызовов
│ └── adaptation-guide.md # Руководство по адаптации для PAC-ядра
├── reports/
│ ├── offsets.md # Отчёт о верификации смещений в IDA
│ ├── kaslr.md # Аналитический отчёт по KASLR
│ └── summary.md # Итоговое резюме
├── src/
│ ├── kaslr_perf.h # Переиспользуемый модуль Perf KASLR
│ └── kaslr_perf.c # Реализация Perf KASLR
└── analysis/
└── chains/ # Скрипты анализа цепочек вызовов
CONFIG_ARM64_PTR_AUTH_KERNEL=y # ← Основное отличие: PAC напрямую вызывает расширение фрейма
CONFIG_ARM64_BTI_KERNEL=y # BTI дополнительно увеличивает накладные расходы
CONFIG_SHADOW_CALL_STACK=y # SCS увеличивает стековый фрейм
CONFIG_VMAP_STACK=y # Стек может быть перераспределён
CONFIG_KASAN_HW_TAGS=y # Включено при компиляции
CONFIG_ARM64_VA_BITS=39 # 39-битное VA (не 48-битное)
Функция Pixel 10 (без PAC) PGEM10 (с PAC)
__arm64_sys_futex 0x90 0x4C0
do_futex 0x70 0x420
futex_wait_requeue_pi 0x1A0 0x1B0
─────────────────────────────────────────────────
Общая глубина цепи futex 0x300 0xA70 ← ×3.5
Глубина стека pselect 0x620 0x620
Возможность перезаписи? ✅ ДА ❌ НЕТ (0xA70 > 0x620)
Анализ цепочек вызовов подтверждает: в ядре 0 цепочек глубиной ≥ 0x800 (2048Б). Максимальный одиночный фрейм: 0x1F0 (496Б).