Skip to content

Absolute-form requests on a reverse-proxy-only gateway listener reach the unauthenticated control route unjudged #1274

Description

@philcunliffe

Deferred from the triage of PR #1271 (head ab56f4e83ea7481e59067f5bb728b4c8d59e8c92), review round 2 residual finding 3. Severity: low.

Where

hypaware-core/plugins-workspace/ai-gateway/src/proxy.js:411 (barrier, scoped by !absoluteFormShape) versus :432 (control gate, scoped by !absoluteForm).

Observed behavior

On a listener with no forward-proxy door (the default, proxy_mode off) absoluteForm is false while absoluteFormShape is true for a request line carrying an absolute URL. So POST http://attacker.example/_hypaware/ignore/session HTTP/1.1 with Host: attacker.example skips the Host judgment (shape-exempt at :411) and still reaches the unauthenticated control handler (door-scoped at :432 lets it through). The PR's test a reverse-proxy-only listener still path-routes absolute-form under a foreign Host covers only /v1/messages, never the control path.

Why deferral is safe

No capability changes: a browser cannot put an absolute URL on a request line, so the DNS-rebinding vector #1238 closed stays closed, and a local process able to send absolute-form can already reach the same route origin-form under Host: 127.0.0.1. What this exposes is a pre-existing tension between LLP 0247 #the-control-surface-never-answers-absolute-form (categorical) and #only-forward-proxy-listeners-serve-it (a pure reverse-proxy listener "behaves exactly as it always has"), which predates PR #1271. Aligning them changes what a default listener answers, a design change on an Accepted LLP, out of scope for #1238.

Acceptance condition

A new LLP (extending or superseding the relevant sections of 0247) decides whether a pure reverse-proxy listener answers absolute-form on the control path, and the code and a control-path absolute-form test match the decision: either the request is refused ahead of the control handler, or the exemption is recorded as intended with a test pinning the current behavior.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    neutral:fixDelegate this issue to neutral for an autonomous fix attempt (reproduce -> fix -> PR)neutral:stuckneutral attempted this but cannot complete it autonomously — needs a human

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions