Back to skill

Security audit

Home Assistant Skill

Security checks for vulnerabilities and agentic risk

Overview

This skill is a disclosed Home Assistant integration that needs a sensitive token and can affect smart-home devices, but its behavior is coherent with its stated purpose and includes meaningful safety guidance.

Install only if you intend to let an agent inspect and, when you authorize it, operate your Home Assistant devices. Use a dedicated least-privilege Home Assistant account where possible, keep HA_TOKEN in a private environment or secret store, prefer verified HTTPS, and require explicit confirmation before any lock, alarm, garage door, security automation, notification, TTS, script, scene, or broad batch action.

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
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (64)

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · README.md (reported line 41)May include surrounding context.

Configuration

  1. Supply an existing Home Assistant access token through your local environment or secret store. Credential creation requires separate authorization.
  2. Set environment variables:
bash

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

The description presents a broad Home Assistant inspection-and-control skill covering both REST and WebSocket workflows plus several specific capability areas. The supplied code is much narrower: it is explicitly read-only except for a weather service call used only to fetch data, and it only exposes a small set of REST endpoints and summaries. There is no code for WebSocket connections, no entity/device registry handling, no Assist, no automations, no energy statistics, and no meaningful control actions. While some declared areas are partially represented (capability discovery, action schema lookup, calendars, basic troubleshooting/health), the overall declared description materially overstates what this code chunk can do.

Content

No source excerpt is available for this finding.

Credential Access

High
Category
Privilege Escalation
Confidence
94% confidence
Finding

The skill requires access to a long-lived Home Assistant bearer token, and that token inherits the full authority of its associated HA user. Even though the documentation warns not to print or share it, any skill that depends on reading such credentials materially increases the blast radius of compromise because theft enables surveillance and device control.

Content

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

md
Set environment variables:
- `HA_URL` — Your Home Assistant URL (e.g., `http://10.0.0.10:8123`)
- `HA_TOKEN` — An existing access token supplied through the local environment or secret store.

Use HTTPS with verified certificates for remote connections; local HTTP exposes the
token to the network. Use the exact trusted origin, without a trailing `/api`, query

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
88% confidence
Finding

The skill encourages use of the generic /api/template endpoint, which can evaluate templated expressions on the Home Assistant side. Even though the shown example is static, promoting general template execution as a discovery mechanism creates a parameter-abuse surface where later user-controlled entity names or template fragments could be inserted, potentially broadening data access or triggering unintended server-side processing.

Content

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

md
-d '{"template": "{{ area_name(\"light.kitchen\") }}"}'

# List all floors and their areas
printf 'Authorization: Bearer %s\n' "$HA_TOKEN" | curl -q -fsS --noproxy '*' --connect-timeout 5 --max-time 30 -X POST "$HA_URL/api/template" \
  -H @- \
  -H "Content-Type: application/json" \
  -d '{"template": "{% for floor in floors() %}{{ floor }}: {{ floor_areas(floor) }}\n{% endfor %}"}'

Credential Access

High
Category
Privilege Escalation
Confidence
90% confidence
Finding

The note confirms reliance on long-lived access tokens, which are particularly sensitive because they may remain valid for years and can authorize household data access and device operations. In this skill context, token compromise is especially dangerous because the integration spans presence, calendars, locks, alarms, and other real-world systems.

Content

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

md
## Notes

- Most endpoints return JSON; templates return text
- Long-lived access tokens have a documented 10-year lifetime and can be revoked; store securely
- Test entity IDs with the list command first
- For locks, alarms, and garage doors — always confirm actions with the user

File System Enumeration

Medium
Category
Data Exfiltration
Confidence
80% confidence
Finding

Code scans file system directories looking for sensitive files. This could be reconnaissance for credential theft.

Content

Scanner excerpt · SECURITY.md (reported line 10)May include surrounding context.

md
## Credentials and transport

Use existing credentials supplied privately through the environment or a secret
store. The Python readers do not search credential files, browser storage, SSH
keys or cloud configuration. A local JSON file is opened only for an explicitly
requested `validate-config` operation. Reader output redacts the configured token;
it does not automatically remove other private household data.

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 · SECURITY.md (reported line 13)May include surrounding context.

md
store. The Python readers do not search credential files, browser storage, SSH
keys or cloud configuration. A local JSON file is opened only for an explicitly
requested `validate-config` operation. Reader output redacts the configured token;
it does not automatically remove other private household data.

The readers connect only to the validated origin, ignore environment proxies,
verify HTTPS certificates, refuse redirects and do not retry. Local HTTP remains

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
92% confidence
Finding

The skill explicitly requires environment variables and network access to a live Home Assistant instance, but it does not declare any explicit tool scope or allowed-tools boundary in the skill manifest. That increases the chance an agent can invoke broader capabilities than intended, especially in a skill that handles bearer tokens and can perform device-affecting API calls.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

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

bash
# List all areas
printf 'Authorization: Bearer %s\n' "$HA_TOKEN" | curl -q -fsS --noproxy '*' --connect-timeout 5 --max-time 30 -X POST "$HA_URL/api/template" \
  -H @- \
  -H "Content-Type: application/json" \
  -d '{"template": "{{ areas() }}"}'

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

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

bash
# List all areas
printf 'Authorization: Bearer %s\n' "$HA_TOKEN" | curl -q -fsS --noproxy '*' --connect-timeout 5 --max-time 30 -X POST "$HA_URL/api/template" \
  -H @- \
  -H "Content-Type: application/json" \
  -d '{"template": "{{ areas() }}"}'

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

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

bash
# List all areas
printf 'Authorization: Bearer %s\n' "$HA_TOKEN" | curl -q -fsS --noproxy '*' --connect-timeout 5 --max-time 30 -X POST "$HA_URL/api/template" \
  -H @- \
  -H "Content-Type: application/json" \
  -d '{"template": "{{ areas() }}"}'

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

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

bash
# List all areas
printf 'Authorization: Bearer %s\n' "$HA_TOKEN" | curl -q -fsS --noproxy '*' --connect-timeout 5 --max-time 30 -X POST "$HA_URL/api/template" \
  -H @- \
  -H "Content-Type: application/json" \
  -d '{"template": "{{ areas() }}"}'

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

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

bash
# List all areas
printf 'Authorization: Bearer %s\n' "$HA_TOKEN" | curl -q -fsS --noproxy '*' --connect-timeout 5 --max-time 30 -X POST "$HA_URL/api/template" \
  -H @- \
  -H "Content-Type: application/json" \
  -d '{"template": "{{ areas() }}"}'

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/rest-examples.md (reported line 429)May include surrounding context.

bash
# List all areas
printf 'Authorization: Bearer %s\n' "$HA_TOKEN" | curl -q -fsS --noproxy '*' --connect-timeout 5 --max-time 30 -X POST "$HA_URL/api/template" \
  -H @- \
  -H "Content-Type: application/json" \
  -d '{"template": "{{ areas() }}"}'

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/rest-examples.md (reported line 439)May include surrounding context.

bash
# List all areas
printf 'Authorization: Bearer %s\n' "$HA_TOKEN" | curl -q -fsS --noproxy '*' --connect-timeout 5 --max-time 30 -X POST "$HA_URL/api/template" \
  -H @- \
  -H "Content-Type: application/json" \
  -d '{"template": "{{ areas() }}"}'

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/rest-examples.md (reported line 445)May include surrounding context.

bash
# List all areas
printf 'Authorization: Bearer %s\n' "$HA_TOKEN" | curl -q -fsS --noproxy '*' --connect-timeout 5 --max-time 30 -X POST "$HA_URL/api/template" \
  -H @- \
  -H "Content-Type: application/json" \
  -d '{"template": "{{ areas() }}"}'

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/rest-examples.md (reported line 451)May include surrounding context.

bash
# List all areas
printf 'Authorization: Bearer %s\n' "$HA_TOKEN" | curl -q -fsS --noproxy '*' --connect-timeout 5 --max-time 30 -X POST "$HA_URL/api/template" \
  -H @- \
  -H "Content-Type: application/json" \
  -d '{"template": "{{ areas() }}"}'

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/rest-examples.md (reported line 13)May include surrounding context.

bash
# Turn on
printf 'Authorization: Bearer %s\n' "$HA_TOKEN" | curl -q -fsS --noproxy '*' --connect-timeout 5 --max-time 30 -X POST "$HA_URL/api/services/switch/turn_on" \
  -H @- \
  -H "Content-Type: application/json" \
  -d '{"entity_id": "switch.office_lamp"}'

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/rest-examples.md (reported line 19)May include surrounding context.

md
-d '{"entity_id": "switch.office_lamp"}'

# Turn off
printf 'Authorization: Bearer %s\n' "$HA_TOKEN" | curl -q -fsS --noproxy '*' --connect-timeout 5 --max-time 30 -X POST "$HA_URL/api/services/switch/turn_off" \
  -H @- \
  -H "Content-Type: application/json" \
  -d '{"entity_id": "switch.office_lamp"}'

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/rest-examples.md (reported line 25)May include surrounding context.

md
-d '{"entity_id": "switch.office_lamp"}'

# Toggle
printf 'Authorization: Bearer %s\n' "$HA_TOKEN" | curl -q -fsS --noproxy '*' --connect-timeout 5 --max-time 30 -X POST "$HA_URL/api/services/switch/toggle" \
  -H @- \
  -H "Content-Type: application/json" \
  -d '{"entity_id": "switch.office_lamp"}'

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · README.md (reported line 132)May include surrounding context.

bash
# Turn on with brightness
printf 'Authorization: Bearer %s\n' "$HA_TOKEN" | curl -q -fsS --noproxy '*' --connect-timeout 5 --max-time 30 -X POST "$HA_URL/api/services/light/turn_on" \
  -H @- \
  -H "Content-Type: application/json" \
  -d '{"entity_id": "light.living_room", "brightness_pct": 80}'

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/rest-examples.md (reported line 35)May include surrounding context.

bash
# Turn on with brightness
printf 'Authorization: Bearer %s\n' "$HA_TOKEN" | curl -q -fsS --noproxy '*' --connect-timeout 5 --max-time 30 -X POST "$HA_URL/api/services/light/turn_on" \
  -H @- \
  -H "Content-Type: application/json" \
  -d '{"entity_id": "light.living_room", "brightness_pct": 80}'

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/rest-examples.md (reported line 41)May include surrounding context.

bash
# Turn on with brightness
printf 'Authorization: Bearer %s\n' "$HA_TOKEN" | curl -q -fsS --noproxy '*' --connect-timeout 5 --max-time 30 -X POST "$HA_URL/api/services/light/turn_on" \
  -H @- \
  -H "Content-Type: application/json" \
  -d '{"entity_id": "light.living_room", "brightness_pct": 80}'

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/rest-examples.md (reported line 47)May include surrounding context.

bash
# Turn on with brightness
printf 'Authorization: Bearer %s\n' "$HA_TOKEN" | curl -q -fsS --noproxy '*' --connect-timeout 5 --max-time 30 -X POST "$HA_URL/api/services/light/turn_on" \
  -H @- \
  -H "Content-Type: application/json" \
  -d '{"entity_id": "light.living_room", "brightness_pct": 80}'

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/rest-examples.md (reported line 53)May include surrounding context.

md
-d '{"entity_id": "light.living_room", "color_temp_kelvin": 3333}'

# Turn off
printf 'Authorization: Bearer %s\n' "$HA_TOKEN" | curl -q -fsS --noproxy '*' --connect-timeout 5 --max-time 30 -X POST "$HA_URL/api/services/light/turn_off" \
  -H @- \
  -H "Content-Type: application/json" \
  -d '{"entity_id": "light.living_room"}'

Static analysis

No suspicious patterns detected.