Back to skill

Security audit

News Summarizer

Security checks for vulnerabilities and agentic risk

Overview

This is a straightforward news-summary skill with expected network access and optional OpenAI voice generation, with only minor disclosure and temp-file hygiene notes.

Before installing, be aware that text-to-speech uses OpenAI and sends the generated news summary to that service. Prefer text-only mode for sensitive briefings, and consider changing the audio output path to a private temporary file if used on shared systems.

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

Note
Location
SKILL.md:85
Finding
Predictable Shared Temporary File Enables Symlink-Based File Overwrite## Vulnerability Details **File Location**: `SKILL.md`, lines 85-94 **Vulnerability Type**: Unsafe temporary-file handling **Risk Level**: Low ### Vulnerable Code ```bash curl -s https://api.openai.com/v1/audio/speech \ -H "Authorization: Bearer $OPENAI_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "tts-1-hd", "input": "<news summary text>", "voice": "onyx", "speed": 0.95 }' \ --output /tmp/news.mp3 ``` ### Technical Analysis The voice-summary workflow writes generated audio to the fixed, predictable path `/tmp/news.mp3`. On systems where `/tmp` is shared among users or processes, an attacker may create this path in advance as a symbolic link to another file. When the documented `curl` command subsequently opens the output path, it may follow the symbolic link and truncate or overwrite the linked destination using the privileges of the process running the skill. The fixed filename also creates race conditions between concurrent skill executions and may expose one user's generated audio to another local user, depending on filesystem permissions and system configuration. The external HTTPS requests themselves are consistent with the skill's declared functionality. `$OPENAI_API_KEY` is sent only as an authorization credential to the declared OpenAI TTS endpoint; the reviewed content does not establish credential exfiltration. ### Attack Path 1. A local attacker capable of writing to `/tmp` predicts that the skill will use `/tmp/news.mp3`. 2. Before the voice-summary workflow runs, the attacker creates `/tmp/news.mp3` as a symbolic link to a file writable by the skill's operating-system account. 3. A user invokes the optional voice-summary workflow. 4. `curl` follows the attacker-controlled path while creating or truncating its output. 5. The OpenAI audio response overwrites the linked target with the privileges of the skill process. Alternatively, two co ...[truncated 561 chars]
Remediation
## Remediation Suggestions - Create a private, unpredictable temporary directory and file rather than using a fixed shared path: ```bash tmp_dir="$(mktemp -d)" || exit 1 chmod 700 "$tmp_dir" audio_file="$tmp_dir/news.mp3" cleanup() { rm -rf -- "$tmp_dir" } trap cleanup EXIT HUP INT TERM curl --fail --silent --show-error \ https://api.openai.com/v1/audio/speech \ -H "Authorization: Bearer $OPENAI_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "tts-1-hd", "input": "<news summary text>", "voice": "onyx", "speed": 0.95 }' \ --output "$audio_file" ``` - Apply restrictive permissions with `umask 077` before creating temporary content. - Remove temporary audio immediately after it has been delivered. - Do not reuse output paths across users, sessions, or concurrent executions. - If the execution environment supports it, use an application-owned private temporary directory and APIs that create files atomically without following symbolic links.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (4)

Missing User Warnings

Medium
Confidence
87% confidence
Finding
The voice-summary workflow instructs sending generated summary text to an external TTS service without any explicit notice, consent check, or data-sensitivity guard. If the summary ever contains user-provided, private, or regulated information, this creates an avoidable data disclosure path to a third-party API.

External Transmission

Medium
Category
Data Exfiltration
Content
3. Send as audio message

```bash
curl -s https://api.openai.com/v1/audio/speech \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
Confidence
82% confidence
Finding
The presence of an external API endpoint indicates the skill is designed to send data off-system to a third-party service. While not inherently malicious, this is security-relevant because it expands the trust boundary and can expose generated content and metadata if used without disclosure or policy controls.

External Transmission

Medium
Category
Data Exfiltration
Content
3. Send as audio message

```bash
curl -s https://api.openai.com/v1/audio/speech \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
Confidence
82% confidence
Finding
The presence of an external API endpoint indicates the skill is designed to send data off-system to a third-party service. While not inherently malicious, this is security-relevant because it expands the trust boundary and can expose generated content and metadata if used without disclosure or policy controls.

Description-Behavior Mismatch

Low
Confidence
92% confidence
Finding
The manifest description at L3-L6 claims the skill fetches world news from BBC, Reuters, and NPR RSS feeds, which defines a specific source set. The documented implementation in SKILL.md also includes The Hindu RSS feed, so the skill behavior/documented workflow is broader than the manifest describes.

Static analysis

No suspicious patterns detected.