Anubis: Policy bypass via client controlled X-Original-URI header
Any HTTP client can bypass Anubis bot protection on the default configuration by adding a single request header. No challenge needs to be solved. Affected versions: v1.22.0 through v1.25.0 (introduced in commit d1d631a, PR #1015) The root cause is in `lib/policy/checker.go`, `PathChecker.Check()`: ```go func (pc *PathChecker) Check(r *http.Request) (bool, error) { originalUrl := r.Header.Get("X-Original-URI") if originalUrl != "" { if pc.regexp.MatchString(originalUrl) { return true, nil } } if pc.regexp.MatchString(r.URL.Path) { return true, nil } return false, nil } ``` The header value comes directly from the client request. The middleware chain never strips it. In reverse proxy mode an attacker fully controls it. The default policy imports `data/common/keep-internet-working.yaml`, which contains path-only ALLOW rules with no other conditions: ```yaml - name: well-known path_regex: ^/\.well-known/.*$ action: ALLOW ``` When `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. # Proof of concept Normal request, gets challenged: ``` curl -s https://anubis.techaro.lol/ | grep -o ".*" ``` Bypass, gets upstream content: ``` curl -s -H "X-Original-URI: /.well-known/x" https://anubis.techaro.lol/ | grep -o ".*" ``` The 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 anub
- Products
- github.com/TecharoHQ/anubis
- Affected versions
- Not specified
- Fixed versions
- 1.26.0
- CVEs
- CVE-2026-62314
- Confirmed fixed CVEs
- Not specified
- Updated in this feed
- 28 Oct 2026, 08:46 UTC · Revision 1
Source evidence
Anubis: Policy bypass via client controlled X-Original-URI header
core-osv · Original sourcePublished 2 Oct 2026, 18:22 UTC
Any HTTP client can bypass Anubis bot protection on the default configuration by adding a single request header. No challenge needs to be solved. Affected versions: v1.22.0 through v1.25.0 (introduced in commit d1d631a, PR #1015) The root cause is in `lib/policy/checker.go`, `PathChecker.Check()`: ```go func (pc *PathChecker) Check(r *http.Request) (bool, error) { originalUrl := r.Header.Get("X-Original-URI") if originalUrl != "" { if pc.regexp.MatchString(originalUrl) { return true, nil } } if pc.regexp.MatchString(r.URL.Path) { return true, nil } return false, nil } ``` The header value comes directly from the client request. The middleware chain never strips it. In reverse proxy mode an attacker fully controls it. The default policy imports `data/common/keep-internet-working.yaml`, which contains path-only ALLOW rules with no other conditions: ```yaml - name: well-known path_regex: ^/\.well-known/.*$ action: ALLOW ``` When `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. # Proof of concept Normal request, gets challenged: ``` curl -s https://anubis.techaro.lol/ | grep -o ".*" ``` Bypass, gets upstream content: ``` curl -s -H "X-Original-URI: /.well-known/x" https://anubis.techaro.lol/ | grep -o ".*" ``` The 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 anub
osv:GHSA-6wcg-mqvh-fcvg
github.com/TecharoHQ/anubis
Fixed versions: 1.26.0
Complete source record
{
"id": "ba3dbae6e37fb548a3425ce27ecf42ac8a167b2ed0718b059a84d2a2354a4ef1",
"url": "https://osv.dev/vulnerability/GHSA-6wcg-mqvh-fcvg",
"method": "structured",
"payload": {
"kind": "advisory",
"title": "Anubis: Policy bypass via client controlled X-Original-URI header",
"summary": "Any HTTP client can bypass Anubis bot protection on the default configuration by adding a single request header. No challenge needs to be solved. Affected versions: v1.22.0 through v1.25.0 (introduced in commit d1d631a, PR #1015) The root cause is in `lib/policy/checker.go`, `PathChecker.Check()`: ```go func (pc *PathChecker) Check(r *http.Request) (bool, error) { originalUrl := r.Header.Get(\"X-Original-URI\") if originalUrl != \"\" { if pc.regexp.MatchString(originalUrl) { return true, nil } } if pc.regexp.MatchString(r.URL.Path) { return true, nil } return false, nil } ``` The header value comes directly from the client request. The middleware chain never strips it. In reverse proxy mode an attacker fully controls it. The default policy imports `data/common/keep-internet-working.yaml`, which contains path-only ALLOW rules with no other conditions: ```yaml - name: well-known path_regex: ^/\\.well-known/.*$ action: ALLOW ``` When `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. # Proof of concept Normal request, gets challenged: ``` curl -s https://anubis.techaro.lol/ | grep -o \".*\" ``` Bypass, gets upstream content: ``` curl -s -H \"X-Original-URI: /.well-known/x\" https://anubis.techaro.lol/ | grep -o \".*\" ``` The 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 anub",
"evidence": "osv:GHSA-6wcg-mqvh-fcvg",
"products": [
{
"name": {
"value": "github.com/TecharoHQ/anubis",
"evidence": "/affected/0/package/name"
},
"prerequisites": [],
"fixed_versions": [
{
"value": "1.26.0",
"evidence": "/affected/0/ranges"
}
],
"affected_versions": []
}
],
"severity": "medium",
"structured": {
"id": "GHSA-6wcg-mqvh-fcvg",
"aliases": [
"CVE-2026-62314",
"GHSA-6wcg-mqvh-fcvg",
"GO-2026-6639"
],
"metrics": [
{
"type": "CVSS_V3",
"score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:N/A:N"
}
],
"affected": [
{
"ranges": [
{
"type": "SEMVER",
"events": [
{
"introduced": "1.22.0"
},
{
"fixed": "1.26.0"
}
]
}
],
"package": {
"name": "github.com/TecharoHQ/anubis",
"purl": "pkg:golang/github.com/TecharoHQ/anubis",
"ecosystem": "Go"
},
"database_specific": {
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/10/GHSA-6wcg-mqvh-fcvg/GHSA-6wcg-mqvh-fcvg.json"
}
}
],
"modified": "2026-10-07T17:55:39.900896867Z",
"provider": "osv",
"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"
],
"provider_metadata": {
"cwe_ids": [
"CWE-284"
],
"severity": "MODERATE",
"github_reviewed": true,
"nvd_published_at": "2026-07-15T22:17:38Z",
"github_reviewed_at": "2026-10-02T18:22:08Z"
}
},
"related_cves": [
{
"value": "CVE-2026-62314",
"evidence": "/aliases"
}
],
"security_relevant": true,
"severity_evidence": "/severity/0/score"
},
"source_id": "core-osv",
"document_id": 97120,
"published_at": "2026-10-02T18:22:08+00:00"
}Anubis: Policy bypass via client controlled X-Original-URI header in github.com/TecharoHQ/anubis
core-osv · Original sourcePublished 7 Oct 2026, 14:10 UTC
Anubis: Policy bypass via client controlled X-Original-URI header in github.com/TecharoHQ/anubis
osv:GO-2026-6639
github.com/TecharoHQ/anubis
Fixed versions: 1.26.0
Complete source record
{
"id": "058a0546bb24a318a3cca13002bf6593dd08e928e649fabccacee9516c539f7a",
"url": "https://osv.dev/vulnerability/GO-2026-6639",
"method": "structured",
"payload": {
"kind": "advisory",
"title": "Anubis: Policy bypass via client controlled X-Original-URI header in github.com/TecharoHQ/anubis",
"summary": "Anubis: Policy bypass via client controlled X-Original-URI header in github.com/TecharoHQ/anubis",
"evidence": "osv:GO-2026-6639",
"products": [
{
"name": {
"value": "github.com/TecharoHQ/anubis",
"evidence": "/affected/0/package/name"
},
"prerequisites": [],
"fixed_versions": [
{
"value": "1.26.0",
"evidence": "/affected/0/ranges"
}
],
"affected_versions": []
}
],
"severity": "unknown",
"structured": {
"id": "GO-2026-6639",
"aliases": [
"CVE-2026-62314",
"GHSA-6wcg-mqvh-fcvg",
"GO-2026-6639"
],
"affected": [
{
"ranges": [
{
"type": "SEMVER",
"events": [
{
"introduced": "1.22.0"
},
{
"fixed": "1.26.0"
}
]
}
],
"package": {
"name": "github.com/TecharoHQ/anubis",
"purl": "pkg:golang/github.com/TecharoHQ/anubis",
"ecosystem": "Go"
},
"database_specific": {
"source": "https://vuln.go.dev/ID/GO-2026-6639.json"
},
"ecosystem_specific": {}
}
],
"modified": "2026-10-07T17:45:12.474473706Z",
"provider": "osv",
"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/commit/276b537776b281b1c4e01421435bc03ade3d8fc4",
"https://github.com/TecharoHQ/anubis/pull/1630",
"https://github.com/TecharoHQ/anubis/releases/tag/v1.26.0-pre1"
],
"provider_metadata": {
"url": "https://pkg.go.dev/vuln/GO-2026-6639",
"review_status": "UNREVIEWED"
}
},
"related_cves": [
{
"value": "CVE-2026-62314",
"evidence": "/aliases"
}
],
"security_relevant": true,
"severity_evidence": null
},
"source_id": "core-osv",
"document_id": 97098,
"published_at": "2026-10-07T14:10:14+00:00"
}