{"id":"CVE-2026-62314","aliases":["EUVD-2026-44819","GHSA-6wcg-mqvh-fcvg","GO-2026-6639"],"status":"published","title":"Anubis: Policy bypass via client controlled X-Original-URI header","description":"Anubis is a Web AI Firewall Utility that challenges users' connections in order to protect upstream resources from scraper bots. From 1.22.0 until 1.26.0-pre1, lib/policy/checker.go PathChecker.Check() trusted the client-controlled X-Original-URI header before matching r.URL.Path, allowing an HTTP client to match default data/common/keep-internet-working.yaml ALLOW rules such as ^/\\.well-known/.*$ and bypass the Anubis challenge. This issue is fixed in version 1.26.0-pre1.","severity":{"version":"3.1","score":5.8,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:N/A:N","level":"medium","assessor":"cna","from":"cve"},"epss":{"day":"2026-11-12","score":0.0034,"percentile":0.27795,"model":"v2026.06.15"},"facts":{"in_kev":false,"known_exploited":false,"public_exploit":false,"fix_available":true},"cwes":["CWE-284"],"published":"2026-07-15T21:18:00Z","modified":"2026-10-28T02:31:03Z","fixes":[{"ecosystem":"Go","package":"github.com/TecharoHQ/anubis","fixed_in":["1.26.0"],"sources":["ghsa","osv"]}],"affected":[{"source":"ghsa","ecosystem":"Go","package":"github.com/TecharoHQ/anubis","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"1.22.0"},{"fixed":"1.26.0"}]}]},{"source":"osv","ecosystem":"Go","package":"github.com/TecharoHQ/anubis","ranges":[{"type":"SEMVER","events":[{"introduced":"1.22.0"},{"fixed":"1.26.0"}]}]},{"source":"osv","ecosystem":"Go","package":"github.com/TecharoHQ/anubis","ranges":[{"type":"SEMVER","events":[{"introduced":"1.22.0"},{"fixed":"1.26.0"}]}]}],"products":[{"vendor":"axiomthemes","product":"anubis"},{"vendor":"techarohq","product":"anubis"}],"references":[{"url":"https://github.com/TecharoHQ/anubis/security/advisories/GHSA-6wcg-mqvh-fcvg","tags":["x_refsource_CONFIRM","exploit","advisory","web"]},{"url":"https://github.com/TecharoHQ/anubis/pull/1630","tags":["x_refsource_MISC","fix","web"]},{"url":"https://github.com/TecharoHQ/anubis/commit/276b537776b281b1c4e01421435bc03ade3d8fc4","tags":["x_refsource_MISC","fix","web"]},{"url":"https://github.com/TecharoHQ/anubis/releases/tag/v1.26.0-pre1","tags":["x_refsource_MISC","web"]},{"url":"https://nvd.nist.gov/vuln/detail/CVE-2026-62314","tags":["advisory"]},{"url":"https://github.com/advisories/GHSA-6wcg-mqvh-fcvg"},{"url":"https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/62xxx/CVE-2026-62314.json","tags":["advisory"]},{"url":"https://github.com/TecharoHQ/anubis","tags":["package"]}],"sources":{"cve":[{"id":"CVE-2026-62314","title":"Anubis: Policy bypass via client controlled X-Original-URI header","description":"Anubis is a Web AI Firewall Utility that challenges users' connections in order to protect upstream resources from scraper bots. From 1.22.0 until 1.26.0-pre1, lib/policy/checker.go PathChecker.Check() trusted the client-controlled X-Original-URI header before matching r.URL.Path, allowing an HTTP client to match default data/common/keep-internet-working.yaml ALLOW rules such as ^/\\.well-known/.*$ and bypass the Anubis challenge. This issue is fixed in version 1.26.0-pre1.","status":"published","published":"2026-07-15T21:18:00.355Z","modified":"2026-08-12T17:50:22.279Z","cvss":[{"version":"3.1","score":5.8,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:N/A:N","level":"medium","assessor":"cna"}],"cwes":["CWE-284"],"updated_at":"2026-11-02T14:20:14.999906Z"}],"euvd":[{"id":"EUVD-2026-44819","description":"Anubis is a Web AI Firewall Utility that challenges users' connections in order to protect upstream resources from scraper bots. From 1.22.0 until 1.26.0-pre1, lib/policy/checker.go PathChecker.Check() trusted the client-controlled X-Original-URI header before matching r.URL.Path, allowing an HTTP client to match default data/common/keep-internet-working.yaml ALLOW rules such as ^/\\.well-known/.*$ and bypass the Anubis challenge. This issue is fixed in version 1.26.0-pre1.","status":"published","published":"2026-07-15T21:18:00Z","modified":"2026-08-12T17:50:22Z","cvss":[{"version":"3.1","score":5.8,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:N/A:N","level":"medium"}],"updated_at":"2026-11-02T18:01:57.953172Z"}],"ghsa":[{"id":"GHSA-6wcg-mqvh-fcvg","title":"Anubis: Policy bypass via client controlled X-Original-URI header","description":"Any HTTP client can bypass Anubis bot protection on the default configuration by adding a single request header. No challenge needs to be solved.\nAffected versions: v1.22.0 through v1.25.0 (introduced in commit d1d631a, PR #1015)\n\nThe root cause is in `lib/policy/checker.go`, `PathChecker.Check()`:\n```go\nfunc (pc *PathChecker) Check(r *http.Request) (bool, error) {\n    originalUrl := r.Header.Get(\"X-Original-URI\")\n    if originalUrl != \"\" {\n        if pc.regexp.MatchString(originalUrl) {\n            return true, nil\n        }\n    }\n    if pc.regexp.MatchString(r.URL.Path) {\n        return true, nil\n    }\n    return false, nil\n}\n```\n\nThe header value comes directly from the client request. The middleware chain never strips it. In reverse proxy mode an attacker fully controls it.\nThe default policy imports `data/common/keep-internet-working.yaml`, which contains path-only ALLOW rules with no other conditions:\n\n```yaml\n- name: well-known\n  path_regex: ^/\\.well-known/.*$\n  action: ALLOW\n```\n\nWhen `X-Original-URI` matches one of those regexes, the rule fires as ALLOW and the request is forwarded upstream without any challenge or JWT check.\n\n\n# Proof of concept\n\nNormal request, gets challenged:\n```\ncurl -s https://anubis.techaro.lol/ | grep -o \"\u003ctitle\u003e.*\u003c/title\u003e\"\n```\n\nBypass, gets upstream content:\n```\ncurl -s -H \"X-Original-URI: /.well-known/x\" https://anubis.techaro.lol/ | grep -o \"\u003ctitle\u003e.*\u003c/title\u003e\"\n```\n\nThe first command returns the Anubis challenge page title. The second returns the real site title directly, with no cookie set and no challenge issued. Verified live against anubis.techaro.lol.\n\n# Suggested fix\nThe fix should probably be to strip the header from incoming client requests in the middleware chain before policy evaluation. In `auth_request` mode the header is set by the proxy after Anubis processes the middleware, so stripping it at ingress does not break that deployment mode.","status":"published","published":"2026-10-02T18:22:08Z","modified":"2026-10-02T18:22:09Z","cvss":[{"version":"3.1","score":5.8,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:N/A:N","level":"medium"}],"cwes":["CWE-284"],"updated_at":"2026-11-02T14:41:24.739884Z"}],"nvd":[{"id":"CVE-2026-62314","description":"Anubis is a Web AI Firewall Utility that challenges users' connections in order to protect upstream resources from scraper bots. From 1.22.0 until 1.26.0-pre1, lib/policy/checker.go PathChecker.Check() trusted the client-controlled X-Original-URI header before matching r.URL.Path, allowing an HTTP client to match default data/common/keep-internet-working.yaml ALLOW rules such as ^/\\.well-known/.*$ and bypass the Anubis challenge. This issue is fixed in version 1.26.0-pre1.","status":"published","published":"2026-07-15T22:17:38.05Z","modified":"2026-10-24T21:10:00.13Z","cvss":[{"version":"3.1","score":5.8,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:N/A:N","level":"medium","assessor":"secondary"}],"cwes":["CWE-284"],"updated_at":"2026-11-02T14:12:30.250437Z"}],"osv":[{"id":"CVE-2026-62314","title":"Anubis: Policy bypass via client controlled X-Original-URI header","description":"Anubis is a Web AI Firewall Utility that challenges users' connections in order to protect upstream resources from scraper bots. From 1.22.0 until 1.26.0-pre1, lib/policy/checker.go PathChecker.Check() trusted the client-controlled X-Original-URI header before matching r.URL.Path, allowing an HTTP client to match default data/common/keep-internet-working.yaml ALLOW rules such as ^/\\.well-known/.*$ and bypass the Anubis challenge. This issue is fixed in version 1.26.0-pre1.","status":"published","published":"2026-07-15T21:18:00.355Z","modified":"2026-10-28T02:31:03.514022406Z","cvss":[{"version":"3.1","score":5.8,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:N/A:N","level":"medium"}],"cwes":["CWE-284"],"updated_at":"2026-11-02T15:45:13.306117Z"},{"id":"GHSA-6wcg-mqvh-fcvg","title":"Anubis: Policy bypass via client controlled X-Original-URI header","description":"Any HTTP client can bypass Anubis bot protection on the default configuration by adding a single request header. No challenge needs to be solved.\nAffected versions: v1.22.0 through v1.25.0 (introduced in commit d1d631a, PR #1015)\n\nThe root cause is in `lib/policy/checker.go`, `PathChecker.Check()`:\n```go\nfunc (pc *PathChecker) Check(r *http.Request) (bool, error) {\n    originalUrl := r.Header.Get(\"X-Original-URI\")\n    if originalUrl != \"\" {\n        if pc.regexp.MatchString(originalUrl) {\n            return true, nil\n        }\n    }\n    if pc.regexp.MatchString(r.URL.Path) {\n        return true, nil\n    }\n    return false, nil\n}\n```\n\nThe header value comes directly from the client request. The middleware chain never strips it. In reverse proxy mode an attacker fully controls it.\nThe default policy imports `data/common/keep-internet-working.yaml`, which contains path-only ALLOW rules with no other conditions:\n\n```yaml\n- name: well-known\n  path_regex: ^/\\.well-known/.*$\n  action: ALLOW\n```\n\nWhen `X-Original-URI` matches one of those regexes, the rule fires as ALLOW and the request is forwarded upstream without any challenge or JWT check.\n\n\n# Proof of concept\n\nNormal request, gets challenged:\n```\ncurl -s https://anubis.techaro.lol/ | grep -o \"\u003ctitle\u003e.*\u003c/title\u003e\"\n```\n\nBypass, gets upstream content:\n```\ncurl -s -H \"X-Original-URI: /.well-known/x\" https://anubis.techaro.lol/ | grep -o \"\u003ctitle\u003e.*\u003c/title\u003e\"\n```\n\nThe first command returns the Anubis challenge page title. The second returns the real site title directly, with no cookie set and no challenge issued. Verified live against anubis.techaro.lol.\n\n# Suggested fix\nThe fix should probably be to strip the header from incoming client requests in the middleware chain before policy evaluation. In `auth_request` mode the header is set by the proxy after Anubis processes the middleware, so stripping it at ingress does not break that deployment mode.","status":"published","published":"2026-10-02T18:22:08Z","modified":"2026-10-07T17:55:39.900896867Z","cvss":[{"version":"3.1","score":5.8,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:N/A:N","level":"medium"}],"cwes":["CWE-284"],"updated_at":"2026-11-02T15:46:40.308826Z"},{"id":"GO-2026-6639","title":"Anubis: Policy bypass via client controlled X-Original-URI header in github.com/TecharoHQ/anubis","description":"Anubis: Policy bypass via client controlled X-Original-URI header in github.com/TecharoHQ/anubis","status":"published","published":"2026-10-07T14:10:14Z","modified":"2026-10-07T17:45:12.474473706Z","updated_at":"2026-11-02T15:47:03.11707Z"}]}}
