AGR-2026-045 — Body-aware verification failures omit the fresh challenge
Last observed by the head-to-head audit at 2026-08-10T09:38:20.026276Z.
Audited heads
| Target |
Repository |
Commit |
Conformance |
Semantic review |
typescript |
wevm/mppx |
b7ab48e38e3d |
Complete |
Reference |
rust |
tempoxyz/mpp-rs |
28c704988b3d |
Complete |
Complete |
go |
tempoxyz/mpp-go |
266810add451 |
Complete |
Complete |
java |
stripe/mpp-java |
bc52e0f5c77b |
Complete |
Complete |
python |
tempoxyz/pympp |
09b449739221 |
Complete |
Complete |
ruby |
stripe/mpp-rb |
58a98bbf6820 |
Complete |
Complete |
Finding
- Fingerprint:
semantic:http-verification/failure-returns-fresh-challenge
- Source: semantic
- Affected SDKs:
rust
- Clean SDKs: none
- Not reported by semantic review:
go, java, python, ruby
- Canonical reference:
draft-httpauth-payment-00 § Payment-Receipt Header / Receipt Status Semantics; § Caching
- Severity: medium
- Confidence: high
Evidence
| SDK |
Canonical evidence |
SDK evidence |
Suggested test |
rust |
http().respondChallenge — Constructs verification-failure responses with the serialized challenge in WWW-Authenticate, Cache-Control: no-store, and status 402 or the payment error status. |
PaymentBodyService::call — On verify_with_body failure, calls error_response with status 402; that helper only sets the status and supplies neither a fresh WWW-Authenticate challenge nor no-store. |
Send a body-bound request carrying an invalid Payment credential through PaymentBodyLayer and assert that the 402 response contains a newly generated, parseable WWW-Authenticate: Payment challenge and Cache-Control: no-store. |
rust: When body-bound credential verification fails, the target returns a bare 402 without WWW-Authenticate or Cache-Control. Canonical behavior returns the failure through the challenge response path, including a fresh challenge and no-store. Automatic clients therefore cannot obtain a replacement challenge and retry the failed body-bound request.
Available /ag commands
Post a command as a new comment. Only configured maintainers can run these commands.
Quick action
Use GitHub's copy button, then post this command as a comment:
| Command |
What it does |
/ag fix |
Opens or retries draft fixes for every affected PR-enabled SDK. |
/ag fix rust |
Opens or retries the draft fix for rust only. |
/ag fix "instruction" |
Applies the instruction to affected fixes; recorded PRs also incorporate unresolved review feedback and failed CI. |
/ag status |
Reports the current state of linked remediation pull requests. |
AGR-2026-045 — Body-aware verification failures omit the fresh challenge
Last observed by the head-to-head audit at
2026-08-10T09:38:20.026276Z.Audited heads
typescriptwevm/mppxb7ab48e38e3drusttempoxyz/mpp-rs28c704988b3dgotempoxyz/mpp-go266810add451javastripe/mpp-javabc52e0f5c77bpythontempoxyz/pympp09b449739221rubystripe/mpp-rb58a98bbf6820Finding
semantic:http-verification/failure-returns-fresh-challengerustgo,java,python,rubydraft-httpauth-payment-00 § Payment-Receipt Header / Receipt Status Semantics; § CachingEvidence
rustrust: When body-bound credential verification fails, the target returns a bare 402 without WWW-Authenticate or Cache-Control. Canonical behavior returns the failure through the challenge response path, including a fresh challenge and no-store. Automatic clients therefore cannot obtain a replacement challenge and retry the failed body-bound request.
Available
/agcommandsPost a command as a new comment. Only configured maintainers can run these commands.
rustQuick action
Use GitHub's copy button, then post this command as a comment:
/ag fix/ag fix rustrustonly./ag fix "instruction"/ag status