Back to skill

Security audit

agent-bom

Security checks for vulnerabilities and agentic risk

Overview

This security scanner is purpose-aligned, but it should be reviewed because it installs and runs an unpinned external package before handling sensitive local agent configuration.

Review before installing. If you use it, pin the package to the reviewed version, prefer an isolated environment, verify the package with an independent trusted verifier before scanning configs, and run only the specific scan you need. Expect agent-bom agents to inspect many local AI tool configuration files, and expect CVE enrichment to disclose package names or CVE IDs to vulnerability databases. Confirm cloud, proxy, and dashboard actions explicitly.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (1)

T08 · Insecure Dependencies

Warning
Location
SKILL.md:378
Finding
Unpinned Third-Party Package Is Installed and Executed Before Verification<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:378-390` **Additional Locations**: `SKILL.md:212,228`; `analyze/SKILL.md:66`; `compliance/SKILL.md:113`; `discover/SKILL.md:108`; `enforce/SKILL.md:63`; `monitor/SKILL.md:61`; `registry/SKILL.md:67`; `runtime/SKILL.md:60`; `scan/SKILL.md:128,144,202`; `scan-infra/SKILL.md:111`; `troubleshoot/SKILL.md:59` **Vulnerability Type**: Unpinned and externally supplied executable dependency **Risk Level**: Medium ### Vulnerable Code The root Skill installs the package without a version or integrity constraint and verifies it only afterward: ```bash # Step 1: Install pip install agent-bom # Step 2: Review redaction logic BEFORE scanning # sanitize_env_vars() replaces ALL env var values with ***REDACTED*** # BEFORE any config data is processed or stored: # https://github.com/msaad00/agent-bom/blob/main/src/agent_bom/security.py#L159 # Step 3: Review config parsing — only structural data extracted: # https://github.com/msaad00/agent-bom/blob/main/src/agent_bom/discovery/__init__.py # Step 4: Verify package provenance (Sigstore) agent-bom verify agent-bom ``` The Skill also recommends unpinned installation elsewhere: ```bash pipx install agent-bom ``` It additionally supports executing the unpinned package through `uvx`: ```json { "mcpServers": { "agent-bom": { "command": "uvx", "args": ["agent-bom", "mcp", "server"] } } } ``` ### Technical Analysis The reviewed artifact contains only Skill documentation and does not include the Python implementation that performs scanning, redaction, configuration parsing, network communication, or cloud access. Instead, all operational behavior is delegated to the externally distributed `agent-bom` package. Although the metadata declares version `0.76.4`, the installation commands do not specify `agent-bom==0.76.4`, a cryptographic hash, or a locked dependency set. The `uvx` command is similarly unpinned. Package verification is performe ...[truncated 2745 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Pin every installation and execution instruction to the reviewed release: ```bash pipx install "agent-bom==0.76.4" pip install "agent-bom==0.76.4" uvx --from "agent-bom==0.76.4" agent-bom mcp server ``` 2. Verify the distribution before installing or importing it. Download the wheel without executing package code, validate a publisher signature or Sigstore attestation using an independent trusted verifier, and compare its SHA-256 digest against a digest recorded in the Skill. 3. Require hashes and locked transitive dependencies. Where supported, use a generated lock file and hash-enforced installation such as `pip install --require-hashes -r requirements.txt`. 4. Do not use the newly installed package to establish its own trust. Separate artifact verification from package execution and ensure the verifier is independently installed and pinned. 5. Include the reviewed implementation in the audit artifact or link the Skill to an immutable source commit and reproducible build provenance. Mutable `main` branch links should not be the security basis for redaction claims. 6. Run the scanner with least privilege: use an isolated environment, restrict filesystem access to explicitly approved paths, expose cloud credentials only for a confirmed cloud scan, and avoid providing unrelated secrets to the process. 7. Add automated checks that reject unpinned `pip`, `pipx`, and `uvx` examples whenever metadata declares a specific release. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (35)

Agent Config Directory Access

High
Category
Agent Snooping
Content
- "~/Library/Application Support/Claude/claude_desktop_config.json"
      - "~/.config/Claude/claude_desktop_config.json"
      # Claude Code
      - "~/.claude/settings.json"
      - "~/.claude.json"
      # Cursor
      - "~/.cursor/mcp.json"
Confidence
96% confidence
Finding
The skill explicitly declares access to local agent configuration files such as Claude settings, which can contain MCP server definitions, commands, URLs, and sometimes references to secrets or sensitive local tooling. Even if the stated intent is inventory and security scanning, broad automatic reads across many agent config locations materially increase exposure of sensitive local environment metadata and create privacy and reconnaissance risk if the tool is compromised or misused.

Agent Config Directory Access

High
Category
Agent Snooping
Content
# VS Code Copilot
      - "~/Library/Application Support/Code/User/mcp.json"
      # Codex CLI
      - "~/.codex/config.toml"
      # Gemini CLI
      - "~/.gemini/settings.json"
      # Goose
Confidence
96% confidence
Finding
Reading Codex CLI configuration from ~/.codex/config.toml is sensitive because such files may reveal model providers, endpoints, plugin/tool configuration, and environment variable references that help map the user's local agentic infrastructure. In a security scanner skill, this behavior is contextually expected, but it still creates a significant confidentiality risk because the scan reaches into private per-user configuration by default.

Agent Config Directory Access

High
Category
Agent Snooping
Content
# Codex CLI
      - "~/.codex/config.toml"
      # Gemini CLI
      - "~/.gemini/settings.json"
      # Goose
      - "~/.config/goose/config.yaml"
      # Continue
Confidence
96% confidence
Finding
Access to ~/.gemini/settings.json can expose private agent configuration, enabled tools, endpoints, and other local security-relevant metadata. The skill's stated purpose makes this behavior understandable, but enumerating and reading personal AI tool configs across the home directory remains a high-risk capability because it centralizes sensitive operational context.

Agent Config Directory Access

High
Category
Agent Snooping
Content
# Goose
      - "~/.config/goose/config.yaml"
      # Continue
      - "~/.continue/config.json"
      # Zed
      - "~/.config/zed/settings.json"
      # Roo Code
Confidence
96% confidence
Finding
Reading ~/.continue/config.json is a true security concern because Continue configs can describe models, endpoints, commands, and integration settings that reveal local attack surface and trust relationships. Although this is aligned with the scanner's inventory function, the breadth of cross-tool config harvesting amplifies the impact of any parsing bug, logging mistake, or future supply-chain compromise.

Ae1

High
Category
analysis-evasion
Content
skill_trust(skill_path="./SKILL.md")
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Agent Config Directory Access

High
Category
Agent Snooping
Content
- "~/Library/Application Support/Claude/claude_desktop_config.json"
      - "~/.config/Claude/claude_desktop_config.json"
      # Claude Code
      - "~/.claude/settings.json"
      - "~/.claude.json"
      # Cursor
      - "~/.cursor/mcp.json"
Confidence
90% confidence
Finding
Skill reads from agent configuration directories (.claude/, .codex/, .gemini/). These directories may contain API keys, personal settings, and other credentials that the skill has no legitimate need to access.

Agent Config Directory Access

High
Category
Agent Snooping
Content
# VS Code Copilot
      - "~/Library/Application Support/Code/User/mcp.json"
      # Codex CLI
      - "~/.codex/config.toml"
      # Gemini CLI
      - "~/.gemini/settings.json"
      # Goose
Confidence
90% confidence
Finding
Skill reads from agent configuration directories (.claude/, .codex/, .gemini/). These directories may contain API keys, personal settings, and other credentials that the skill has no legitimate need to access.

Agent Config Directory Access

High
Category
Agent Snooping
Content
# Codex CLI
      - "~/.codex/config.toml"
      # Gemini CLI
      - "~/.gemini/settings.json"
      # Goose
      - "~/.config/goose/config.yaml"
      # Continue
Confidence
90% confidence
Finding
Skill reads from agent configuration directories (.claude/, .codex/, .gemini/). These directories may contain API keys, personal settings, and other credentials that the skill has no legitimate need to access.

Agent Config Directory Access

High
Category
Agent Snooping
Content
# Goose
      - "~/.config/goose/config.yaml"
      # Continue
      - "~/.continue/config.json"
      # Zed
      - "~/.config/zed/settings.json"
      # Roo Code
Confidence
90% confidence
Finding
Skill reads from agent configuration directories (.claude/, .codex/, .gemini/). These directories may contain API keys, personal settings, and other credentials that the skill has no legitimate need to access.

MCP Config Access

High
Category
Agent Snooping
Content
# Check configuration health and prerequisites
agent-bom doctor

# List MCP server inventory
agent-bom mcp inventory

# Show all discovery paths
Confidence
80% confidence
Finding
Skill accesses MCP server configuration files (mcp.json). MCP configs contain server URLs, authentication tokens, and tool definitions — reading them allows the skill to discover and potentially abuse other tool integrations.

Agent Config Directory Access

High
Category
Agent Snooping
Content
- "~/Library/Application Support/Claude/claude_desktop_config.json"
      - "~/.config/Claude/claude_desktop_config.json"
      # Claude Code
      - "~/.claude/settings.json"
      - "~/.claude.json"
      # Cursor
      - "~/.cursor/mcp.json"
Confidence
91% confidence
Finding
The skill declares access to local agent configuration files under the user's home directory, which may contain sensitive metadata such as MCP server definitions, local commands, URLs, and potentially security-relevant integration settings. Even if the stated intent is security discovery, reading broad config locations expands exposure to confidential local environment details and increases the blast radius if the tool mishandles parsing, logging, or downstream transmission.

Agent Config Directory Access

High
Category
Agent Snooping
Content
# VS Code Copilot
      - "~/Library/Application Support/Code/User/mcp.json"
      # Codex CLI
      - "~/.codex/config.toml"
      # Gemini CLI
      - "~/.gemini/settings.json"
      # Goose
Confidence
91% confidence
Finding
Access to ~/.codex/config.toml can expose local agent tooling configuration, endpoints, command paths, and other operational details that are sensitive in aggregate. In a security-scanning skill this access is contextually relevant, but it remains a real privacy and security risk because it touches user-specific configuration outside the immediate working directory.

Agent Config Directory Access

High
Category
Agent Snooping
Content
# Codex CLI
      - "~/.codex/config.toml"
      # Gemini CLI
      - "~/.gemini/settings.json"
      # Goose
      - "~/.config/goose/config.yaml"
      # Continue
Confidence
91% confidence
Finding
Reading ~/.gemini/settings.json exposes another assistant's local configuration and may reveal server endpoints, tool wiring, or other environment-specific information useful to an attacker or inappropriate to inspect without consent. The fact that this skill inventories agent infrastructure makes the access more understandable, but also means broad cross-tool discovery materially increases sensitivity.

Agent Config Directory Access

High
Category
Agent Snooping
Content
# Goose
      - "~/.config/goose/config.yaml"
      # Continue
      - "~/.continue/config.json"
      # Zed
      - "~/.config/zed/settings.json"
      # Roo Code
Confidence
91% confidence
Finding
Scanning ~/.continue/config.json similarly reaches into local agent configuration that may contain private topology and integration data. This is not obviously malicious, but it is a true overbroad local data access risk because the skill is authorized to inspect a wide set of unrelated application configs by default.

External Transmission

Medium
Category
Data Exfiltration
Content
- "user-provided SKILL.md files (for skill_trust analysis)"
    file_writes: []
    network_endpoints:
      - url: "https://api.osv.dev/v1"
        purpose: "OSV vulnerability database — batch CVE lookup for packages"
        auth: false
      - url: "https://services.nvd.nist.gov/rest/json/cves/2.0"
Confidence
90% confidence
Finding
The skill declares outbound connections to external vulnerability services, which creates a real data exposure boundary even if it claims to transmit only package names and CVE IDs. In a tool that scans local configs and software inventories, sending package metadata off-host can reveal aspects of the user's environment, installed stack, or security posture to third parties.

External Transmission

Medium
Category
Data Exfiltration
Content
- url: "https://services.nvd.nist.gov/rest/json/cves/2.0"
        purpose: "NVD secondary enrichment — adds CWE IDs, dates, references (no key required)"
        auth: false
      - url: "https://api.first.org/data/v1/epss"
        purpose: "EPSS exploit probability scores"
        auth: false
      - url: "https://api.github.com/advisories"
Confidence
88% confidence
Finding
Sending CVE or package context to EPSS introduces another third-party egress path and expands the set of external services learning about scanned software components. While this is common for enrichment, it still increases privacy and operational security risk, particularly in enterprise or sensitive environments where software inventory itself is confidential.

External Transmission

Medium
Category
Data Exfiltration
Content
- url: "https://api.first.org/data/v1/epss"
        purpose: "EPSS exploit probability scores"
        auth: false
      - url: "https://api.github.com/advisories"
        purpose: "GitHub Security Advisories — supplemental CVE lookup"
        auth: false
      - url: "https://api.snyk.io"
Confidence
88% confidence
Finding
GitHub advisory lookups are a legitimate scanner feature, but they are still an external transmission vector that can disclose package usage and timing of scans to a third party. Because this skill also performs broad local discovery, the surrounding context makes any outbound metadata sharing more sensitive than a narrow single-package checker.

External Transmission

Medium
Category
Data Exfiltration
Content
file_reads: []
    file_writes: []
    network_endpoints:
      - url: "https://api.first.org/data/v1/epss"
        purpose: "EPSS exploit probability scores for CVEs found in scan"
        auth: false
      - url: "https://api.osv.dev/v1"
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
file_reads: []
    file_writes: []
    network_endpoints:
      - url: "https://api.first.org/data/v1/epss"
        purpose: "EPSS exploit probability scores for CVEs found in scan"
        auth: false
      - url: "https://api.osv.dev/v1"
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
- url: "https://api.first.org/data/v1/epss"
        purpose: "EPSS exploit probability scores for CVEs found in scan"
        auth: false
      - url: "https://api.osv.dev/v1"
        purpose: "OSV vulnerability database — CVE detail lookup"
        auth: false
    telemetry: false
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
- url: "https://api.first.org/data/v1/epss"
        purpose: "EPSS exploit probability scores for CVEs found in scan"
        auth: false
      - url: "https://api.osv.dev/v1"
        purpose: "OSV vulnerability database — CVE detail lookup"
        auth: false
    telemetry: false
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Vague Triggers

Medium
Confidence
94% confidence
Finding
The manifest description lists "proxy" as a standalone invocation phrase, and the body repeats "proxy" / "MCP proxy" as when-to-use triggers. On its own, "proxy" is ambiguous and could match many unrelated user requests, increasing the risk of unintended invocation.

Vague Triggers

Medium
Confidence
88% confidence
Finding
The file uses "apply policy" and "policy enforcement" as activation language, but these phrases are generic and could refer to many unrelated organizational, security, or application policies. The trigger scope is not tightly constrained to MCP runtime enforcement in the invocation wording itself.

Vague Triggers

Medium
Confidence
93% confidence
Finding
The manifest's 'when' description uses ambiguous phrases like 'fleet', 'watch agents', and 'serve dashboard' without enough scope constraints, which weakens routing precision. In an agent environment, this can lead to over-selection of the skill for generic requests and may surface local-serving behavior in contexts where the user did not intend to run monitoring software.

Vague Triggers

Medium
Confidence
95% confidence
Finding
The trigger phrases are broad enough to match common operational language such as 'fleet', 'runtime status', or 'trust scores' without requiring clear security-scanning intent. This can cause the skill to activate in unrelated contexts and recommend or initiate actions like starting a local dashboard server, increasing the chance of unintended tool use or confusing security-relevant workflows.

Static analysis

No suspicious patterns detected.