Back to skill

Security audit

morning-briefing

Security checks for vulnerabilities and agentic risk

Overview

This is a disclosed daily briefing generator, but users should know it sends the configured weather location to wttr.in and displays external content verbatim.

Install only if you are comfortable with your configured weather location being sent to wttr.in and with external briefing content being shown exactly as generated. Treat links and instructions inside generated briefings as untrusted, and prefer adding HTTPS/validation before relying on it routinely.

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
scripts/morning_briefing.sh:34
Finding
Untrusted Network Content Is Inserted into an Agent-Controlled Verbatim Response<![CDATA[ ## Vulnerability Details **File Location**: `scripts/morning_briefing.sh:34-35,84`; `SKILL.md:26-27` **Vulnerability Type**: Unvalidated remote content injection into an Agent response **Risk Level**: Medium ### Vulnerable Code `scripts/morning_briefing.sh:34-35` ```bash weather_data=$(curl -s --max-time 10 "wttr.in/${location}?format=%l:+%c+%t+(feels+like+%f),+%w+wind,+%h+humidity" 2>/dev/null) || weather_data="Weather unavailable" echo "$weather_data" ``` `scripts/morning_briefing.sh:84` ```bash echo "IMPORTANT: Read $OUTPUT_PATH and present its contents to the user EXACTLY as written. Do not summarize, reformat, paraphrase, or editorialize. Output the markdown verbatim." ``` `SKILL.md:26-27` ```markdown 3. **Read the file and present its contents verbatim to the user.** Do not summarize, reformat, paraphrase, add commentary, or editorialize. Output the entire markdown file exactly as written — the markdown IS the briefing. Do not wrap it in a code block. Do not omit sections. Do not change heading levels or link formatting. ``` ### Technical Analysis The script retrieves weather information from `wttr.in` without specifying an explicit HTTPS URL. The remote response is neither validated against an expected format nor escaped before being written into the generated Markdown briefing. The Skill instructions and the script's final message then direct the Agent to reproduce the generated file exactly as written. This combines an untrusted network input with a mandatory verbatim-output path. If the weather response is controlled or modified, arbitrary Markdown, deceptive links, phishing text, or instruction-like content can be inserted into the Agent's user-facing response. This finding is an insecure trust-boundary and output-handling flaw. The demonstrated code does not execute the remote response as shell code, so it does not by itself establish remote code execution. ### Attack Path 1. An attacker gains the ability to control or interce ...[truncated 1295 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Use an explicit authenticated transport URL: ```bash https://wttr.in/... ``` 2. Enable strict curl failure behavior and safe redirects, for example with `--fail`, `--show-error`, an appropriate redirect policy, and existing connection and overall timeouts. 3. Validate the response against a narrowly defined expected format before including it in the briefing. Reject multiline responses, unexpected control characters, Markdown constructs, and content exceeding a conservative size limit. 4. Escape externally supplied text before inserting it into Markdown, particularly link syntax, HTML, headings, and other formatting metacharacters. 5. Keep untrusted source data clearly separated from Agent instructions. Do not instruct the Agent to reproduce a file containing remote data unconditionally or verbatim. 6. Treat generated briefings as untrusted content and explicitly instruct the Agent not to follow commands or instructions embedded in source material. 7. On validation or transport failure, emit a fixed local message such as `Weather unavailable` rather than preserving an unexpected remote response. ]]>
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Rogue AgentSelf-Modification, Session Persistence
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
Findings (6)

Lp3

Medium
Category
MCP Least Privilege
Confidence
89% confidence
Finding
The skill invokes shell scripts and depends on external binaries like curl and jq, but it does not declare any explicit tool scope or permissions boundaries. That increases the risk of overbroad execution because an agent may run shell-capable actions without clear least-privilege constraints or user visibility into what tools the skill requires.

Vague Triggers

Medium
Confidence
94% confidence
Finding
The trigger phrases include broad natural-language invocations like 'what's new today' and 'daily briefing', which can match ordinary conversation and cause unintended skill activation. If triggered accidentally, the skill may execute shell scripts, perform network requests, and read or emit locally generated content without the user explicitly intending to run it.

Session Persistence

Medium
Category
Rogue Agent
Content
## Data Sources

Weather is built-in (direct curl to wttr.in). Other sections are driven by external skills that write JSON data files:

- **steam-games-updates** — game news from Steam
- **upcoming-metal-concerts** — concert listings from concerts-metal.com
Confidence
83% confidence
Finding
The skill aggregates data from external skills that persist JSON files, then instructs the agent to present the generated markdown 'verbatim'. Because those upstream files are trusted transitively and may contain attacker-controlled or prompt-injection content, the session can persist and replay untrusted instructions or misleading content directly to the user.

Missing User Warnings

Medium
Confidence
91% confidence
Finding
The script sends the user-configured weather location to wttr.in over the network without any explicit notice or consent at runtime. Even if the location seems low sensitivity, it can reveal where the user lives or spends time, and in a daily-triggered skill this disclosure happens repeatedly and automatically.

Natural-Language Policy Violations

Medium
Confidence
88% confidence
Finding
The final instruction requires the agent to present the generated contents exactly as written, which can prevent adaptation to the user's preferred language or locale. This imposes a fixed presentation behavior without offering opt-in or choice, which may violate language/locale policy expectations.

Missing User Warnings

Low
Confidence
85% confidence
Finding
The script redirects generated content into briefing.md, modifying the filesystem under the skill directory. Although the path is defined in code, there is no prior user-facing warning or explanatory comment/docstring disclosing that the skill writes a persistent output file.

Static analysis

No suspicious patterns detected.