Skip to content

[Agricola] AGR-2026-045: Body-aware verification failures omit the fresh challenge #141

Description

@mpp-agricola

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.

Target Automation Status Pull request
rust pr Recorded tempoxyz/mpp-rs#380

Quick action

Use GitHub's copy button, then post this command as a comment:

/ag fix
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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    agricolaIssues managed by AgricolarustPull requests that update rust code

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions