Back to skill

Security audit

tapo

Security checks for vulnerabilities and agentic risk

Overview

The skill fits its smart-home purpose, but its documented network setup can expose the access token used to control devices and access cameras.

Use HTTPS or an encrypted tunnel for LAN access before supplying the bearer token. Protect the saved configuration and use reviewed, pinned client and container versions. Test connectivity with device listing or state reads; only test power control on equipment safe to interrupt. Anyone holding an optional snapshot link can view the image until it expires. All bundled files were inspected, but external runtime packages and server binaries were not audited.

Vulnerability Patterns
  • 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
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
Findings (47)

Privileged Container / Container Escape

High
Category
Privilege Escalation
Confidence
80% confidence
Finding

Potential security issue detected. Manual review is recommended.

Content

Scanner excerpt · references/tapo-mcp-setup.md (reported line 83)May include surrounding context.

bash
docker run --rm \
  --network host \
  -e TAPO_MCP_USERNAME="you@example.com" \
  -e TAPO_MCP_PASSWORD="<YOUR_TAPO_PASSWORD>" \
  -e TAPO_MCP_CAMERA_USERNAME="<YOUR_CAMERA_ACCOUNT_USERNAME>" \

Privileged Container / Container Escape

High
Category
Privilege Escalation
Confidence
80% confidence
Finding

Potential security issue detected. Manual review is recommended.

Content

Scanner excerpt · references/tapo-mcp-setup.md (reported line 95)May include surrounding context.

md
> **Note:** The image binds to `0.0.0.0:3000`, so `TAPO_MCP_API_KEY` is required — the server refuses to start on a non-loopback address without it (see Network exposure above). To reach the server by hostname or LAN IP rather than loopback, also set `TAPO_MCP_ALLOWED_HOSTS`. To get snapshot links, add `-e TAPO_MCP_PUBLIC_URL="https://tapo.example.com"`.

> **Note:** `--network host` is required so the container can reach Tapo devices on your local network via UDP broadcast for discovery. On macOS and Windows, `--network host` is not supported — you can use `-p 3000:3000` instead, but device discovery won't work as Docker Desktop runs containers inside a VM without LAN access.

### Kubernetes

Privileged Container / Container Escape

High
Category
Privilege Escalation
Confidence
80% confidence
Finding

Potential security issue detected. Manual review is recommended.

Content

Scanner excerpt · references/tapo-mcp-setup.md (reported line 169)May include surrounding context.

key: TAPO_MCP_DISCOVERY_TARGET

text

> **Note:** `hostNetwork: true` is required for UDP broadcast discovery, similar to `--network host` in Docker. Because clients reach the server by node IP or hostname rather than loopback, set `TAPO_MCP_ALLOWED_HOSTS` accordingly (see Network exposure above). To get snapshot links, add `TAPO_MCP_PUBLIC_URL` to the ConfigMap and the Deployment's `env`.

## Testing

Privileged Kubernetes Workload

High
Category
Tool Misuse
Confidence
60% confidence
Finding

Code deploys a privileged Kubernetes workload (privileged container, hostPath mount, or host namespaces). This grants root on the node and is a node/cluster takeover vector.

Content

Scanner excerpt · references/tapo-mcp-setup.md (reported line 132)May include surrounding context.

md
labels:
        app: tapo-mcp
    spec:
      hostNetwork: true
      containers:
        - name: tapo-mcp
          image: ghcr.io/mihai-dinculescu/tapo-mcp:latest

Privileged Kubernetes Workload

High
Category
Tool Misuse
Confidence
60% confidence
Finding

Code deploys a privileged Kubernetes workload (privileged container, hostPath mount, or host namespaces). This grants root on the node and is a node/cluster takeover vector.

Content

Scanner excerpt · references/tapo-mcp-setup.md (reported line 169)May include surrounding context.

key: TAPO_MCP_DISCOVERY_TARGET

text

> **Note:** `hostNetwork: true` is required for UDP broadcast discovery, similar to `--network host` in Docker. Because clients reach the server by node IP or hostname rather than loopback, set `TAPO_MCP_ALLOWED_HOSTS` accordingly (see Network exposure above). To get snapshot links, add `TAPO_MCP_PUBLIC_URL` to the ConfigMap and the Deployment's `env`.

## Testing

MCP server referenced without pinned version: 'npx mcporter'.

Medium
Category
MCP Rug Pull
Confidence
96% confidence
Finding

The general invocation uses an unpinned npm CLI, not an MCP server package as the finding suggests. If mcporter is not installed locally, npx can fetch a changing registry version, exposing the agent's environment and smart-home credentials to a compromised release.

Content

No source excerpt is available for this finding.

MCP server referenced without pinned version: 'npx mcporter'.

Medium
Category
MCP Rug Pull
Confidence
96% confidence
Finding

This setup command can run a registry-resolved, unpinned mcporter release. A compromised release would receive the bearer token supplied to the configuration command and could access local configuration.

Content

No source excerpt is available for this finding.

MCP server referenced without pinned version: 'npx mcporter'.

Medium
Category
MCP Rug Pull
Confidence
96% confidence
Finding

Even though listing schemas is read-only, npx may first fetch and execute an unpinned mcporter release. Compromise of that release could expose the agent's files and configured server credentials.

Content

No source excerpt is available for this finding.

MCP server referenced without pinned version: 'npx mcporter'.

Medium
Category
MCP Rug Pull
Confidence
96% confidence
Finding

Device discovery uses an unpinned CLI that npx may obtain from the registry. A malicious release could access credentials and local resources regardless of the intended read-only discovery operation.

Content

No source excerpt is available for this finding.

MCP server referenced without pinned version: 'npx mcporter'.

Medium
Category
MCP Rug Pull
Confidence
96% confidence
Finding

The device-check command does not constrain the mcporter version that npx may execute. Device identity validation does not protect against compromise of the client performing that validation.

Content

No source excerpt is available for this finding.

Autonomous Decision Making

Medium
Category
Excessive Agency
Confidence
80% 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.

Content

Scanner excerpt · SKILL.md (reported line 62)May include surrounding context.

get_device_state

Get a device's current state. Checks the capability's parameters, then automatically runs check_device.

bash
# Device info

Autonomous Decision Making

Medium
Category
Excessive Agency
Confidence
80% 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.

Content

Scanner excerpt · SKILL.md (reported line 100)May include surrounding context.

control_device

Control a device by applying 1 to 12 set capabilities, in order. The count and every value are checked before the device is contacted; then it automatically runs check_device, and a capability the device does not support fails the call before any capability is applied. Brightness, Color, HueSaturation and ColorTemperature also turn the device on if it is off. When the device returns an error partway through, the error says how many capabilities were applied and which one failed.

bash
# Turn on (plugs, lights, power strip child plugs, and S210 switches paired to a hub)

MCP server referenced without pinned version: 'npx mcporter'.

Medium
Category
MCP Rug Pull
Confidence
96% confidence
Finding

Reading device information can trigger execution of an unpinned registry release of mcporter. A compromised client could access the execution environment and configured smart-home credentials.

Content

No source excerpt is available for this finding.

MCP server referenced without pinned version: 'npx mcporter'.

Medium
Category
MCP Rug Pull
Confidence
96% confidence
Finding

The hourly-energy example executes mcporter without a version constraint. Its read-only purpose does not prevent a compromised npm release from accessing credentials or other local resources.

Content

No source excerpt is available for this finding.

MCP server referenced without pinned version: 'npx mcporter'.

Medium
Category
MCP Rug Pull
Confidence
96% confidence
Finding

The daily-energy query relies on an unpinned npm CLI that npx may download when absent locally. A malicious release would execute with the agent's process permissions.

Content

No source excerpt is available for this finding.

MCP server referenced without pinned version: 'npx mcporter'.

Medium
Category
MCP Rug Pull
Confidence
96% confidence
Finding

The monthly-energy query can execute a changing registry-resolved mcporter version. This introduces supply-chain exposure despite the requested operation being read-only.

Content

No source excerpt is available for this finding.

MCP server referenced without pinned version: 'npx mcporter'.

Medium
Category
MCP Rug Pull
Confidence
96% confidence
Finding

The energy-meter command uses unversioned npx package resolution. If a compromised release is fetched, it could access credentials and the agent's environment before performing the legitimate query.

Content

No source excerpt is available for this finding.

MCP server referenced without pinned version: 'npx mcporter'.

Medium
Category
MCP Rug Pull
Confidence
96% confidence
Finding

This power-history query invokes mcporter without pinning its version. A registry compromise could therefore introduce executable code into an environment holding smart-home access credentials.

Content

No source excerpt is available for this finding.

MCP server referenced without pinned version: 'npx mcporter'.

Medium
Category
MCP Rug Pull
Confidence
96% confidence
Finding

The hourly power query can cause npx to fetch and execute an unpinned mcporter release. The query's limited functionality does not restrict the permissions of the client process.

Content

No source excerpt is available for this finding.

MCP server referenced without pinned version: 'npx mcporter'.

Medium
Category
MCP Rug Pull
Confidence
96% confidence
Finding

The trigger-log query uses an unpinned client package. A malicious release could access both configured credentials and potentially sensitive device activity records.

Content

No source excerpt is available for this finding.

MCP server referenced without pinned version: 'npx mcporter'.

Medium
Category
MCP Rug Pull
Confidence
96% confidence
Finding

The temperature-history query relies on unpinned npx execution. If an untrusted release is resolved, it runs with the agent's permissions rather than being limited to reading sensor records.

Content

No source excerpt is available for this finding.

MCP server referenced without pinned version: 'npx mcporter'.

Medium
Category
MCP Rug Pull
Confidence
96% confidence
Finding

The camera-detection query can execute a registry-resolved mcporter release without version pinning. A compromised release could access server credentials and sensitive camera activity metadata.

Content

No source excerpt is available for this finding.

MCP server referenced without pinned version: 'npx mcporter'.

Medium
Category
MCP Rug Pull
Confidence
96% confidence
Finding

The power-on command uses an unpinned executable client. A compromised release could misuse configured access to physical devices or access local secrets instead of performing only the requested action.

Content

No source excerpt is available for this finding.

MCP server referenced without pinned version: 'npx mcporter'.

Medium
Category
MCP Rug Pull
Confidence
96% confidence
Finding

The power-off command may fetch and execute an unpinned mcporter release. Smart-home control increases the consequences of client compromise because malicious code could issue unintended device commands.

Content

No source excerpt is available for this finding.

MCP server referenced without pinned version: 'npx mcporter'.

Medium
Category
MCP Rug Pull
Confidence
96% confidence
Finding

The brightness example invokes an unpinned mcporter package. A compromised release would not be constrained to changing brightness and could access other resources available to the agent.

Content

No source excerpt is available for this finding.