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.
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_modeoff)absoluteFormis false whileabsoluteFormShapeis true for a request line carrying an absolute URL. SoPOST http://attacker.example/_hypaware/ignore/session HTTP/1.1withHost: attacker.exampleskips the Host judgment (shape-exempt at:411) and still reaches the unauthenticated control handler (door-scoped at:432lets it through). The PR's testa reverse-proxy-only listener still path-routes absolute-form under a foreign Hostcovers 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.