Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
192 changes: 117 additions & 75 deletions crosswalks/cfgaudit-to-ave.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,26 +3,26 @@
"source": {
"tool": "cfgaudit",
"vendor": "cfgaudit",
"version": "1.10.0",
"version": "1.11.0",
"url": "https://github.com/cfgaudit/cfgaudit",
"license": "Apache-2.0",
"tool_class": "static configuration auditor",
"rules_total": 92,
"rules_mapped": 35
"rules_total": 97,
"rules_mapped": 53
},
"target": {
"standard": "AVE",
"version": "1.1.0",
"url": "https://aveproject.org",
"record_count": 59,
"static_record_count": 44
"record_count": 70,
"static_record_count": 51
},
"generated": "2026-07-25",
"note": "cfgaudit is a static auditor of committable AI-agent CONFIGURATION files. It does not connect to running servers or observe runtime, so it maps only to AVE's static_detection records. Each cfgaudit rule emits its primary AVE id in JSON/SARIF output (see github.com/cfgaudit/cfgaudit/blob/main/docs/cfgaudit-to-ave.md). Mappings are class-level behavioral equivalence, not asserted identity. cfgaudit maps 35 config-surface rules onto 19 AVE behavioral classes (many-to-one: several rules per class, since cfgaudit slices threats by config surface where AVE slices by behavior). AVE-2026-00036 (lateral movement) was implemented and then reverted after a false-positive analysis; see gaps.",
"generated": "2026-08-05",
"note": "cfgaudit is a static auditor of committable AI-agent CONFIGURATION files. It does not connect to running servers or observe runtime, so it maps only to AVE's static_detection records. Each cfgaudit rule emits its primary AVE id in JSON/SARIF output (see github.com/cfgaudit/cfgaudit/blob/main/docs/cfgaudit-to-ave.md). Mappings are class-level behavioral equivalence, not asserted identity. cfgaudit now maps 53 config-surface rules onto 23 AVE behavioral classes, up from 35 onto 19 at v1.10.0. Most of that growth is not new cfgaudit rules: it is previously unmapped rules finding a home in AVE-2026-00061 through AVE-2026-00064, the four config classes AVE added from this crosswalk's own gap list (aveproject/ave#68). CFG091 moved from AVE-2026-00021 to AVE-2026-00063: 00021 describes a component that explicitly INSTRUCTS the agent to bypass confirmation, while qwen's tools.approvalMode is a setting, which is what 00063 covers 'independent of any instruction text'.",
"mappings": [
{
"ave_id": "AVE-2026-00003",
"title": "credential exfiltration",
"title": "Credential exfiltration via agent instruction",
"cfgaudit_rules": [
"CFG031",
"CFG036",
Expand All @@ -32,123 +32,123 @@
},
{
"ave_id": "AVE-2026-00004",
"title": "shell-pipe code execution",
"title": "Arbitrary code execution via shell pipe injection in agentic component",
"cfgaudit_rules": [
"CFG008",
"CFG014"
]
},
{
"ave_id": "AVE-2026-00005",
"title": "recursive filesystem destruction",
"title": "Recursive file system destruction via destructive command injection in agentic component",
"cfgaudit_rules": [
"CFG039"
]
},
{
"ave_id": "AVE-2026-00007",
"title": "prompt-injection goal hijack",
"title": "Agent goal hijack via direct instruction override in agentic component",
"cfgaudit_rules": [
"CFG026",
"CFG092"
]
},
{
"ave_id": "AVE-2026-00008",
"title": "persistence / self-replication",
"title": "Agent persistence via self-replication instruction in agentic component",
"cfgaudit_rules": [
"CFG027",
"CFG028"
]
},
{
"ave_id": "AVE-2026-00010",
"title": "covert instruction concealment",
"title": "Covert instruction concealment via secrecy directive in agentic component",
"cfgaudit_rules": [
"CFG030"
]
},
{
"ave_id": "AVE-2026-00011",
"title": "dynamic tool-call injection",
"title": "Arbitrary tool invocation via dynamic tool call injection in agentic component",
"cfgaudit_rules": [
"CFG035"
]
},
{
"ave_id": "AVE-2026-00017",
"title": "server impersonation / spoofing",
"title": "MCP Server Impersonation or Spoofing",
"cfgaudit_rules": [
"CFG052",
"CFG059"
]
},
{
"ave_id": "AVE-2026-00021",
"title": "autonomous action without confirmation",
"title": "Autonomous Action Without User Confirmation",
"cfgaudit_rules": [
"CFG029",
"CFG091"
"CFG029"
]
},
{
"ave_id": "AVE-2026-00025",
"title": "conversation-history / role injection",
"title": "Conversation History Injection",
"cfgaudit_rules": [
"CFG032"
]
},
{
"ave_id": "AVE-2026-00027",
"title": "multi-turn instruction persistence",
"title": "Multi-Turn Attack - Instruction Persistence Across Conversations",
"cfgaudit_rules": [
"CFG081"
]
},
{
"ave_id": "AVE-2026-00029",
"title": "homoglyph / Unicode obfuscation",
"title": "Homoglyph or Unicode Obfuscation Attack",
"cfgaudit_rules": [
"CFG024"
]
},
{
"ave_id": "AVE-2026-00032",
"title": "network reconnaissance instruction",
"title": "Network Reconnaissance Instruction",
"cfgaudit_rules": [
"CFG090"
]
},
{
"ave_id": "AVE-2026-00039",
"title": "covert-channel exfiltration",
"title": "Covert Channel - Steganographic Data Exfiltration",
"cfgaudit_rules": [
"CFG033",
"CFG072"
]
},
{
"ave_id": "AVE-2026-00047",
"title": "hardcoded credentials in component",
"title": "Hardcoded credentials in agent component - API keys and secrets exposed in skill files",
"cfgaudit_rules": [
"CFG007",
"CFG050",
"CFG054",
"CFG065",
"CFG073"
"CFG073",
"CFG097"
]
},
{
"ave_id": "AVE-2026-00048",
"title": "unsafe agent delegation chain",
"title": "Unsafe agent delegation chain - sub-agent spawned with inherited permissions and no trust boundary",
"cfgaudit_rules": [
"CFG051",
"CFG085"
]
},
{
"ave_id": "AVE-2026-00055",
"title": "command exec via untrusted MCP launch config",
"title": "Command execution via untrusted MCP server launch configuration (STDIO)",
"cfgaudit_rules": [
"CFG019",
"CFG020",
Expand All @@ -157,17 +157,59 @@
},
{
"ave_id": "AVE-2026-00057",
"title": "obfuscated/encoded payload",
"title": "Obfuscated or encoded skill payload designed to evade static scanners",
"cfgaudit_rules": [
"CFG057"
]
},
{
"ave_id": "AVE-2026-00058",
"title": "deceptive trigger / activation-scope",
"title": "Deceptive skill trigger or activation-scope manipulation via misleading manifest description",
"cfgaudit_rules": [
"CFG056"
]
},
{
"ave_id": "AVE-2026-00061",
"title": "TLS certificate verification disabled in agent component configuration",
"cfgaudit_rules": [
"CFG075"
]
},
{
"ave_id": "AVE-2026-00062",
"title": "Unpinned dependency version allowing supply chain substitution",
"cfgaudit_rules": [
"CFG010",
"CFG055",
"CFG074",
"CFG089"
]
},
{
"ave_id": "AVE-2026-00063",
"title": "Human approval gate bypassed via declarative configuration, distinct from AVE-2026-00048",
"cfgaudit_rules": [
"CFG003",
"CFG004",
"CFG048",
"CFG053",
"CFG063",
"CFG079",
"CFG087",
"CFG091",
"CFG093",
"CFG096"
]
},
{
"ave_id": "AVE-2026-00064",
"title": "Zero-click code execution via project-load auto-run configuration",
"cfgaudit_rules": [
"CFG047",
"CFG067",
"CFG086"
]
}
],
"gaps": [
Expand All @@ -177,19 +219,31 @@
},
{
"ave_id": "AVE-2026-00036",
"note": "lateral movement. cfgaudit implemented and then reverted this rule. The vocabulary ('lateral movement', 'pivot to other systems') is intent-ambiguous, appearing in security-tool self-description and defensive contexts a static linter cannot distinguish from a directive. The reverted rule used the CFG091 id, which cfgaudit has since reused for the qwen approval-mode rule (mapped to AVE-2026-00021)."
"note": "lateral movement. cfgaudit implemented and then reverted this rule. The vocabulary ('lateral movement', 'pivot') appears in ordinary security tooling and infrastructure docs, so the false-positive rate was unacceptable for a static config check."
},
{
"ave_id": "AVE-2026-00059",
"note": "fragmented cross-description injection. Needs multi-source correlation; cfgaudit checks each file in isolation."
"note": "fragmented cross-description injection. Needs multi-source correlation; cfgaudit checks each file independently."
},
{
"ave_id": "AVE-2026-00065",
"note": "A2A agent card poisoning. cfgaudit reaches the committed pointer but not the card. A .gemini/agents/*.md may carry an inline agent_card_json, which cfgaudit recognises well enough to classify the file as a remote agent, but it does not audit the card's contents. It does flag a cleartext agent_card_url and a credential literal in the same file's auth block (CFG097)."
},
{
"ave_id": "AVE-2026-00060",
"note": "STDIO transport shell injection. Server-side implementation flaw, requires SAST of the MCP server source rather than reading its launch configuration. Same layer as AVE-2026-00052 and AVE-2026-00053; see the static_detection note below."
},
{
"ave_id": "AVE-2026-00069",
"note": "image-hidden instructions in a skill package. Requires binary content analysis of a bundled image; cfgaudit reads text configuration only. Same layer as AVE-2026-00024."
}
],
"coverage": {
"ave_static_records": 44,
"cfgaudit_rules_total": 92,
"cfgaudit_rules_mapped": 35,
"ave_classes_covered": 19,
"cfgaudit_rules_unmapped": 57
"ave_static_records": 51,
"cfgaudit_rules_total": 97,
"cfgaudit_rules_mapped": 53,
"ave_classes_covered": 23,
"cfgaudit_rules_unmapped": 44
},
"validation": {
"against": {
Expand All @@ -199,57 +253,37 @@
"method": "same SKILL.md per rule, cfgaudit canonical triggers unmodified, static engines only (pattern+yara+semgrep, no LLM), both reading ave_id from JSON",
"shared_surface_rules": 10,
"agreements": 5,
"note": "5 of the 10 instruction-content rules that share a scan surface with Bawbel: both scanners independently emit the same ave_id. The 5 divergences are detection-pattern differences, not mapping errors."
"note": "5 of the 10 instruction-content rules that share a scan surface with Bawbel: both scanners independently emit the same ave_id. The 5 divergences are detection-pattern differences, not mapping errors. Re-checked at cfgaudit v1.11.0 against AVE record set 1.1.0 (70 records). A false-positive pass over 432 real repositories preceded this release and changed two rules, neither of them mapped: CFG015 and CFG009 stopped firing on hook idioms, and a Cursor build-cache warning was withdrawn."
},
"config_surfaces_beyond_ave": [
{
"surface": "permission / approval config",
"example_rules": [
"CFG001",
"CFG003",
"CFG004",
"CFG048",
"CFG079"
]
},
{
"surface": "zero-click IDE / workspace auto-run",
"example_rules": [
"CFG047",
"CFG067",
"CFG086",
"CFG087"
]
},
{
"surface": "telemetry / endpoint redirect",
"example_rules": [
"CFG005",
"CFG046",
"CFG071"
]
],
"note": "Still open. Distinct from AVE-2026-00002: nothing is injected into the model's context. A committed key/value changes where the process sends data, and the model never sees it, so detection is a value comparison rather than content analysis. OTEL_EXPORTER_OTLP_*ENDPOINT to a non-local collector, ANTHROPIC_BASE_URL off Anthropic (CVE-2026-21852), a model or provider base URL over cleartext http."
},
{
"surface": "sandbox weakening in config",
"example_rules": [
"CFG022",
"CFG061",
"CFG064"
]
},
{
"surface": "TLS verification disabled",
"example_rules": [
"CFG075"
]
"CFG064",
"CFG079",
"CFG095"
],
"note": "Still open. sandbox.excludedCommands with a wildcard or shell, bwrapPath/socatPath helper substitution, network.allowUnixSockets naming docker.sock, filesystem.allowWrite on $PATH or a shell rc; Gemini tools.sandboxAllowedPaths exposing / or ~; Codex sandbox_mode danger-full-access and [sandbox_workspace_write] network_access; Cursor .cursor/sandbox.json type insecure_none and an inverted networkPolicy."
},
{
"surface": "container / daemon posture",
"example_rules": [
"CFG082",
"CFG083",
"CFG084"
]
"CFG084",
"CFG083"
],
"note": "Still open, and it is THREE mechanisms with no shared detection logic, not one class. (1) daemon redirected off-host: DOCKER_HOST or a -H/--host flag pointing at a remote tcp:// or ssh:// daemon. (2) image trust verification disabled: DOCKER_CONTENT_TRUST=0, --disable-content-trust, --insecure-registry. (3) browser subprocess replaced: an MCP server's args carrying --utility-cmd-prefix, --renderer-cmd-prefix, --gpu-launcher or --browser-subprocess-path. The first is the highest-value single record."
},
{
"surface": "MCP network / transport posture",
Expand All @@ -259,16 +293,24 @@
"CFG058",
"CFG021",
"CFG069"
]
],
"note": "Still open, and likewise a surface rather than a class: FIVE mechanisms. Bind address 0.0.0.0 or [::] (NeighborJack); a wildcard CORS origin in env, escalating when auth is disabled in the same env (CVE-2026-33010); type sse, the deprecated transport; HTTP_PROXY/HTTPS_PROXY/ALL_PROXY resolving off loopback; HTTP transport enabled without log redaction, so request bodies with bearer tokens reach the logs (CVE-2026-42282, CVE-2026-41495). The bind-all case is the highest-value single record."
},
{
"surface": "supply-chain pinning / plugin auto-install",
"surface": "cleartext endpoint, distinct from TLS verification disabled",
"example_rules": [
"CFG010",
"CFG055",
"CFG074",
"CFG089"
]
"CFG049",
"CFG071",
"CFG097"
],
"note": "New in this revision, and it has no class in either direction. AVE-2026-00061 covers verification being switched off; this is the case where there is no TLS at all. A committed http:// MCP server URL, model base URL, or A2A agent_card_url."
},
{
"surface": "natural-language steering of an approval classifier",
"example_rules": [
"CFG094"
],
"note": "New in this revision. Cursor's .cursor/permissions.json autoRun.allow_instructions is prose the repository feeds to the classifier that decides, in Auto-review mode, whether a tool call runs without asking. It falls between AVE-2026-00063, which is explicitly 'independent of any instruction text', and AVE-2026-00021, which is an instruction to the agent rather than to a gatekeeper."
}
]
}
Loading
Loading