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

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

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

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

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

Категории

Все категории
Loading categories
CVE-2026-32710 — Куча OOB запись в MariaDB JSON_SCHEMA_VALID() → устойчивое повышение привилегий (при поддержке лаборатории) | Kitploit
Инструменты/GitHubGitHub/dinosn/cve-2026-32710
Повышение привилегийФреймворки для эксплойтовАнализ уязвимостейЭксплуатацияРазработка Полезной НагрузкиБезопасность Баз ДанныхЭксплуатация Бинарных Файлов
GitHubdinosn/cve-2026-32710

CVE-2026-32710

Куча OOB запись в MariaDB JSON_SCHEMA_VALID() → устойчивое повышение привилегий (при поддержке лаборатории)

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

Популярное

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

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

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

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

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

CVE-2026-32710

Переполнение кучи в JSON_SCHEMA_VALID() MariaDB → устойчивое повышение привилегий → RCE через UDF

ЗатронутоMariaDB 11.4.x (подтверждено на 11.4.9)
ОшибкаЗапись за пределами буфера в json_get_normalized_string() — strncpy в 128-байтовый DYNAMIC_STRING без проверки границ
ВоздействиеПользователь с правами только SELECT → ALL PRIVILEGES WITH GRANT OPTION → выполнение произвольных команд через UDF
Источникsql/json_schema_helper.cc:91

При поддержке лаборатории. Скрипт использует Docker / root-интроспекцию для чтения /proc/1/mem и определения раскладки кучи для каждого соединения. Фактическая цепочка эксплойта — чистый SQL через TCP. Боевой эксплойт потребовал бы примитив утечки информации для замены шага интроспекции памяти.

До

lowpriv может выполнять только SELECT в базе данных test. Системные таблицы запрещены.

before

Эксплойт

Один Python-скрипт выполняет подготовку кучи, двухшаговую произвольную запись через метаданные пользовательских переменных, закрепляет повышение привилегий через GRANT ALL и достигает выполнения кода через UDF:

root@kitploit:~
python3 exploit.py

exploit

После

lowpriv теперь имеет ALL PRIVILEGES WITH GRANT OPTION, может читать системные таблицы, читать/записывать произвольные файлы и выполнять команды ОС от имени пользователя mysql. Грант переживает перезапуск сервера.

after

Полный вывод эксплойта

full run

Этапы

Этап 1: Повышение привилегий

root@kitploit:~
┌──────────────────────────────────────────────────────────────────┐
│  SELECT  json_schema_valid(overflow),                           │
│          @ccc...c := hop1,                                      │
│          @aaa...a := hop2                                       │
└──────────────────────────────────────────────────────────────────┘
         │                    │                   │
         ▼                    ▼                   ▼
   ┌───────────┐     ┌──────────────┐    ┌──────────────┐
   │ 192-байт  │     │ Запись в @c  │    │ Запись в @a  │
   │ перепол-  │     │ через        │    │ через        │
   │ нение     │     │ повреждённый │    │ перенаправ-  │
   │ повреждает│     │ указатель:   │    │ ленный       │
   │ value ptr │     │              │    │ указатель:   │
   │ entry_c   │     │ entry_a →    │    │ master_access│
   │ (частичная│     │   .value =   │    │   = 0xFFFF.. │
   │ перезапись│     │   &master_   │    │ (ALL PRIVS)  │
   │ 2 байт)   │     │   access     │    │              │
   │           │     │   .length= 9 │    └──────────────┘
   └───────────┘     └──────────────┘
  1. Подготовка кучи — 100+ пользовательских переменных исчерпывают tcache, заставляя Entry_a → Value_a → Entry_b → Value_b → Entry_c → Value_c выделяться последовательно.

  2. Переполнение — JSON_SCHEMA_VALID вызывает 192-байтовый strncpy за пределы 128-байтового буфера, повреждая entry_c→value (частичная перезапись указателя на 2 байта в пределах той же страницы 64 КБ), чтобы он указывал на entry_a + 32.

  3. Шаг 1 — Присваивание @c записывает 126 байт через повреждённый указатель в метаданные entry_a, устанавливая:

    • entry_a→value = &Security_context::master_access
    • entry_a→length = 9
  4. Шаг 2 — Присваивание @a записывает 8 байт 0xFF через перенаправленный указатель → .

Этап 2: RCE через UDF

После закрепления сервер перезапускается (восстановление после сбоя), и повышенные привилегии используются для установки разделяемой библиотеки UDF:

  1. LOAD_FILE('/tmp/raptor_udf.so') INTO DUMPFILE '/usr/lib/mysql/plugin/raptor.so'
  2. CREATE FUNCTION sys_exec RETURNS INTEGER SONAME 'raptor.so'
  3. SELECT sys_exec('id > /tmp/pwned')

Решённые ключевые ограничения

Настройка лаборатории

root@kitploit:~
# 1. Сборка и запуск контейнера
./setup.sh

# 2. Отключение ASLR на хосте Docker
sudo sh -c 'echo 0 > /proc/sys/kernel/randomize_va_space'

# 3. Запуск эксплойта (автокалибровка для каждой попытки)
python3 exploit.py

# 4. Пользовательская команда
python3 exploit.py --cmd 'cat /etc/passwd > /tmp/out'

Требования

  • Docker (x86_64)
  • Python 3
  • ASLR отключён на хосте Docker (/proc/sys/kernel/randomize_va_space = 0)
  • Контейнер запускается с --cap-add SYS_PTRACE (для доступа к /proc/1/mem)

Параметры

root@kitploit:~
--calibrate      Измерить константы раскладки кучи и выйти
--cmd CMD        Команда для выполнения UDF на этапе 2 (по умолчанию: id > /tmp/pwned)
--stage1-only    Выполнить только повышение привилегий, пропустить RCE через UDF
--attempts N     Максимум попыток этапа 1 (по умолчанию: 5)
--host HOST      Хост MariaDB (по умолчанию: 127.0.0.1)
--port PORT      Порт MariaDB (по умолчанию: 3306)

Что предоставляет поддержка лаборатории

Скрипт эксплойта подключается к контейнеру как root для чтения /proc/1/mem. Это используется для двух целей:

  1. Определение раскладки кучи — поиск трёх контрольных структур user_var_entry и проверка их смежности (entry_a+32 в пределах той же страницы 64 КБ, что и entry_c→value для частичной перезаписи 2 байт).
  2. Адрес Security_context — поиск поля master_access для целевой двухшаговой записи.

Сканирование выполняется встроенно для каждой попытки, поскольку раскладка кучи различается между соединениями (даже при ASLR=0) из-за того, что пул потоков MariaDB назначает разные арены. Фактическая цепочка эксплойта — переполнение + hop1 + hop2 — представляет собой чистый SQL, выполняемый через TCP-соединение.

В реальном сценарии злоумышленнику потребовалась бы отдельная уязвимость утечки информации (или побочный канал) для получения этих адресов.

Файлы

Скачать инструмент
entry_a→value
master_access = ALL PRIVILEGES
  • Закрепление — Сессия теперь обладает всеми привилегиями. GRANT ALL фиксирует повышение привилегий в таблице mysql.global_priv на базе Aria. Сессия в конечном итоге падает во время очистки (остаточное повреждение кучи), но GRANT уже сохранён в контрольной точке и переживает перезапуск.

  • ОграничениеРешение
    STRING_RESULT выполняет length++ перед проверкой перераспределенияПолезная нагрузка имеет размер N−1 байт, поэтому N−1+1 = N совпадает с сохранённой длиной → нет перераспределения при повреждённом указателе
    126-байтовый hop2 повреждает поля THD за пределами Security_contextУстановить entry_a→length = 9 в hop1, чтобы hop2 записывал только 8 байт (master_access) + 1 NUL
    Смещение master_access в Security_context1712 байт от базового адреса структуры (priv_user[384] + proxy_user[645] + priv_host[256] + priv_role[384] + выравнивание + указатели)
    Восстановление после сбоя Aria откатывает незафиксированные записиGRANT ALL + SLEEP на 10 с позволяет Aria выполнить контрольную точку до сбоя при очистке сессии
    Раскладка кучи различается между соединениями (даже при ASLR=0)Встроенное сканирование /proc/1/mem для каждой попытки обнаруживает entry_a и master_access для каждого соединения
    plugin_dir принадлежит rootDockerfile заранее задаёт chmod 777 (удобство лаборатории)
    ФайлОписание
    exploit.pyДвухэтапный эксплойт: повышение привилегий (TCP SQL) + RCE через UDF
    raptor_udf.cИсходный код UDF — sys_exec() вызывает system()
    DockerfileОбраз контейнера лаборатории (компилирует UDF, открывает plugin_dir)
    init.sqlСоздаёт пользователя lowpriv
    setup.shСобирает и запускает лабораторию
    screenshots/Снимки терминала