T09 · Insecure Skill Coding Practices
- Location
SKILL.md:99- Finding
Wildcard CORS exposes the local companion API to arbitrary websites
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill is mostly coherent for building local monitoring apps, but it needs Review because it recommends unsafe wildcard CORS for a localhost API and includes durable background-service patterns.
Install only if you are comfortable with a skill that helps agents build local background monitors. Require generated companions to use same-origin APIs or a strict Origin allowlist instead of wildcard CORS, add authentication for any POST/control endpoints, approve persistence explicitly, and avoid storing secrets or sensitive internal status in unauthenticated localhost APIs.
SKILL.md:99Wildcard CORS exposes the local companion API to arbitrary websites
scripts/starter/start.ps1:53Unvalidated PID files can terminate unrelated processes
references/docker.md:13Docker template uses a mutable, unverified base image
Die deklarierte Beschreibung handelt von einem dauerhaft laufenden lokalen Beobachtungs-Tool mit UI/Server/PWA/Benachrichtigungskomponenten. Der vorliegende Code implementiert stattdessen nur ein Kommandozeilenwerkzeug zur Qualitätssicherung: Es scannt Projektdateien nach vorgegebenen Textmustern ('--forbid'), überspringt bestimmte Verzeichnisse/Dateitypen und meldet Funde. Das ist ein materiell anderer Primärzweck und keine bloße Hilfsimplementierung des beschriebenen Companion-Systems. Es gibt keinerlei Hinweise auf Netzwerkserver, Monitoring externer Zustände, Hintergrundbetrieb, Browser-Integration oder Nutzerbenachrichtigungen.
Without declared permissions the skill's intent is opaque and cannot be validated.
The invocation guidance is very broad and encourages using the skill for many loosely related requests such as background tools, status pages, notifications, and containers. Overbroad routing can cause the agent to invoke a powerful skill in contexts where a simpler or safer approach would suffice, increasing the chance of unnecessary local services, persistent processes, network polling, or container exposure being proposed or created.
Code issues a request to a loopback, link-local, or private-range host. This can reach internal services not meant to be exposed and is a common SSRF pivot.
restart: unless-stopped
healthcheck:
test: ["CMD", "python", "-c",
"import urllib.request,sys; sys.exit(0 if urllib.request.urlopen('http://127.0.0.1:8765/api/status', timeout=5).status==200 else 1)"]
interval: 60s
start_period: 20s
security_opt: [ "no-new-privileges:true" ]
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.
- **Docker Desktop (Windows, macOS)**: Settings → General →
*Start Docker Desktop when you sign in*. Ohne diesen Haken startet nach der
Anmeldung gar nichts, und `restart` bleibt wirkungslos.
- **Linux**: `sudo systemctl enable docker` — auf den meisten Systemen ohnehin
eingeschaltet.
Das ist kein Detail, sondern der Unterschied zwischen „läuft dauerhaft" und
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
Nicht raten, nachsehen:
curl -sI "https://api.coingecko.com/api/v3/simple/price?ids=bitcoin&vs_currencies=eur"
# access-control-allow-origin: * → aus einer losen Datei erreichbar
curl -sI "https://t.me/s/telegram"
The guidance explicitly recommends launching PowerShell with -ExecutionPolicy Bypass, which weakens a native script safety control and normalizes bypassing policy protections on the endpoint. Even though it is scoped to a single invocation and framed as a usability workaround, it reduces defense-in-depth and could be reused to run modified or untrusted scripts with fewer barriers.
The module docstring and all command-line descriptions are written in German, which imposes a specific language on users without offering a language choice or documenting a justified locale restriction. This matches the policy category for language or locale constraints in natural-language content.
Argument descriptions, error messages, progress output, and remediation text are all emitted only in German. Because the file does not offer localization, opt-in language selection, or a documented locale-specific justification, this is a natural-language policy violation.
The generated service worker listens for message events of type 'notify' and calls showNotification, which can produce user-visible system notifications. In this Python file, that behavior is implemented indirectly via the generated SW string, but there is no user warning, confirmation, or explicit disclosure in the surrounding script output or comments that the skill adds notification capability.
The manifest sets "lang": "de", which forces a specific language/locale in the generated app metadata. The file does not offer a user option to choose the locale or document that the tool is intentionally limited to German-only use.
The batch file launches PowerShell with -ExecutionPolicy Bypass, which disables an important safety control intended to prevent restricted script execution. In this skill's context, the script is a user-facing starter for a long-running local companion app, so double-click execution makes it easier for a modified or trojanized start.ps1 to run without policy friction or user awareness.
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
if [ -z "$PY" ]; then
echo " Python wurde nicht gefunden."
echo " macOS: brew install python3"
echo " Debian: sudo apt install python3"
exit 1
fi
echo " Python: $PY"
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
if [ -z "$PY" ]; then
echo " Python wurde nicht gefunden."
echo " macOS: brew install python3"
echo " Debian: sudo apt install python3"
exit 1
fi
echo " Python: $PY"
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.
echo " Laeuft bereits auf $URL — wird nicht erneut gestartet."
else
mkdir -p "$DATA"
( cd "$ROOT" && nohup "$PY" "$SCRIPT" --port "$PORT" \
--poll-interval "$INTERVAL" --no-browser > "$LOG" 2>&1 & echo $! > "$PIDF" )
echo " Gestartet (PID $(cat "$PIDF")), warte auf Antwort ..."
ok=0
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.
echo " Laeuft bereits auf $URL — wird nicht erneut gestartet."
else
mkdir -p "$DATA"
( cd "$ROOT" && nohup "$PY" "$SCRIPT" --port "$PORT" \
--poll-interval "$INTERVAL" --no-browser > "$LOG" 2>&1 & echo $! > "$PIDF" )
echo " Gestartet (PID $(cat "$PIDF")), warte auf Antwort ..."
ok=0
This JSON file contains natural-language prompts and expectations exclusively in German across multiple eval entries. Under the policy, forcing a specific language without opt-in can be a locale-policy violation unless the regional constraint is explicitly justified, which is not stated here.
Tool calls are chained to bypass individual safety checks or escalate capabilities beyond what any single tool call would allow.
RUN mkdir -p /app/data
RUN useradd --uid 10001 --create-home --shell /usr/sbin/nologin app \
&& chown -R app:app /app
USER app
EXPOSE 8765
This markdown file uses only German for all headings and instructions, and there is no indication that the skill is intentionally limited to German-speaking users or that users can opt into another language. Under the language/locale policy rule, forcing a specific language without user choice can be a natural-language policy violation.
This markdown file contains user-facing instructional content exclusively in German, and there is no indication that the skill is intentionally region-specific or that users can opt into another language. Under the policy rule for natural-language violations, forcing a specific language without opt-in is a reportable issue.
The file's docstrings, inline user-facing messages, and console output are entirely in German, which imposes a specific language on users without any opt-in or alternate locale. This matches the policy category for language or locale constraints expressed in natural language.
The natural-language comment describing the script's behavior is only in German. This can violate language/locale policy when a skill forces a specific language without offering user opt-in or documenting a justified locale restriction.
The only user-facing natural-language text in the file is written in German, which imposes a specific language on users without any indication of language choice or opt-in. This matches the policy category for locale/language constraints in natural-language content.
All user-facing comments and status messages in the script are in German, and the file provides no option for users to select another language or indication that the skill is intentionally limited to German-speaking users. This is a natural-language policy concern because it imposes a locale/language choice without opt-in.
No suspicious patterns detected.