{"id":"GHSA-vvf7-6rmr-m29q","summary":"Dgraph: Unauthenticated Admin Token Disclosure Leading to Authentication Bypass via /debug/vars","details":"### Summary\nDgraph `v25.3.2` still exposes the process command line through the unauthenticated `/debug/vars` endpoint on Alpha. Because the admin token is commonly supplied via the `--security \"token=...\"` startup flag, an unauthenticated attacker can retrieve that token and replay it in the `X-Dgraph-AuthToken` header to access admin-only endpoints.\n\nThis is a variant of the previously fixed `/debug/pprof/cmdline` issue, but the current fix is incomplete because it blocks only `/debug/pprof/cmdline` and still serves `http.DefaultServeMux`, which includes `expvar`'s `/debug/vars` handler.\n\n### Details\nAlpha still exposes Go's default HTTP mux:\n\n- `x/metrics.go`\n  - imports `expvar`\n  - initializes `Conf = expvar.NewMap(\"dgraph_config\")`\n- Go's `expvar` package automatically registers `/debug/vars`\n- `expvar` publishes:\n  - `cmdline = os.Args`\n  - `memstats = runtime.Memstats`\n\nAlpha's HTTP handler explicitly blocks only the old CVE path:\n\n- `dgraph/cmd/alpha/run.go`\n  - checks `if r.URL.Path == \"/debug/pprof/cmdline\"` and returns `404`\n  - otherwise falls through to `http.DefaultServeMux.ServeHTTP(w, r)`\n\nAdmin endpoints still trust the leaked token:\n\n- `dgraph/cmd/alpha/admin.go`\n  - reads `X-Dgraph-AuthToken`\n  - compares it to `worker.Config.AuthToken`\n### PoC\n1. Send an unauthenticated request to Alpha:\n\n```http\nGET /debug/vars HTTP/1.1\nHost: target:8080\n```\n\n2. Parse the JSON response and read the `cmdline` field.\n\n3. Extract the admin token from the startup arguments, for example:\n\n```text\n--security token=debug-vars-secret;\n```\n\n4. Replay the token to an admin-only endpoint:\n\n```http\nGET /admin/config/cache_mb HTTP/1.1\nHost: target:8080\nX-Dgraph-AuthToken: debug-vars-secret\n```\n\n5. The request is accepted as an authorized admin request.\n\nThis was reproduced against `dgraph/dgraph:v25.3.2` in Docker.\n\nObserved behavior:\n\n- unauthenticated `/debug/vars` leaked the configured token\n- replaying the leaked token in `X-Dgraph-AuthToken` successfully accessed `/admin/config/cache_mb`\n- response body was:\n\n```text\n4096\n```\n\nIt was verified that the old CVE path appears specifically patched in the same version:\n\n- `/debug/pprof/cmdline` returned `404 Not Found`\n- `/debug/pprof/` remained reachable\n\n### Impact\nUnauthenticated attackers can obtain the Alpha admin token and gain unauthorized administrative access.\n\nThis enables privileged admin operations such as:\n\n- reading privileged admin configuration\n- mutating admin configuration\n- performing operational control actions gated by `X-Dgraph-AuthToken`\n\nIn deployments where the Alpha HTTP port is reachable by untrusted parties, this is a practical authentication bypass to admin functionality.","aliases":["CVE-2026-41492","GO-2026-5675"],"modified":"2026-07-23T18:21:46.527428799Z","published":"2026-04-24T16:15:28Z","database_specific":{"cwe_ids":["CWE-200"],"severity":"CRITICAL","github_reviewed":true,"github_reviewed_at":"2026-04-24T16:15:28Z","nvd_published_at":"2026-04-24T19:17:14Z"},"references":[{"type":"WEB","url":"https://github.com/dgraph-io/dgraph/security/advisories/GHSA-vvf7-6rmr-m29q"},{"type":"ADVISORY","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-41492"},{"type":"PACKAGE","url":"https://github.com/dgraph-io/dgraph"},{"type":"WEB","url":"https://github.com/dgraph-io/dgraph/releases/tag/v25.3.3"}],"affected":[{"package":{"name":"github.com/dgraph-io/dgraph/v25","ecosystem":"Go","purl":"pkg:golang/github.com/dgraph-io/dgraph/v25"},"ranges":[{"type":"SEMVER","events":[{"introduced":"0"},{"fixed":"25.3.3"}]}],"database_specific":{"source":"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/04/GHSA-vvf7-6rmr-m29q/GHSA-vvf7-6rmr-m29q.json"}},{"package":{"name":"github.com/dgraph-io/dgraph/v24","ecosystem":"Go","purl":"pkg:golang/github.com/dgraph-io/dgraph/v24"},"ranges":[{"type":"SEMVER","events":[{"introduced":"0"},{"last_affected":"24.1.8"}]}],"database_specific":{"source":"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/04/GHSA-vvf7-6rmr-m29q/GHSA-vvf7-6rmr-m29q.json"}},{"package":{"name":"github.com/dgraph-io/dgraph","ecosystem":"Go","purl":"pkg:golang/github.com/dgraph-io/dgraph"},"ranges":[{"type":"SEMVER","events":[{"introduced":"0"},{"last_affected":"1.2.8"}]}],"database_specific":{"source":"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/04/GHSA-vvf7-6rmr-m29q/GHSA-vvf7-6rmr-m29q.json"}}],"schema_version":"1.9.0","severity":[{"type":"CVSS_V3","score":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H"}]}