T09 · Insecure Skill Coding Practices
- Location
scripts/anova.py:18- Finding
Anova bearer token exposed through WebSocket query string and diagnostic output
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This skill is a real remote-control tool for Anova cooking appliances, but it lacks adequate guardrails for safely starting, stopping, and validating physical heating actions.
Install only if you are comfortable giving an agent remote control over a real heating appliance. Before use, add or require explicit confirmation for every cook or stop command, verify the selected device, enforce temperature and duration limits, pin dependencies, protect and rotate the Anova token, and locally verify that stop commands actually took effect.
scripts/anova.py:18Anova bearer token exposed through WebSocket query string and diagnostic output
scripts/anova.py:249Missing safety bounds permit invalid or hazardous remote heating commands
scripts/anova.py:95Start and stop operations report success without validating appliance acknowledgement
requirements.txt:1Unbounded WebSocket dependency prevents reproducible and reviewed installations
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
2. **Personal Access Token**
- Download the Anova Oven app (iOS/Android)
- Navigate to: More → Developer → Personal Access Tokens
- Generate a new token (starts with `anova-`)
3. **Python Environment**
- Python 3.7 or higher
The skill advertises support for remote control of multiple cooking modes and device types that the described implementation may not actually handle correctly. In an appliance-control context, overstated capabilities can cause an agent or user to initiate the wrong cooking behavior, fail to stop the correct device, or assume safety-critical functions exist when they do not.
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
## Prerequisites
1. **Personal Access Token** from Anova app
- Download Anova Oven app (iOS/Android)
- Go to: More → Developer → Personal Access Tokens
- Create token (starts with `anova-`)
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
## Prerequisites
1. **Personal Access Token** from Anova app
- Download Anova Oven app (iOS/Android)
- Go to: More → Developer → Personal Access Tokens
- Create token (starts with `anova-`)
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
## Prerequisites
1. **Personal Access Token** from Anova app
- Download Anova Oven app (iOS/Android)
- Go to: More → Developer → Personal Access Tokens
- Create token (starts with `anova-`)
The documentation instructs storing a long-lived bearer token in a predictable plaintext file path under the home directory. While common, this creates credential exposure risk if local files are over-broadly readable, backed up insecurely, or accessible to other tools on the host; with this token, an attacker could remotely control the user's appliances.
1. **Personal Access Token** from Anova app
- Download Anova Oven app (iOS/Android)
- Go to: More → Developer → Personal Access Tokens
- Create token (starts with `anova-`)
- Store in `~/.config/anova/token`
The skill provides direct commands to start, modify, monitor, and stop a physical cooking appliance, but it includes no safety interlocks such as confirmation prompts for heating actions, warnings about remote activation, or checks that the user explicitly intends to control the device. Because this is a network-connected oven, accidental or ambiguous invocation could cause unattended heating, property damage, or injury, making the omission materially dangerous in context.
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.
mkdir -p ~/.config/anova
echo "anova-YOUR_TOKEN_HERE" > ~/.config/anova/token
chmod 600 ~/.config/anova/token
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
mkdir -p ~/.config/anova
echo "anova-YOUR_TOKEN_HERE" > ~/.config/anova/token
chmod 600 ~/.config/anova/token
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
mkdir -p ~/.config/anova
echo "anova-YOUR_TOKEN_HERE" > ~/.config/anova/token
chmod 600 ~/.config/anova/token
The README documents commands that can remotely start heating, change cooking modes, and stop appliances, but the warning language is mild and does not clearly state that these actions immediately change the physical state of a network-connected appliance. In the context of an oven/cooker control skill, that omission is safety-relevant because users or downstream agents may treat examples as harmless queries rather than actuator commands, increasing the risk of unintended heating or unattended operation.
Without declared permissions the skill's intent is opaque and cannot be validated.
The documentation enables unattended remote start/stop of a heating appliance without prominently warning about the physical safety risks of activating or changing cooking state remotely. Because this skill controls real-world heating equipment, missing safety guardrails can lead to fire risk, food safety issues, property damage, or harm if operation occurs when the appliance is not being supervised.
The skill directs users to persist an access token on disk for repeated use, creating durable session material that can survive beyond a single run. In this skill's context, persistent bearer credentials increase the blast radius of local compromise because an exposed token enables ongoing remote control of physical devices.
1. **Personal Access Token** from Anova app
- Download Anova Oven app (iOS/Android)
- Go to: More → Developer → Personal Access Tokens
- Create token (starts with `anova-`)
- Store in `~/.config/anova/token`
2. **Python dependencies**
The natural-language examples use broad phrases like 'Preheat the oven' and 'Stop cooking' without warning that these prompts may immediately trigger physical appliance actions. In an agent setting, ambiguous natural-language triggers materially increase the chance of accidental or misunderstood execution against a real oven or cooker.
Skill allows unbounded resource consumption (API calls, storage, compute). Without rate limits or quotas, a compromised or misbehaving agent can cause denial-of-service or cost overruns.
# Wait for a state message with element status
for _ in range(20):
try:
message = await asyncio.wait_for(self.ws.recv(), timeout=0.5)
data = json.loads(message)
self.message_history.append(data)
The manifest describes starting cooking modes and controlling both Anova Precision Ovens and Precision Cookers, but the actionable control paths here are hard-coded to oven-specific commands like CMD_APO_START/CMD_APO_STOP and oven stage structures. Although device discovery handles both APC and APO events, no cooker-specific start/stop command path is implemented, so the described capability is broader than the actual behavior.
The script reads an authentication token from a local config path and uses it for device control, but the code provides no explicit warning that credentials are being accessed. While missing credentials are reported, there is no user-facing disclosure that a sensitive token file will be read for authentication.
The script sends real remote-control commands that can start heating or stop an active cook immediately, with no confirmation, dry-run mode, or safety interlock. In the context of an oven/cooker control skill, accidental invocation or misuse can directly affect a physical device, making this more dangerous than a typical non-physical automation action.
The dependency is specified as websockets>=10.0 without an upper bound or exact pin, which makes builds non-reproducible and allows installation of unexpectedly vulnerable or breaking versions over time. In a network-facing skill that controls ovens and cookers over WebSocket, dependency drift can expose the system to avoidable library vulnerabilities or reliability issues in a safety-relevant context.
websockets>=10.0
Because the manifest does not pin the websockets version, it is impossible to verify whether the deployed package includes releases affected by known advisories, including denial-of-service and timing-related issues. This is more concerning here than in a purely offline utility because the skill communicates over WiFi/WebSocket to control physical cooking devices, so network-layer instability or abuse could disrupt operation or availability.
The inline comment says the temperature bulb configuration will 'always use DRY mode', but the function also adds steam generator settings when humidity is supplied, enabling steam-assisted cooking behavior. This creates an intent/documentation mismatch because the comment suggests a narrower non-steam mode than the code actually configures.
No suspicious patterns detected.