feat: AVE-2026-00076 -- natural-language steering of an approval classifier subagent - #141
Merged
Merged
Conversation
…assifier subagent Cursor's Auto-review mode gates unattended shell/MCP/Fetch tool calls behind a classifier subagent, a separate LLM invocation from the primary coding agent. A committed per-repo permissions.json can steer that classifier via free-form natural-language allow_instructions/ block_instructions text -- Cursor's own docs frame this explicitly as "steering, not enforcement." Confirmed distinct from AVE-2026-00021 (an instruction embedded in a skill's own content, read directly by the primary agent) and AVE-2026-00063 (a deterministic boolean flag, independent of any instruction text): here natural language is the payload, like 00021, but the target is a separate AI classifier rather than the primary agent, and the effect is probabilistic steering rather than a hard bypass. Flagged by predictor2718 in cfgaudit PR #123. Verified against Cursor's own permissions.json reference and Auto-review changelog before drafting, per the mechanical growth-discipline test.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
permissions.jsoncan declare free-form natural-languageallow_instructions/block_instructionsthat steer -- but do not deterministically control -- that classifier's decision. Cursor's own docs: a matchingallow_instructionsentry "still goes through the safety check," and a matchingblock_instructionsentry "can still be approved when Cursor insists" -- explicitly "steering, not enforcement."AVE-2026-00021andAVE-2026-00063. Per the brief, verification came before drafting:aivss.notes.provenance_vectorfor both comparators.AVE-2026-00021's payload is instruction text read by the primary agent (entry_class: content).AVE-2026-00063's payload is a boolean flag, explicitly independent of instruction text (entry_class: registry_metadata,natural_language_input: 0). This class's payload is natural language (like 00021) but targets a separate classifier (unlike both) -- a real, defensibleentry_classdifference (operator_config), not a relabeling. Genuine third category confirmed.cvss_base8.5,aars6.0 --multi_agentscored at genuine maximum since this is definitionally a two-agent mechanism,non_determinismat maximum per Cursor's own "steering not enforcement" framing).mitre_atlas: AML.T0015 (Evade AI Model) verified as the precise fit -- adversarial natural language crafted to fool the classifier subagent's own judgment on its intended input channel, distinct from AML.T0051 (Prompt Injection), which targets causing an LLM to act on injected instructions from an untrusted side-channel.Note on the batch's other candidate (Record 1, cleartext endpoint)
Per the same brief, I also checked a second candidate (a committed
http://URL for an MCP server / model base URL /agent_card_url) againstAVE-2026-00061as instructed, confirmed genuinely distinct from that record -- but a corpus-wide keyword sweep (not just the one named comparator) surfacedAVE-2026-00073, whosedetection_methodology,indicators_of_compromise, andremediationalready explicitly cover "reject cleartext http:// destinations... regardless of whether the host itself is otherwise legitimate." That candidate is not being drafted as a new record; reporting this honestly rather than drafting a duplicate.Test plan
python3 scripts/validate_records.py-- 76/76 records validpython3 scripts/check_fixtures.py-- all records have positive + negative fixturespytest tests/ -x -q-- 305 passednode scripts/build-records.js-- dist regenerated, frozen v1.1.0 snapshot untouched