Skip to content

proposal: merge duplicate parameter-binding requirement from C9.7.2 into C9.2.2#442

Merged
ottosulin merged 4 commits intoOWASP:mainfrom
RicoKomenda:discuss/dedup-c9-approval-parameter-binding
Mar 26, 2026
Merged

proposal: merge duplicate parameter-binding requirement from C9.7.2 into C9.2.2#442
ottosulin merged 4 commits intoOWASP:mainfrom
RicoKomenda:discuss/dedup-c9-approval-parameter-binding

Conversation

@RicoKomenda
Copy link
Copy Markdown
Contributor

C9.2.2 and C9.7.2 both addressed the same attack - binding approvals to exact action parameters to prevent "approve one thing, execute another" / substituted approvals. The core requirement was duplicated across two sections (C9.2 HITL approval gates, C9.7 intent verification).

Resolution:

  • Enrich C9.2.2 with the unique aspects of C9.7.2 (integrity-protection of the approval itself, expiry) so all three properties live together: present parameters → integrity-protect the approval → bind to params → expire
  • Remove old C9.7.2 (now covered by C9.2.2)
  • Renumber C9.7.3 → C9.7.2 and C9.7.4 → C9.7.3

This is a PROPOSAL for discussion - please review whether the merged wording captures the full intent of both original controls before merging.

Copy link
Copy Markdown
Collaborator

@ottosulin ottosulin left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good catch on the duplication! I think your assessment is correct: C9.2.2 and C9.7.2 were describing the same control mechanism just from two different angles.

I think this proposal combines the properties correctly into one requirement. The "explicit user intent confirmation" aspect from old C9.7.2 is not lost because C9.2.1 already mandates "explicit human-in-loop approval" for privileged/irreversible actions.

Regarding compound requirements: the merged text has three verifiable properties: (1) present exact parameters, (2) integrity-protect & bind, (3) expire quickly. These are tightly coupled and they all describe properties of a single approval event. An auditor would in practice check one mechanism, not three separate systems. So this is acceptable coupling.

A suggestion for minor rewording:

Verify that approval requests present the exact action parameters (diff/command/recipient/amount/scope), that the resulting approval is integrity-protected and bound to those parameters, and that approvals expire after a short time window to prevent stale or substituted approvals.

The change:

  • "expire quickly" -> "expire after a short time window" (slightly more testable/auditable than word "quickly" which is more subjective, whereas "short time window" implies a configurable TTL an auditor can check exists.
  • Also removed the double phrasing at the end ("approve one thing, execute another" + "stale or substituted approvals" was redundant; one explanation suffices).

@RicoKomenda RicoKomenda force-pushed the discuss/dedup-c9-approval-parameter-binding branch from 1e27fa7 to 556e68c Compare March 24, 2026 22:06
@RicoKomenda RicoKomenda requested a review from ottosulin March 24, 2026 22:07
| :--: | --- | :---: | :--: |
| **9.2.1** | **Verify that** privileged or irreversible actions (e.g., code merges/deploys, financial transfers, user access changes, destructive deletes, external notifications) require explicit human-in-loop approval. | 1 | D/V |
| **9.2.2** | **Verify that** approval requests present the exact action parameters (diff/command/recipient/amount/scope) and bind approvals to those parameters to prevent "approve one thing, execute another." | 2 | D/V |
| **9.2.2** | **Verify that** approval requests present the exact action parameters (diff/command/recipient/amount/scope), that the resulting approval is integrity-protected and bound to those parameters, and that approvals expire after a short time window to prevent stale or substituted approvals. | 2 | D/V |
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks like 4 different requirements:

  1. Verify that approval requests display canonicalized and complete action parameters (diff, command, recipient, amount, scope) without truncation or transformation.
  2. Verify that approvals are cryptographically bound (e.g., signed or MACed) to the exact action parameters, requester identity, and execution context.
  3. Verify that approvals include a unique nonce and are single-use to prevent replay or substitution.
  4. Verify that approvals expire within a defined maximum time-to-live (TTL) and are rejected after expiration.

| **9.7.2** | **Verify that** high-impact actions require explicit user intent confirmation that is integrity-protected and bound to the exact action parameters (and expires quickly) to prevent stale or substituted approvals. | 2 | D/V |
| **9.7.3** | **Verify that** post-condition checks confirm the intended outcome and detect unintended side effects; any mismatch triggers containment (and compensating actions where supported). | 2 | V |
| **9.7.4** | **Verify that** prompt templates and agent policy configurations are integrity-verified at load time against their approved versions (e.g., via hashes or signatures). | 3 | D/V |
| **9.7.2** | **Verify that** post-condition checks confirm the intended outcome and detect unintended side effects; any mismatch triggers containment (and compensating actions where supported). | 2 | V |
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks like maybe three requirements.

  1. Verify that post-execution checks confirm the intended outcome.
  2. Verify that post-execution checks detect unintended side effects.
  3. Verify that any mismatch between intended outcome and actual results triggers containment and, where supported, compensating actions.

I'm not sure what the best level of reduction is, but breaking these up into smaller requirements make them more actionable and easier to test!

…nto C9.2.2

C9.2.2 and C9.7.2 both addressed the same attack — binding approvals
to exact action parameters to prevent "approve one thing, execute
another" / substituted approvals. The core requirement was duplicated
across two sections (C9.2 HITL approval gates, C9.7 intent verification).

Resolution:
- Enrich C9.2.2 with the unique aspects of C9.7.2 (integrity-protection
  of the approval itself, expiry) so all three properties live together:
  present parameters → integrity-protect the approval → bind to params → expire
- Remove old C9.7.2 (now covered by C9.2.2)
- Renumber C9.7.3 → C9.7.2 and C9.7.4 → C9.7.3

This is a PROPOSAL for discussion — please review whether the merged
wording captures the full intent of both original controls before merging.
- 'expire quickly' → 'expire after a short time window' (more auditable;
  implies a configurable TTL an auditor can verify exists)
- removed redundant double phrasing at end ('approve one thing, execute
  another' + 'stale or substituted approvals'); one explanation suffices
…anico review on PR OWASP#442

- 9.2.2 display of canonicalized parameters (was merged with binding, nonce, TTL)
- 9.2.3 cryptographic binding of approval to parameters, identity, context
- 9.2.4 unique nonce + single-use to prevent replay/substitution
- 9.2.5 TTL expiry — approvals rejected after expiration
- 9.2.6 rollback / compensating actions (renumbered from 9.2.3)
- 9.7.2 post-execution: confirm intended outcome
- 9.7.3 post-execution: detect unintended side effects
- 9.7.4 mismatch triggers containment + compensating actions
- 9.7.5 prompt template integrity (renumbered from 9.7.3)
@RicoKomenda RicoKomenda force-pushed the discuss/dedup-c9-approval-parameter-binding branch from 556e68c to 60dc829 Compare March 25, 2026 07:48
@RicoKomenda RicoKomenda requested a review from jmanico March 25, 2026 07:49
| **9.7.2** | **Verify that** post-execution checks confirm the intended outcome was achieved. | 2 | V |
| **9.7.3** | **Verify that** post-execution checks detect unintended side effects. | 2 | V |
| **9.7.4** | **Verify that** any mismatch between intended outcome and actual results triggers containment and, where supported, compensating actions. | 2 | V |
| **9.7.5** | **Verify that** prompt templates and agent policy configurations are integrity-verified at load time against their approved versions (e.g., via hashes or signatures). | 3 | D/V |
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would add to the end ".. if retrieved from a remote source"

Prompt templates can be included in the source code, no need to check in that case.

… on PR OWASP#442

Prompt templates included in source code do not require load-time integrity
verification against an approved version — only those retrieved from a remote
source do.
@RicoKomenda RicoKomenda requested a review from ottosulin March 26, 2026 20:24
@ottosulin ottosulin merged commit c2eee01 into OWASP:main Mar 26, 2026
2 checks passed
@RicoKomenda RicoKomenda deleted the discuss/dedup-c9-approval-parameter-binding branch March 27, 2026 16:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants