Skip to content

Add identity_containment category (3 scenarios) from Beyond Zero - #7

Open
davidcrowe wants to merge 3 commits into
mainfrom
feat/identity-containment-category
Open

Add identity_containment category (3 scenarios) from Beyond Zero#7
davidcrowe wants to merge 3 commits into
mainfrom
feat/identity-containment-category

Conversation

@davidcrowe

Copy link
Copy Markdown
Contributor

What

New scenario category identity_containment — 3 scenarios translated from the attacker scenarios in Alphabet's Beyond Zero paper (Valente & Zalewski, ACM Queue 2026), the successor to BeyondCorp. Discussion: HN thread.

Scenario Beyond Zero source Property tested
01_containment_blocks_all_tools "curious contractor" (stolen credentials) Containment is identity-wide, not per-tool
02_containment_denial_audited containments as visible "stop signs" Denials under containment are logged with a reason
03_containment_lift_restores "suddenly foolish administrator" passes challenge Lift restores access, no sticky residue

All three use existing primitives only (policy_change user-tier permission + existing assertion kinds) — no harness, scorer, or runner changes, every runner works unmodified.

Deliberately excluded

The paper's rogue-agent scenario (agent action checked against the controlling human's task intent) needs a task-attribution field no runner emits today. Filing separately rather than shipping an untestable scenario.

Verified

agentgovbench run --runner vanilla against this branch: loads cleanly, 13/51, identity_containment 0/3 (correct — vanilla has no governance layer; scenario 03's lift-restores half passes but its containment half fails).

Docs

  • README: badge 48→51, category table row 9, changelog v0.3 entry
  • Published framework scorecards keep their /48 denominators with an explicit note — re-run against 51 scenarios is a follow-up
  • NIST_MAPPING.md: row 9 → MANAGE-2.1 primary, MEASURE-2.7 / GOVERN-1.5 secondary
  • SCORING.md / CONTRIBUTING.md category counts

…ttacker scenarios

Three scenarios drawn from Alphabet's Beyond Zero paper (Valente &
Zalewski, ACM Queue 2026, arXiv:2605.22985), expressed entirely with
existing benchmark primitives so every runner works unmodified:

- 01: identity-level containment denies ALL tools, not just the trigger
- 02: denials under containment are audited with a populated reason
- 03: lifting a containment restores access with no sticky residue

The paper's rogue-agent scenario (agent action vs controlling human's
task intent) is NOT included — it needs a task-attribution field that no
runner emits today; tracked separately.

Vanilla runner verified: loads and runs, 13/51 (containment scenarios
correctly fail with no governance layer). Published framework scorecards
keep /48 denominators with a note until the next full re-run.
…ACP 3/3 result

user-mallory wasn't in the runner UID_MAP, so the baseline call
authenticated as nobody and every scenario false-denied — caught by
running the reference runner, which the new CONTRIBUTING checklist now
makes a hard requirement (verify against vanilla + one real runner
before the PR, commit the results file).

Reference ACP runner against production: identity_containment 3/3.
The guarantee holds today via user-tier policy enforcement — the
containment *primitive* (gatewaystack-connect#541) is about ergonomics
and triggering, not about this enforcement path.
@davidcrowe

Copy link
Copy Markdown
Contributor Author

Update after review questions:

ACP result: 3/3 against the production gateway (reference runner; results file committed as results/acp-identity_containment-live.json). The guarantee — identity-wide deny, audited with reason, clean lift — holds today through user-tier policy enforcement. The containment primitive (davidcrowe/gatewaystack-connect#541) is about ergonomics and triggering (durable state, release valve, risk-threshold proposals), not this enforcement path.

Bug found and fixed by running it: the first draft used an invented user-mallory, which isn't in the runner UID_MAP → authenticated as nobody → false 0/3. Switched to provisioned user-carol.

Inclusion criteria now explicit: CONTRIBUTING gains a 9-point scenario inclusion checklist (layer-not-model, guarantee-not-feature, externally motivated + cited, NIST-mappable, existing primitives first, deterministic/binary, provisioned identities, verified on vanilla + one real runner with committed results, versioned). This category clears all nine — point 8 is the one the first draft would have failed, which is why it's now a hard requirement.

…Rs; flag issue-first for new categories

Two corrections after dogfooding our own contribution path on PR #7:

- New categories are supposed to start as an issue (Ways to contribute
  #4); added an explicit callout so the inclusion checklist points there
  instead of implying a category can go straight to a PR. Filed #8 as the
  retroactive threat-model discussion for identity_containment.
- Point 8 as first written required every scenario PR to commit a
  real-runner results file — impossible for an external contributor who
  doesn't run a governance product, and inconsistent with the existing
  scenario checklist (only runner PRs need a results JSON). Rescoped:
  vanilla for everyone, real-runner+results for runner/new-category PRs,
  maintainer runs the reference runner in review otherwise.
@davidcrowe

Copy link
Copy Markdown
Contributor Author

Linked to the threat-model discussion issue #8 (opening it retroactively — per our own CONTRIBUTING #4, a new category should start as an issue to agree the threat model + NIST mapping before the YAML; individual scenarios in an existing category can PR directly).

Also corrected a self-inflicted inconsistency in the inclusion checklist I added: point 8 originally required every scenario PR to commit a real-runner results file, which an external scenario contributor without a governance runner can't produce (and which the pre-existing scenario checklist doesn't ask for — only runner PRs need a results JSON). Rescoped: vanilla for everyone, real-runner + committed results for runner/new-category PRs, maintainer runs the reference runner in review otherwise. Refs #8.

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.

1 participant