Back to skill

Security audit

vmware-nsx

Security checks for vulnerabilities and agentic risk

Overview

This skill is transparent about managing VMware NSX, but it grants high-impact network write access with local credential storage and MCP write tools that execute without a built-in confirmation gate.

Review before installing in production. Use a read-only or narrowly scoped NSX service account unless writes are required, avoid storing production passwords in ~/.vmware-nsx/.env when a secret manager can inject them, keep TLS verification enabled, configure deny rules for production targets, and prefer CLI dry-run/double-confirm workflows for changes. Treat MCP write tools as capable of immediate real network changes once called.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • 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
Findings (2)

T08 · Insecure Dependencies

Warning
Location
SKILL.md:11
Finding
Privileged functionality is delegated to an externally retrieved package without locally verifiable integrity<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:11-12`, `SKILL.md:53-57`, and `references/setup-guide.md:15-31` **Vulnerability Type**: Supply-chain integrity and auditability weakness **Risk Level**: Medium ### Vulnerable Code ```yaml installer: kind: uv package: vmware-nsx-mgmt ``` ```bash uv tool install vmware-nsx-mgmt==1.9.0 vmware-nsx init vmware-nsx doctor ``` The setup guide also permits installation through multiple external retrieval paths: ```bash uv tool install vmware-nsx-mgmt==1.9.0 ``` ```bash pip install vmware-nsx-mgmt==1.9.0 ``` ```bash git clone --branch v1.9.0 https://github.com/vmware-skills/VMware-NSX.git cd VMware-NSX pip install -e . ``` ### Technical Analysis The reviewed project contains documentation and evaluation data but not the implementation of the `vmware-nsx-mgmt` package. All credential processing, HTTPS authentication, NSX API requests, write confirmations, audit logging, policy enforcement, and output sanitization are delegated to an artifact retrieved from PyPI or GitHub. Pinning version `1.9.0` reduces ordinary version drift, but the installation instructions do not specify a package hash, signed provenance, immutable commit identifier, or trusted repository configuration. The reviewed files therefore cannot establish that the installed package is the same implementation that was security-reviewed. This is especially sensitive because the installed executable is expected to: - Read NSX credentials from the process environment or `~/.vmware-nsx/.env`. - Connect to NSX Manager over HTTPS. - Create, modify, and delete network infrastructure. - Run under the local user account with the Skill's allowed Bash access. - Write configuration and audit files under the user's home directory. The audit found no evidence that the named dependency is currently malicious. The vulnerability is the absence of locally verifiable integrity and implementation evidence for a dependency receiving substantial priv ...[truncated 1770 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Publish a lock file containing cryptographic hashes for the package and all transitive dependencies. 2. Install with mandatory hash verification, such as a generated requirements file used with `pip --require-hashes`, or an equivalent locked `uv` workflow. 3. Document the expected SHA-256 digest of the reviewed wheel and verify it before installation. 4. Publish signed release artifacts and verifiable build provenance, such as Sigstore attestations. 5. Pin source installations to an immutable commit hash rather than only a mutable tag: ```bash git clone https://github.com/vmware-skills/VMware-NSX.git cd VMware-NSX git checkout <reviewed-commit-sha> ``` 6. Use an allowlisted internal package repository or mirror with controlled promotion and malware scanning. 7. Include the executable implementation in the review artifact, or provide a software bill of materials and source-to-wheel reproducibility instructions. 8. Run the MCP process under a dedicated, restricted OS account with no access to unrelated user secrets. 9. Use a read-only NSX service account unless write functionality is explicitly required. Separate read-only, network-write, and Tier-0 administration identities. 10. Enforce production deny rules independently of the package where possible, rather than relying solely on policy checks implemented by the same dependency. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
references/setup-guide.md:79
Finding
NSX passwords are stored in a reversibly encoded local environment file<![CDATA[ ## Vulnerability Details **File Location**: `references/setup-guide.md:79-84` and `references/setup-guide.md:221-234` **Vulnerability Type**: Plaintext or reversibly encoded credential storage **Risk Level**: Medium ### Vulnerable Code The setup guide instructs operators to write passwords directly to a local file: ```bash echo "VMWARE_NSX_NSX_PROD_PASSWORD=your_password" > ~/.vmware-nsx/.env echo "VMWARE_NSX_NSX_LAB_PASSWORD=lab_password" >> ~/.vmware-nsx/.env chmod 600 ~/.vmware-nsx/.env ``` It then describes automatic conversion to reversible Base64 encoding: ```text On first load, any plaintext `*_PASSWORD` value in `.env` is automatically rewritten to a grep-safe `b64:<encoded>` form and decoded transparently at runtime, so a casual `grep` of the file no longer reveals the password. Values are read and written through python-dotenv's own parser, so the stored secret never drifts from what you configured (quotes, inline comments, and trailing whitespace are handled correctly). This is obfuscation, not encryption. Anyone who can read the file can still decode it. ``` ### Technical Analysis The `.env` file initially contains the NSX passwords in plaintext. Automatic rewriting to a `b64:` representation does not provide cryptographic confidentiality because Base64 can be decoded without a key. Mode `600` is an appropriate baseline control against access by other ordinary local users, and the guide accurately warns that Base64 is only obfuscation. However, the credential remains exposed to any process or attacker able to read files as the owning user. It may also be included in unencrypted home-directory backups, support bundles, filesystem snapshots, or accidental archive uploads. The risk is amplified when the same credential belongs to an NSX account with write or `enterprise_admin` privileges. Such an account can perform high-impact network changes, including Tier-0 BGP configuration. The behavior is functionally necessary only to suppl ...[truncated 1705 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Make runtime secret-manager injection the default setup path rather than persistent `.env` storage. 2. Support established secret providers such as HashiCorp Vault, CyberArk, an OS keychain, Kubernetes Secrets mounted through a protected mechanism, or a cloud secret manager. 3. Retrieve credentials only when needed and keep them in memory for the minimum practical duration. 4. Do not rewrite plaintext passwords into Base64. If local persistence is unavoidable, use authenticated encryption backed by a key held outside the credential file, preferably in an OS credential store or hardware-backed keystore. 5. Avoid command-line examples that place real passwords in shell commands because shell history, process tracing, terminal logging, and audit tooling may capture them. Prefer an interactive hidden prompt: ```bash read -s VMWARE_NSX_NSX_PROD_PASSWORD export VMWARE_NSX_NSX_PROD_PASSWORD ``` 6. Continue enforcing owner-only permissions and fail closed, rather than merely warning, when credential-file permissions are broader than `600`. 7. Exclude `.env` files from backups, archives, source control, diagnostic bundles, and synchronization software unless encrypted. 8. Use separate credentials for production, staging, and laboratory targets. Do not reuse passwords between targets. 9. Assign read-only NSX roles for monitoring deployments and narrowly scoped network roles for write deployments. 10. Rotate all stored credentials after any suspected local-account, backup, or filesystem exposure. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • Rogue AgentSelf-Modification, Session Persistence
Findings (33)

Credential Access

High
Category
Privilege Escalation
Content
metadata: {"openclaw":{"requires":{"anyBins":["vmware-nsx","uvx"]},"optional":{"env":["VMWARE_NSX_CONFIG","VMWARE_NSX_<TARGET>_PASSWORD","VMWARE_NSX_<TARGET>_USERNAME","VMWARE_AUDIT_APPROVED_BY"],"bins":["vmware-policy"]},"homepage":"https://github.com/vmware-skills/VMware-NSX","emoji":"🌐","os":["macos","linux"]}}
compatibility: >
  vmware-policy auto-installed as Python dependency (provides @vmware_tool decorator and audit logging). All write operations audited to ~/.vmware/audit.db.
  Credentials: Each NSX Manager target requires a per-target password env var in ~/.vmware-nsx/.env following the pattern VMWARE_NSX_<TARGET_NAME_UPPER>_PASSWORD. Username/password session auth only (client-certificate auth is not implemented). Passwords are never logged or echoed.
  Write operations: CLI write commands require double confirmation and support --dry-run. MCP write tools have no built-in confirmation step — they execute when called and are audit-logged, so the agent must call them only on the user's explicit request; ~/.vmware/rules.yaml deny rules can block them per environment. Segment delete refuses while ports are attached.
  VMWARE_AUDIT_APPROVED_BY is an optional attestation recorded in the audit row; it is not a gate and does not carry credentials.
  No webhooks, no outbound network calls, no guest operations. Local only: stdio MCP + NSX Policy API (HTTPS 443).
Confidence
60% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
metadata: {"openclaw":{"requires":{"anyBins":["vmware-nsx","uvx"]},"optional":{"env":["VMWARE_NSX_CONFIG","VMWARE_NSX_<TARGET>_PASSWORD","VMWARE_NSX_<TARGET>_USERNAME","VMWARE_AUDIT_APPROVED_BY"],"bins":["vmware-policy"]},"homepage":"https://github.com/vmware-skills/VMware-NSX","emoji":"🌐","os":["macos","linux"]}}
compatibility: >
  vmware-policy auto-installed as Python dependency (provides @vmware_tool decorator and audit logging). All write operations audited to ~/.vmware/audit.db.
  Credentials: Each NSX Manager target requires a per-target password env var in ~/.vmware-nsx/.env following the pattern VMWARE_NSX_<TARGET_NAME_UPPER>_PASSWORD. Username/password session auth only (client-certificate auth is not implemented). Passwords are never logged or echoed.
  Write operations: CLI write commands require double confirmation and support --dry-run. MCP write tools have no built-in confirmation step — they execute when called and are audit-logged, so the agent must call them only on the user's explicit request; ~/.vmware/rules.yaml deny rules can block them per environment. Segment delete refuses while ports are attached.
  VMWARE_AUDIT_APPROVED_BY is an optional attestation recorded in the audit row; it is not a gate and does not carry credentials.
  No webhooks, no outbound network calls, no guest operations. Local only: stdio MCP + NSX Policy API (HTTPS 443).
Confidence
60% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
metadata: {"openclaw":{"requires":{"anyBins":["vmware-nsx","uvx"]},"optional":{"env":["VMWARE_NSX_CONFIG","VMWARE_NSX_<TARGET>_PASSWORD","VMWARE_NSX_<TARGET>_USERNAME","VMWARE_AUDIT_APPROVED_BY"],"bins":["vmware-policy"]},"homepage":"https://github.com/vmware-skills/VMware-NSX","emoji":"🌐","os":["macos","linux"]}}
compatibility: >
  vmware-policy auto-installed as Python dependency (provides @vmware_tool decorator and audit logging). All write operations audited to ~/.vmware/audit.db.
  Credentials: Each NSX Manager target requires a per-target password env var in ~/.vmware-nsx/.env following the pattern VMWARE_NSX_<TARGET_NAME_UPPER>_PASSWORD. Username/password session auth only (client-certificate auth is not implemented). Passwords are never logged or echoed.
  Write operations: CLI write commands require double confirmation and support --dry-run. MCP write tools have no built-in confirmation step — they execute when called and are audit-logged, so the agent must call them only on the user's explicit request; ~/.vmware/rules.yaml deny rules can block them per environment. Segment delete refuses while ports are attached.
  VMWARE_AUDIT_APPROVED_BY is an optional attestation recorded in the audit row; it is not a gate and does not carry credentials.
  No webhooks, no outbound network calls, no guest operations. Local only: stdio MCP + NSX Policy API (HTTPS 443).
Confidence
60% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
metadata: {"openclaw":{"requires":{"anyBins":["vmware-nsx","uvx"]},"optional":{"env":["VMWARE_NSX_CONFIG","VMWARE_NSX_<TARGET>_PASSWORD","VMWARE_NSX_<TARGET>_USERNAME","VMWARE_AUDIT_APPROVED_BY"],"bins":["vmware-policy"]},"homepage":"https://github.com/vmware-skills/VMware-NSX","emoji":"🌐","os":["macos","linux"]}}
compatibility: >
  vmware-policy auto-installed as Python dependency (provides @vmware_tool decorator and audit logging). All write operations audited to ~/.vmware/audit.db.
  Credentials: Each NSX Manager target requires a per-target password env var in ~/.vmware-nsx/.env following the pattern VMWARE_NSX_<TARGET_NAME_UPPER>_PASSWORD. Username/password session auth only (client-certificate auth is not implemented). Passwords are never logged or echoed.
  Write operations: CLI write commands require double confirmation and support --dry-run. MCP write tools have no built-in confirmation step — they execute when called and are audit-logged, so the agent must call them only on the user's explicit request; ~/.vmware/rules.yaml deny rules can block them per environment. Segment delete refuses while ports are attached.
  VMWARE_AUDIT_APPROVED_BY is an optional attestation recorded in the audit row; it is not a gate and does not carry credentials.
  No webhooks, no outbound network calls, no guest operations. Local only: stdio MCP + NSX Policy API (HTTPS 443).
Confidence
60% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Tool Parameter Abuse

High
Category
Tool Misuse
Content
vmware-nsx troubleshoot vm-segment <vm-display-name>

# Diagnostics
vmware-nsx doctor [--skip-auth]
```

> Full CLI reference with all options and output formats: see `references/cli-reference.md`
Confidence
84% confidence
Finding
Exposing a diagnostic option that skips authentication can be abused by an agent or operator to draw incorrect trust conclusions about connectivity or environment readiness without validating credentials. While this may not directly modify NSX state, security-relevant diagnostics that bypass auth can normalize unsafe operation paths and conceal authorization failures.

Credential Access

High
Category
Privilege Escalation
Content
**NSX Manager cluster**: Use the cluster VIP as the `host` value. The VIP automatically routes to the active manager node.

### 3. Create .env for credentials

Passwords are **never stored in config.yaml**. They must be set as environment variables via the `.env` file.
Confidence
88% confidence
Finding
The setup guide directs users to store NSX passwords in a local `.env` file under the home directory. Although it later notes this is only obfuscation and recommends secret managers, file-based credential storage still increases theft risk from local compromise, backups, or accidental exposure.

Credential Access

High
Category
Privilege Escalation
Content
Passwords are **never stored in config.yaml**. They must be set as environment variables via the `.env` file.

```bash
echo "VMWARE_NSX_NSX_PROD_PASSWORD=your_password" > ~/.vmware-nsx/.env
echo "VMWARE_NSX_NSX_LAB_PASSWORD=lab_password" >> ~/.vmware-nsx/.env
chmod 600 ~/.vmware-nsx/.env
```
Confidence
90% confidence
Finding
The example uses shell `echo` commands containing plaintext passwords, which can expose secrets through shell history, process monitoring, clipboard reuse, or recorded terminal sessions. For a tool with access to NSX Manager, compromise of these credentials can lead to broad network management access.

Credential Access

High
Category
Privilege Escalation
Content
```bash
echo "VMWARE_NSX_NSX_PROD_PASSWORD=your_password" > ~/.vmware-nsx/.env
echo "VMWARE_NSX_NSX_LAB_PASSWORD=lab_password" >> ~/.vmware-nsx/.env
chmod 600 ~/.vmware-nsx/.env
```
Confidence
90% confidence
Finding
The second `echo ... >> ~/.vmware-nsx/.env` example similarly embeds a plaintext password in the shell command line. This creates unnecessary exposure channels even if file permissions are later tightened.

Credential Access

High
Category
Privilege Escalation
Content
```bash
echo "VMWARE_NSX_NSX_PROD_PASSWORD=your_password" > ~/.vmware-nsx/.env
echo "VMWARE_NSX_NSX_LAB_PASSWORD=lab_password" >> ~/.vmware-nsx/.env
chmod 600 ~/.vmware-nsx/.env
```

**Naming convention**: `VMWARE_NSX_<TARGET_NAME_UPPER>_PASSWORD` where `<TARGET_NAME_UPPER>` is the target `name` from config.yaml, uppercased, with hyphens replaced by underscores.
Confidence
78% confidence
Finding
This line completes the `.env` creation workflow and is part of a documented local credential storage pattern. The main risk is not `chmod 600` itself but that the surrounding procedure normalizes storing reusable NSX credentials in a local file.

Tool Parameter Abuse

High
Category
Tool Misuse
Content
This runs six checks: config file, .env file, targets, network connectivity, authentication, and MCP server module.

Use `--skip-auth` if NSX Manager is temporarily unreachable:

```bash
vmware-nsx doctor --skip-auth
Confidence
70% confidence
Finding
Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Tool Parameter Abuse

High
Category
Tool Misuse
Content
This runs six checks: config file, .env file, targets, network connectivity, authentication, and MCP server module.

Use `--skip-auth` if NSX Manager is temporarily unreachable:

```bash
vmware-nsx doctor --skip-auth
Confidence
70% confidence
Finding
Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Tool Parameter Abuse

High
Category
Tool Misuse
Content
This runs six checks: config file, .env file, targets, network connectivity, authentication, and MCP server module.

Use `--skip-auth` if NSX Manager is temporarily unreachable:

```bash
vmware-nsx doctor --skip-auth
Confidence
70% confidence
Finding
Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Agent Config Directory Access

High
Category
Agent Snooping
Content
### Continue

Add to `~/.continue/config.yaml`:

```yaml
mcpServers:
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.

Session Persistence

Medium
Category
Rogue Agent
Content
description: >
  Use this skill when the user needs to inspect or manage VMware NSX networking through NSX Manager — segments, Tier-0/Tier-1 gateways, NAT, static routes/BGP, and IP pools.
  Directly handles: list and inspect segments, gateways, NAT rules, routes and IP pools; check transport node, edge cluster and manager health; find a VM's segment. Changes (create/update/delete segments, Tier-1 gateways, NAT rules, static routes, IP pools, Tier-0 BGP) only when the user explicitly asks for that change.
  Use this skill for "create segment", "set up gateway", "create NAT rule", "check network health", "troubleshoot connectivity" when the context is explicitly NSX, NSX-T, or NSX Manager.
  Do NOT use for networking outside NSX, DFW firewall rules or security groups (use vmware-nsx-security), vSphere distributed port groups or host VMkernel adapters (use vmware-aiops), VM lifecycle (use vmware-aiops), or AVI/ALB load balancing (use vmware-avi).
  For multi-step workflows use vmware-pilot.
installer:
Confidence
60% confidence
Finding
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Sudo/Root Execution

Medium
Category
Privilege Escalation
Content
```bash
uv tool install vmware-nsx-mgmt==1.9.0
vmware-nsx init      # guided setup: writes config + .env (chmod 600, password grep-safe), then verifies
vmware-nsx doctor
```
Confidence
80% confidence
Finding
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

Sudo/Root Execution

Medium
Category
Privilege Escalation
Content
```bash
uv tool install vmware-nsx-mgmt==1.9.0
vmware-nsx init      # guided setup: writes config + .env (chmod 600, password grep-safe), then verifies
vmware-nsx doctor
```
Confidence
80% confidence
Finding
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

Sudo/Root Execution

Medium
Category
Privilege Escalation
Content
```bash
uv tool install vmware-nsx-mgmt==1.9.0
vmware-nsx init      # guided setup: writes config + .env (chmod 600, password grep-safe), then verifies
vmware-nsx doctor
```
Confidence
80% confidence
Finding
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
| Troubleshoot | `get_logical_port_status` | Read | Realized state of all ports on a segment |
| | `get_segment_port_for_vm` | Read | Find which segment a VM is connected to by display name |

Write tools require explicit parameters and are audit-logged. Dry-run preview (`--dry-run`) is a CLI feature; MCP write tools execute directly, with no confirmation step of their own — call one only after the user has explicitly asked for that change.

### List results are envelopes — read `truncated` before you summarise
Confidence
93% confidence
Finding
The skill explicitly states that MCP write tools execute immediately and have no built-in confirmation, relying solely on the agent to ensure the user explicitly requested the change. In an agent setting, that creates a real autonomous-action risk: prompt confusion, tool-routing mistakes, or prompt injection in surrounding context could trigger destructive NSX changes without an enforced approval gate.

Session Persistence

Medium
Category
Rogue Agent
Content
vmware-nsx route delete-static --tier1 <id> --route-id <id> [--dry-run]

# IP pools (write)
vmware-nsx ip-pool create <pool-id> --name <name> --start <ip> --end <ip> --cidr <cidr> [--dry-run]

# Health & Troubleshooting (read-only)
vmware-nsx health alarms [--severity CRITICAL]
Confidence
60% confidence
Finding
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Unsafe Defaults

Medium
Category
Tool Misuse
Content
vmware-nsx troubleshoot vm-segment <vm-display-name>

# Diagnostics
vmware-nsx doctor [--skip-auth]
```

> Full CLI reference with all options and output formats: see `references/cli-reference.md`
Confidence
80% confidence
Finding
Documenting a 'skip-auth' option in the primary CLI reference presents an unsafe default-adjacent pattern because it makes authentication bypass a standard troubleshooting path. In agent workflows, this can lead to false assumptions that the environment is healthy when auth is actually broken, weakening operational safeguards.

Session Persistence

Medium
Category
Rogue Agent
Content
| "Warn me if a segment still has workloads on it before deleting" | **`delete_segment` checks the ports first** and refuses, deleting nothing, while any is attached (it names them). The check runs server-side, not in the prompt. |
| "Use explicit limits for queries that may return large amounts of data" | **The list envelope.** Every list-returning tool returns `{items, returned, limit, total, truncated, hint}`, so the model reads truncation instead of guessing at it. `truncated: true` means `items` is not the whole collection; `next_offset` (null on the last page) is what a paging loop stops on, and the `hint` says which of the two you are looking at. |
| "If a listing came back empty, say so rather than claiming the call failed" | Same envelope. Empty `items` with `truncated: false` means the query genuinely matched nothing — a stated result, not a silence the model has to interpret. |
| "Log every state change you make" | **The `@vmware_tool` decorator.** Every write is recorded to `~/.vmware/audit.db` before the model sees the result, and policy rules are evaluated ahead of execution. |
| "Block state-changing writes against a production target" | **Policy.** An opt-in environment-scoped `deny` rule in `~/.vmware/rules.yaml` matches a target's `environment:` label and refuses matching writes before execution. |

---
Confidence
60% confidence
Finding
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
| Multi-tool workflows take 30–50s end to end | Prefer the tools that answer a whole question in one call: `get_segment_port_for_vm` finds a VM's segment directly, `get_ip_pool_usage` gives allocation without enumerating pools, and `get_nsx_manager_status` covers cluster health in one round trip. |
| Uses a segment's display name where the Policy API id is required | The identifier rule above. The failure reads as "segment not found", which a model tends to interpret as a missing object rather than a wrong key. |
| Invents or reformats an IP address, prefix length or ASN | The "report exactly as returned" rule. In this skill a plausible-looking wrong prefix is worse than no answer. |
| Proposes a deletion without checking what is attached | Require a `get_segment` port count first. The tool warns, but the model should have looked before it asked. |
| Silently falls back to the default target in a multi-manager estate | Name the target in the request. |

## Reporting results
Confidence
75% confidence
Finding
Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
| **L5** | Auto-remediation from learned pattern | Pattern library only; requires `risk:low` + `reversible:true` + `repeatable:true` | *(roadmap — candidates: stale segment cleanup, transport-node refresh)* |

**Notes**:
- L1/L2 tools are always safe for agents to call without confirmation.
- L3 tools always pass through the `@vmware_tool` decorator: policy check (`~/.vmware/rules.yaml` deny rules, per environment) → execute → audit log. MCP write tools have no confirmation step of their own — getting the user's explicit approval is the agent's job; the CLI's double-confirm and `--dry-run` do not apply to MCP calls. Segment delete additionally verifies port count = 0; Tier-1 delete runs the dependency pre-check below and refuses, deleting nothing, while any dependent remains.
- For DFW/security rules see [vmware-nsx-security](https://github.com/vmware-skills/VMware-NSX-Security).
Confidence
75% confidence
Finding
Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
**Notes**:
- L1/L2 tools are always safe for agents to call without confirmation.
- L3 tools always pass through the `@vmware_tool` decorator: policy check (`~/.vmware/rules.yaml` deny rules, per environment) → execute → audit log. MCP write tools have no confirmation step of their own — getting the user's explicit approval is the agent's job; the CLI's double-confirm and `--dry-run` do not apply to MCP calls. Segment delete additionally verifies port count = 0; Tier-1 delete runs the dependency pre-check below and refuses, deleting nothing, while any dependent remains.
- For DFW/security rules see [vmware-nsx-security](https://github.com/vmware-skills/VMware-NSX-Security).

## API Coverage
Confidence
90% confidence
Finding
The document explicitly states that MCP write tools have no built-in confirmation step and rely on the agent to obtain explicit user approval. In an agentic environment, this is dangerous because any prompt-handling failure, tool-routing bug, or prompt injection could trigger real network changes such as NAT, routing, gateway, or segment mutations without an enforced technical approval gate.

Intent-Code Divergence

Medium
Confidence
97% confidence
Finding
Line L024 states that the skill uses the NSX Policy API 'for all operations' and explicitly says the Management API is 'not used'. However, later capability tables list multiple `/api/v1/...` Management API endpoints for transport nodes, edge clusters, alarms, manager status, and VM/VIF discovery, and L184 acknowledges this mixed usage. That is an active contradiction in the documentation about what the code/tooling actually does.

Static analysis

No suspicious patterns detected.