@cyclonedx/cdxgen
Version:
Creates CycloneDX Software Bill of Materials (SBOM) from source or container image
266 lines (259 loc) • 10.1 kB
YAML
- id: AGT-001
name: "AI agent instruction file contains hidden Unicode characters"
description: "Hidden Unicode in AI agent instructions or skill files can conceal misleading prompts, hidden tool behavior, or review-evasion content."
severity: medium
category: ai-agent
dry-run-support: full
standards:
owasp-ai-top-10:
- "LLM05: Supply Chain Vulnerabilities"
- "LLM03:2025 Supply Chain"
nist-ai-rmf:
- "Govern"
- "Manage"
nist-ssdf:
- "Review and protect build and automation instructions"
condition: |
formulation.components[
$prop($, 'cdx:agent:inventorySource') = 'agent-file'
and $prop($, 'cdx:file:hasHiddenUnicode') = 'true'
]
location: |
{
"bomRef": $."bom-ref",
"file": $prop($, 'SrcFile')
}
message: "AI agent file '{{ name }}' contains hidden Unicode characters"
mitigation: "Review the file with hidden-character rendering enabled, remove suspicious bidirectional or zero-width characters, and verify instruction blocks before merge."
evidence: |
{
"codePoints": $prop($, 'cdx:file:hiddenUnicodeCodePoints'),
"lineNumbers": $prop($, 'cdx:file:hiddenUnicodeLineNumbers'),
"inComments": $prop($, 'cdx:file:hiddenUnicodeInComments')
}
- id: AGT-002
name: "AI agent instructions reference a public MCP endpoint without auth hints"
description: "Public MCP endpoints referenced from agent or skill files deserve review when the instruction surface does not indicate any bearer, token, or OAuth controls."
severity: high
category: ai-agent
dry-run-support: full
attack:
tactics: [TA0001]
techniques: [T1190]
standards:
owasp-ai-top-10:
- "LLM07: Insecure Plugin Design"
- "LLM08: Excessive Agency"
- "LLM06:2025 Excessive Agency"
nist-ai-rmf:
- "Map"
- "Manage"
nist-ssdf:
- "Review externally reachable AI and automation interfaces"
condition: |
formulation.components[
$prop($, 'cdx:agent:inventorySource') = 'agent-file'
and $prop($, 'cdx:agent:hasPublicMcpEndpoint') = 'true'
and $nullSafeProp($, 'cdx:agent:authHints') = ''
]
location: |
{
"bomRef": $."bom-ref",
"file": $prop($, 'SrcFile')
}
message: "AI agent file '{{ name }}' references a public MCP endpoint without any auth hints"
mitigation: "Treat public MCP endpoints as untrusted until authentication, authorization, and endpoint provenance are documented explicitly."
evidence: |
{
"hiddenMcpUrls": $prop($, 'cdx:agent:hiddenMcpUrls'),
"hiddenMcpHosts": $prop($, 'cdx:agent:hiddenMcpHosts'),
"providerNames": $prop($, 'cdx:agent:providerNames')
}
- id: AGT-003
name: "AI agent instructions reference MCP surfaces not declared elsewhere in the BOM"
description: "Agent files that mention MCP servers, packages, or endpoints without corresponding MCP package inventory or source-derived MCP services can hide runtime trust dependencies from reviewers."
severity: medium
category: ai-agent
dry-run-support: full
standards:
owasp-ai-top-10:
- "LLM05: Supply Chain Vulnerabilities"
- "LLM08: Excessive Agency"
- "LLM03:2025 Supply Chain"
- "LLM06:2025 Excessive Agency"
nist-ai-rmf:
- "Map"
- "Govern"
nist-ssdf:
- "Maintain complete third-party and runtime dependency inventory"
condition: |
formulation.components[
$prop($, 'cdx:agent:inventorySource') = 'agent-file'
and $prop($, 'cdx:agent:hasMcpReferences') = 'true'
and $count($$.components[$prop($, 'cdx:mcp:package') = 'true']) = 0
and $count($auditServices($$)[$nullSafeProp($, 'cdx:mcp:inventorySource') = 'source-code-analysis']) = 0
]
location: |
{
"bomRef": $."bom-ref",
"file": $prop($, 'SrcFile')
}
message: "AI agent file '{{ name }}' references MCP surfaces that are not otherwise declared in the BOM"
mitigation: "Inventory the referenced MCP packages, endpoints, and trust boundaries explicitly so reviewers can validate provenance and access controls."
evidence: |
{
"mcpPackageRefs": $prop($, 'cdx:agent:mcpPackageRefs'),
"hiddenMcpUrls": $prop($, 'cdx:agent:hiddenMcpUrls'),
"hiddenComponentKinds": $prop($, 'cdx:agent:hiddenComponentKinds')
}
- id: AGT-004
name: "AI agent instructions reference tunneled or reverse-proxied MCP exposure"
description: "Localhost tunneling and reverse-proxy references in agent files can turn development-only MCP servers into remotely reachable control surfaces."
severity: high
category: ai-agent
dry-run-support: full
attack:
tactics: [TA0001, TA0011]
techniques: [T1190, T1071]
standards:
owasp-ai-top-10:
- "LLM07: Insecure Plugin Design"
- "LLM08: Excessive Agency"
- "LLM06:2025 Excessive Agency"
nist-ai-rmf:
- "Map"
- "Manage"
nist-ssdf:
- "Review externally reachable development interfaces"
condition: |
formulation.components[
$prop($, 'cdx:agent:inventorySource') = 'agent-file'
and $prop($, 'cdx:agent:hasTunnelReference') = 'true'
]
location: |
{
"bomRef": $."bom-ref",
"file": $prop($, 'SrcFile')
}
message: "AI agent file '{{ name }}' references a tunneled or reverse-proxied MCP endpoint"
mitigation: "Avoid exposing localhost MCP servers through ad-hoc tunnels; require reviewed ingress, authentication, and environment-specific controls."
evidence: |
{
"hiddenMcpUrls": $prop($, 'cdx:agent:hiddenMcpUrls'),
"hiddenMcpHosts": $prop($, 'cdx:agent:hiddenMcpHosts')
}
- id: AGT-005
name: "AI agent instructions reference non-official MCP packages or wrappers"
description: "Non-official MCP wrappers referenced directly from agent instructions deserve extra review before they are trusted in developer tooling or automation flows."
severity: medium
category: ai-agent
dry-run-support: full
standards:
owasp-ai-top-10:
- "LLM05: Supply Chain Vulnerabilities"
- "LLM07: Insecure Plugin Design"
- "LLM03:2025 Supply Chain"
nist-ai-rmf:
- "Govern"
- "Map"
nist-ssdf:
- "Verify provenance of third-party AI integrations"
condition: |
formulation.components[
$prop($, 'cdx:agent:inventorySource') = 'agent-file'
and $prop($, 'cdx:agent:hasNonOfficialMcpReference') = 'true'
]
location: |
{
"bomRef": $."bom-ref",
"file": $prop($, 'SrcFile')
}
message: "AI agent file '{{ name }}' references non-official MCP packages or wrappers"
mitigation: "Prefer official MCP SDKs where possible and document provenance, version pinning, and trust assumptions for any wrapper packages."
evidence: |
{
"mcpPackageRefs": $prop($, 'cdx:agent:mcpPackageRefs'),
"hiddenComponentKinds": $prop($, 'cdx:agent:hiddenComponentKinds')
}
- id: AGT-006
name: "AI agent instructions contain inline credential patterns"
description: "Agent or skill files that embed bearer tokens, API keys, or similar secrets create immediate review and credential-rotation risk."
severity: critical
category: ai-agent
dry-run-support: full
attack:
tactics: [TA0006]
techniques: [T1552]
standards:
owasp-ai-top-10:
- "LLM05: Supply Chain Vulnerabilities"
- "LLM07: Insecure Plugin Design"
- "LLM03:2025 Supply Chain"
nist-ai-rmf:
- "Govern"
- "Manage"
nist-ssdf:
- "Protect secrets used by AI automation and developer tooling"
condition: |
formulation.components[
$prop($, 'cdx:agent:inventorySource') = 'agent-file'
and $prop($, 'cdx:agent:credentialExposure') = 'true'
]
location: |
{
"bomRef": $."bom-ref",
"file": $prop($, 'SrcFile')
}
message: "AI agent file '{{ name }}' contains inline credential patterns"
mitigation: "Remove embedded credentials from agent instructions and move them into reviewed secret-management flows before the file is shared or executed."
evidence: |
{
"credentialRiskIndicators": $prop($, 'cdx:agent:credentialRiskIndicators'),
"hiddenMcpUrls": $prop($, 'cdx:agent:hiddenMcpUrls'),
"providerNames": $prop($, 'cdx:agent:providerNames')
}
- id: AGT-007
name: "AI agent or skill file is included in a build or post-build SBOM"
description: "Shipped AI instruction and skill files deserve explicit review because they can alter developer tooling, release-time automation, and downstream runtime behavior."
severity: medium
category: ai-agent
dry-run-support: full
standards:
owasp-ai-top-10:
- "LLM05: Supply Chain Vulnerabilities"
- "LLM08: Excessive Agency"
- "LLM03:2025 Supply Chain"
- "LLM06:2025 Excessive Agency"
nist-ai-rmf:
- "Govern"
- "Map"
nist-ssdf:
- "Review build and release instructions before distribution"
condition: |
components[
(
$prop($, 'cdx:agent:inventorySource') = 'agent-file'
or $prop($, 'cdx:agent:inventorySource') = 'community-config'
)
and (
$prop($, 'cdx:file:kind') = 'skill-file'
or $prop($, 'cdx:file:kind') = 'agent-instructions'
or $prop($, 'cdx:file:kind') = 'copilot-instructions'
or $prop($, 'cdx:file:kind') = 'copilot-setup-workflow'
or $prop($, 'cdx:file:kind') = 'ai-agent-file'
)
and $count($$.metadata.lifecycles[phase = 'build' or phase = 'post-build']) > 0
]
location: |
{
"bomRef": $."bom-ref",
"file": $prop($, 'SrcFile')
}
message: "AI instruction or skill file '{{ name }}' is included in a build/post-build SBOM"
mitigation: "If the file must ship, keep the BOM review-friendly with '--bom-audit --bom-audit-categories ai-agent' and consider '--tlp-classification AMBER'. If you want a package-only BOM, rerun with '--exclude-type ai-skill'."
evidence: |
{
"inventorySource": $prop($, 'cdx:agent:inventorySource'),
"fileKind": $prop($, 'cdx:file:kind'),
"providerNames": $prop($, 'cdx:agent:providerNames')
}