T09 · Insecure Skill Coding Practices
- Location
handler.py:13- Finding
Reusable Controller Credential Transmitted Over Plaintext HTTP
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill does what it claims, but it controls physical irrigation hardware using a reusable password hash over plaintext HTTP and exposes broad state-changing actions with weak guardrails.
Review before installing. Use this only on a trusted, isolated local network with a strong unique OpenSprinkler password, and be aware that any agent invocation can send authenticated commands that start or stop watering, disable operation, change delays, or reboot the controller. Prefer a version that enforces duration and ID bounds, separates read-only from write/admin tools, and requires explicit confirmation for disruptive actions.
handler.py:13Reusable Controller Credential Transmitted Over Plaintext HTTP
handler.py:127Insufficient Validation of Physical Controller Operation Parameters
Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.
try:
req = urllib.request.Request(url)
with urllib.request.urlopen(req) as response:
return json.loads(response.read().decode())
except Exception as e:
return {"error": str(e)}
The skill declares environment variables for a controller IP address and password and is explicitly designed to interact with a local HTTP API, but it does not define any tool scope restrictions such as allowed tools or permissions. That creates unnecessary ambient authority: an agent using this skill may be able to access network and secret-bearing environment data more broadly than intended, increasing the chance of unintended device control or credential exposure.
The file reads a sensitive environment variable for the controller password and uses it to make HTTP requests to a device, but there is no confirmation prompt, user-facing logging, or warning comment/docstring disclosing this sensitive access and transmission behavior. Because this skill also performs remote control actions against infrastructure, users are not clearly warned in the code about the privacy and system-impact implications.
The skill offers numerous state-changing operations—starting stations/programs, queue pause, rain delay changes, global enable/disable, stop-all, and reboot—without any in-code confirmation, bounds checks, or safety interlocks. In an agentic context, mistaken or manipulated tool invocation could cause unintended watering, service interruption, or operational disruption to the irrigation system.
The skill exposes a reboot_controller capability even though the stated description focuses on monitoring and irrigation control operations. Undisclosed administrative functionality expands the skill’s effective permissions and can disrupt availability of the irrigation controller if invoked unexpectedly.
Rebooting the controller is an administrative action that is not necessary for ordinary irrigation monitoring and routine station/program control. In this context, it creates avoidable denial-of-service risk by interrupting watering schedules, sensor handling, or manual operations.
Multiple state-changing tools can start watering, stop watering, disable operation, pause queues, and alter rain delay, but their descriptions do not define when they should or should not be invoked. In an agent setting, vague invocation boundaries increase the chance of unsafe autonomous actions, prompt-induced misuse, or accidental physical-world disruption such as overwatering, skipped irrigation, or service interruption.
The manifest exposes a remote reboot capability that is not necessary for the core user-facing irrigation tasks described for the skill. Even without code-level exploitability shown here, unnecessary power over hardware control expands the attack surface and could let an agent or prompt-influenced workflow disrupt irrigation availability or mask other actions by resetting the controller.
All user-facing descriptions are authored only in English, and the file provides no indication that other languages are supported or that language choice is user-selectable. Under the stated policy, forcing a specific language without opt-in can be a locale-policy issue.