Back to skill

Security audit

ReefBeat

Security checks for vulnerabilities and agentic risk

Overview

The skill is for local aquarium device control, but it gives broad write access to life-support equipment and includes cloud credential examples without enough safety scoping.

Review this carefully before installing. Use it only when you intend to control specific ReefBeat devices on your own local network, prefer read-only status checks first, and require explicit user confirmation before any POST, PUT, DELETE, firmware, reset, maintenance, emergency, pump, dosing, ATO, or cloud-related action. Do not provide ReefBeat cloud passwords through this skill, and treat the documented cloud Basic credential as exposed.

Vulnerability Patterns
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (1)

T09 · Insecure Skill Coding Practices

Warning
Location
references/api.md:274
Finding

Hardcoded OAuth Client Credential in API Documentation

Content
View full analysis
&password= ``` The embedded Base64 value decodes to: ```text gFjHtJpa:C9fogwrjDWORT2GY ``` ### Technical Analysis The API reference distributes a static OAuth client identifier and secret in an HTTP Basic Authorization value. Base64 encoding provides no confidentiality, so anyone who can access the Skill package can recover and reuse the credential. The CLI implementation does not execute this cloud authentication flow, and the documentation labels it as reference-only. Nevertheless, including a live reusable credential in distributed Skill content violates secure secret-management practices. It also encourages use of the OAuth resource-owner password grant, under which users submit their account passwords directly to the token endpoint. This is not evidence of an obfuscated executable payload; it is an exposed authentication credential in documentation. ### Attack Path 1. An attacker downloads or otherwise obtains the Skill package. 2. The attacker reads `references/api.md` and extracts the documented Basic Authorization value. 3. The attacker Base64-decodes the value to recover the OAuth client identifier and secret. 4. The attacker sends requests to the documented `/oauth/token` endpoint using the exposed client identity. 5. If the attacker also possesses valid user credentials, they may request an access token and access cloud resources permitted to that user. The exposed client credential may also facilitate automated password testing unless the service applies effective rate limiting and abuse controls. ...[truncated 632 chars]
Remediation
View remediation
``` 4. Avoid distributing confidential OAuth client secrets in Skills, source code, examples, or client-side applications. 5. Prefer an officially supported public-client flow, such as Authorization Code with PKCE, rather than the resource-owner password grant. 6. If a confidential client is unavoidable, keep its secret in a controlled server-side secret manager and never expose it to the Agent or end user. 7. Apply token-endpoint rate limiting, client monitoring, anomaly detection, and credential-stuffing protections. 8. Review authorization-server logs for suspicious use of the exposed client identity and invalidate tokens obtained through unauthorized activity. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (12)

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

The description overstates the implemented functionality. The code does support local, no-cloud communication with ReefBeat devices and can monitor basic info/status, discover devices on the subnet, and send arbitrary HTTP methods to endpoints. However, it does not contain built-in logic for the many specific capabilities listed in the description (for example lighting schedules, acclimation, moonphase, calibration, priming, supplements, advance/new-roll, overskimming, ATO-specific controls, wave modes/preview). Instead, it exposes only generic low-level HTTP operations. So while the code could potentially be used manually to reach such endpoints if the caller already knows them, the declared purpose promises direct support for those functions, which the code does not actually implement.

Content

No source excerpt is available for this finding.

Vague Triggers

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The activation text is extremely broad ('Use for ANY reef tank / aquarium request') despite the skill having direct local network control over physical equipment. Overbroad invocation criteria increase the likelihood that an agent will select this skill for ambiguous aquarium-related requests and perform device discovery or state-changing actions without sufficiently specific user intent.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The documentation includes many real-world state-changing operations for pumps, lights, ATO systems, filter rolls, and maintenance modes without safety warnings, confirmation requirements, or operational limits. Because these commands affect life-support and husbandry equipment, accidental or automated misuse could stress livestock, disrupt filtration/top-off, or damage equipment.

Content

No source excerpt is available for this finding.

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
80% 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).

Content

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

python3 scripts/reefbeat.py <LED_IP> get /auto/1

Turn LED off / resume schedule

python3 scripts/reefbeat.py <LED_IP> delete /off

text

### ReefRun — Pumps / Skimmer

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
80% 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).

Content

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

'{"type":"st","frt":5,"rrt":5,"fti":80,"rti":80,"duration":300000,"sn":5,"pd":10}'

Stop/save preview

python3 scripts/reefbeat.py <WAVE_IP> delete /preview

text

### Shortcuts (All Devices)

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
80% 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).

Content

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

python3 scripts/reefbeat.py post /maintenance # or /emergency

End maintenance

python3 scripts/reefbeat.py delete /maintenance

text

---

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
94% confidence
Finding

The skill documents active network behavior, including subnet-wide discovery and arbitrary HTTP requests to device IPs, but does not declare any tool scope or allowed-tools restrictions. This creates a governance gap where an agent may invoke network-capable behavior without explicit permission boundaries or user awareness, increasing the chance of unintended scanning or device interaction.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The reference lists sensitive and destructive control endpoints such as firmware update, factory reset, emergency mode, maintenance mode, and cloud enable/disable with no safety gating or warning about operational consequences. In this skill context, the agent is explicitly designed to control aquarium life-support equipment, so undocumented destructive actions can directly impact pumps, dosing, top-off, filtration, and livestock health.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The documentation exposes live cloud authentication details, including a Basic authorization value and password-based token flow, despite stating the cloud API is not implemented in the CLI. Even if intended as reference material, embedding operational auth details in a skill materially lowers the barrier to unauthorized cloud access attempts and encourages handling user credentials in an unsafe way.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The cloud API section documents a password-based authentication workflow without any privacy or credential-handling warning. In a skill that may be used by an autonomous agent, this creates a realistic risk of prompting for user email/password, mishandling secrets, or normalizing insecure credential collection for cloud-connected aquarium devices.

Content

No source excerpt is available for this finding.

Dynamic Request Target

Medium
Category
Server-Side Request Forgery
Confidence
60% confidence
Finding

Request target host is built from a dynamic or untrusted value. If the host is attacker-influenced, this enables SSRF to arbitrary internal or metadata endpoints.

Content

Scanner excerpt · scripts/reefbeat.py (reported line 80)May include surrounding context.

python
def _get_uuid(ip: str) -> Optional[str]:
    """Fetch UUID from UPnP description.xml."""
    try:
        req = urllib.request.Request(f"http://{ip}/description.xml")
        with urllib.request.urlopen(req, timeout=TIMEOUT) as resp:
            root = ET.fromstring(resp.read().decode())
            for el in root.iter():

Dynamic Request Target

Medium
Category
Server-Side Request Forgery
Confidence
60% confidence
Finding

Request target host is built from a dynamic or untrusted value. If the host is attacker-influenced, this enables SSRF to arbitrary internal or metadata endpoints.

Content

Scanner excerpt · scripts/reefbeat.py (reported line 99)May include surrounding context.

python
def _get_uuid(ip: str) -> Optional[str]:
    """Fetch UUID from UPnP description.xml."""
    try:
        req = urllib.request.Request(f"http://{ip}/description.xml")
        with urllib.request.urlopen(req, timeout=TIMEOUT) as resp:
            root = ET.fromstring(resp.read().decode())
            for el in root.iter():

Static analysis

No suspicious patterns detected.