Skip to content

Add AVE-2026-00081: Lingering Authority (arXiv:2606.22504) - #270

Open
chaksaray wants to merge 1 commit into
developfrom
feat/lingering-authority
Open

Add AVE-2026-00081: Lingering Authority (arXiv:2606.22504)#270
chaksaray wants to merge 1 commit into
developfrom
feat/lingering-authority

Conversation

@chaksaray

Copy link
Copy Markdown
Contributor

Summary

Implements issue #217. Part 1 checked AVE-2026-00045's real current text against the scoping-vs-expiration distinction the issue raised -- already precise, no change needed. Part 2 confirmed the expiration-shaped case (framework_sources-style gap: a legitimately-issued capability that outlives the episode that justified it) is a real, distinct behavioral class, sourced, and drafted here as AVE-2026-00081.

Source: Santos-Grueiro, "Lingering Authority: Revocable Resource-and-Effect Capabilities for Coding Agents" (arXiv:2606.22504, cs.CR, 2026-06-21). Coins the term and proposes PORTICO, a reference monitor with an explicit request-grant-invoke capability lifecycle. Empirically: a non-revoking baseline permits 10/10 tested post-closure capability reuses and executes 6/6 forbidden effects (file writes, git mutation, network egress) in a deterministic stale-write audit, versus 0/10 and 0/6 under the revoking design.

Severity: MEDIUM, AIVSS 6.1.

Distinctness (real field comparison, not label similarity)

  • AVE-2026-00021 / AVE-2026-00063: active bypass of a confirmation/approval check at the moment of action. This record bypasses nothing -- the grant is legitimate and simply never re-checked against its own closure.
  • AVE-2026-00045: a still-valid grant used outside its scope, no elapsed time or external event required. This record is the inverse: used within scope, but past when a real external, checkable event (episode closure) should have ended it.
  • AVE-2026-00050: an undeclared registration smuggled in at session init. This record's capability was legitimately declared and granted; the gap is purely a missing closure-triggered revocation.

Framework mappings (verified against primary sources)

  • owasp_mcp: MCP02 (Privilege Escalation via Scope Creep) -- read the full primary-source text (github.com/OWASP/www-project-mcp-top-10, commit 165fe0f). Its detection checklist names 'no enforced expiration for scopes or tokens' verbatim; remediation feat: add 5 new ave records #3 is JIT access with revalidation for long-running tasks -- the same gap.
  • owasp_asi: ASI03 (Identity and Privilege Abuse) -- read the actual 2026 PDF directly (genai.owasp.org). Common Example feat: add new ave rule records #4 is literally "Time-of-Check to Time-of-Use (TOCTOU) in Agent Workflows," and Example Attack Scenario doc: add new ave records #5 ("Workflow Authorization Drift") describes this exact mechanism.
  • mitre_atlas: checked directly against the live 170+ technique ATLAS.yaml -- no clean fit (the only hit, stolen-token abuse, is a different mechanism). Left empty, documented in aivss.notes.
  • nist_ai_rmf: checked the actual NIST AI 100-1 text (Tables 1-4) directly -- MANAGE-2.4 and GOVERN-1.7 are the closest but operate at whole-system granularity, not per-capability revocation. Left empty, documented in aivss.notes.

A note on this PR's scope

While drafting this I found a second, concurrent Claude Code session (ave-a5) with its own unrelated, uncommitted work sitting in the same working directory (AVE-2026-00082, a local skill-name-collision record from issue #150). This PR deliberately excludes it -- dist/ave-records-latest.json was rebuilt from a clean copy of git-tracked records plus only this one new file, specifically so that session's not-yet-reviewed work doesn't get published as a side effect of this PR. It's untouched on disk for that session to commit and PR on its own.

Checklist

  • Id confirmed via issue AVE-2026-00081: Lingering authority -- a task-scoped capability outlives the episode that justified it #268 (references AVE-2026-00021/00045/00050/00063 distinctness and the framework-mapping sourcing)
  • Positive + negative conformance fixtures
  • python3 scripts/validate_records.py -- 82/82 valid (includes the concurrent session's untracked record on disk; harmless to the check, not part of this PR's diff)
  • python3 scripts/check_fixtures.py
  • python3 scripts/check_vulnerability_taxonomy.py --strict --only AVE-2026-00081
  • python3 scripts/check_framework_sources.py --strict --only AVE-2026-00081
  • python3 scripts/write_verification_basis.py
  • pytest tests/ -x -q -- 478 passed
  • Published via node scripts/build-records.js (isolated input dir, not hand-edited)
  • README badge / stats table / record index updated
  • CHANGELOG updated

Closes #268.
Part of #217 (Part 1 confirmed no change needed to AVE-2026-00045; leaving #217 open only if there's further follow-up expected, otherwise closing alongside this).

A task/subgoal/episode-scoped capability grant (tool permission,
credential, access token) outlives the closure event that justified
it -- nothing in the agent's runtime ties revocation to that closure,
so the agent's later, unrelated turns can reuse a capability that
should already be gone.

Sourced from Santos-Grueiro, 'Lingering Authority: Revocable
Resource-and-Effect Capabilities for Coding Agents' (arXiv:2606.22504),
whose PORTICO reference monitor demonstrates the gap empirically: a
non-revoking baseline permits 10/10 tested post-closure reuses and
executes 6/6 forbidden effects in a deterministic stale-write audit,
versus 0/10 and 0/6 under a revoking design.

Drafted per issue #217 (Part 2: verify whether the expiration-shaped
case is a real, uncovered gap). Part 1 of #217 was also checked --
AVE-2026-00045's real current text already draws the scoping-vs-
expiration line sharply, no change needed there.

Distinctness, checked by real field comparison, not label similarity:
- AVE-2026-00021 / AVE-2026-00063: active bypass of a check at the
  moment of action. This record bypasses nothing -- the grant is
  legitimate and simply never re-checked against its own closure.
- AVE-2026-00045: scope misuse within a still-valid grant, no elapsed
  time or external event required. This record is the inverse framing:
  used within scope, but past when closure should have ended it.
- AVE-2026-00050: an undeclared registration smuggled in at session
  init. This record's capability was legitimately declared and granted.

Framework mappings verified against primary sources directly, not
corpus precedent:
- owasp_mcp: MCP02 (Privilege Escalation via Scope Creep) -- its own
  detection checklist and remediation #3 (JIT access, revalidation for
  long-running tasks) name this exact gap.
- owasp_asi: ASI03 (Identity and Privilege Abuse) -- its own Common
  Example #4 is literally 'Time-of-Check to Time-of-Use (TOCTOU) in
  Agent Workflows', read directly from the primary 2026 PDF.
- mitre_atlas / nist_ai_rmf: checked directly (live ATLAS.yaml; NIST AI
  100-1 Tables 1-4) and left empty -- no clean fit at this mechanism's
  granularity, documented in aivss.notes rather than forced.

id confirmed via issue #268.

Includes:
- records/AVE-2026-00081.json
- tests/fixtures/AVE-2026-00081_{positive,negative}.md
- dist/ave-records-latest.json, .manifest.json (rebuilt from a clean
  copy of git-tracked records + this one, to avoid pulling in another
  session's concurrent, unreviewed work sitting untracked in the same
  working directory)
- CHANGELOG.md, README.md (record count, badge, table row)

Validated: python3 scripts/validate_records.py (82/82 -- includes the
concurrent session's untracked record on disk, harmless to the check),
check_fixtures.py, check_vulnerability_taxonomy.py --strict --only,
check_framework_sources.py --strict --only, write_verification_basis.py,
pytest tests/ -x -q (478 passed).
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.

AVE-2026-00081: Lingering authority -- a task-scoped capability outlives the episode that justified it

1 participant