Back to skill

Security audit

Briefing Room

Security checks for vulnerabilities and agentic risk

Overview

The skill mostly matches its stated briefing purpose, but it needs Review because its cleanup command can permanently delete unrelated date-named folders if the output path is broad or misconfigured.

Install only if you are comfortable with a skill that performs web searches/API requests, saves briefings to disk, and starts a background generation session. Avoid setting output.folder to broad locations such as /tmp, ~/Documents, Desktop, or Downloads, and do not run the clean command until deletion is constrained to a dedicated Briefing Room folder with confirmation or ownership checks.

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

Error
Location
scripts/briefing.sh:207
Finding

Configurable output path enables deletion of unrelated directories

Content
View full analysis
dict: config = deep_copy(DEFAULT_CONFIG) if CONFIG_FILE.exists(): try: with open(CONFIG_FILE, 'r') as f: user_config = json.load(f) config = deep_merge(config, user_config) except json.JSONDecodeError as e: print(f"⚠️ Config corrupted: {e}", file=sys.stderr) print(f" Using defaults. Fix or delete: " f"{CONFIG_FILE}", file=sys.stderr) except IOError: pass return config ``` `scripts/config.py:170-183` validates paths only when they are changed through the `set` command. The validation also uses a string-prefix comparison rather than a path-component-aware containment check: ```python SAFE_OUTPUT_PREFIXES = [ os.path.realpath(os.path.expanduser("~/Documents")), os.path.realpath(os.path.expanduser("~/Desktop")), os.path.realpath(os.path.expanduser("~/Downloads")), os.path.realpath(os.path.expanduser("~/.briefing-room")), os.path.realpath("/tmp"), ] def _validate_output_path(path: str) -> bool: """Reject output.folder paths outside safe directories.""" expanded = os.path.realpath(os.path.expanduser(path)) return any(expanded.startswith(prefix) for prefix in SAFE_OUTPUT_PREFIXES) def set_value(key: str, value) -> bool: if key == "output.folder" and isinstance(value, str): if not _validate_output_path(value): print(f"Error: output.folder must be under ~/Documents, ~/Desktop, ~/Downloads, ~/.briefing-room, or /tmp", file ...[truncated 3712 chars]
Remediation
View remediation
bool: try: path.relative_to(root) return path != root except ValueError: return False ``` On older versions, use `os.path.commonpath()` and explicitly reject equality with the root. 3. **Require a dedicated application directory.** Restrict output to directories such as: - `~/Documents/Briefing Room` - `~/Desktop/Briefing Room` - `~/Downloads/Briefing Room` - `~/.briefing-room/output` - A uniquely named child under `/tmp` Do not accept `/tmp`, `~/Documents`, `~/Desktop`, or `~/Downloads` themselves. 4. **Mark and verify application-owned directories.** Create a marker such as `.briefing-room-owned` in the output root and require that marker before any cleanup operation. 5. **Validate deletion targets individually.** Before deletion, resolve each candidate and verify that: - It is strictly below the normalized output root. - Its basename exactly matches `YYYY-MM-DD`, rather than merely beginning with `20`. - It contains the application ownership marker or expected briefing artifacts. - It is not a symbolic-link traversal target. 6. **Prefer constrained deletion over broad `rm -rf`.** Remove only known briefing filenames and delete the directory only after it is empty. Add a dry-run mode and log every target before deletion. 7. **Fail closed.** If configuration validation, path resolution, ...[truncated 91 chars]
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • Rogue AgentSelf-Modification, Session Persistence
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
Findings (19)

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

The declared purpose describes an end-to-end briefing generator that creates audio and DOCX outputs and covers a broad set of news domains. The supplied code chunk is explicitly a helper script, and its own comments state that the actual briefing is composed elsewhere. Its behavior is limited to support tasks: dependency/config checks, directory management, opening folders, cleanup, and fetching a subset of data feeds (weather, social/web trends, crypto). While some fetched data aligns with parts of the declared briefing inputs, the script does not itself generate the promised briefing artifacts or cover most of the declared content areas. Therefore the description does not accurately represent what this code chunk actually does.

Content

No source excerpt is available for this finding.

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
85% 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 446)May include surrounding context.

say -v "$VOICE" ${RATE:+-r $RATE}
-o "$OUTPUT_DIR/briefing-$TIMESTAMP.aiff"
-f "$TTS_TXT" rm -f "/tmp/briefing_tts_$TIMESTAMP.txt"

text

**Kokoro PyTorch (fallback):**

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
85% 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 479)May include surrounding context.

Step 6c: Cleanup

bash
rm -f "/tmp/briefing_draft_$TIMESTAMP.md"

Step 7: Open Output Folder

External Script Fetching

High
Category
Supply Chain
Confidence
90% confidence
Finding

Remote code is downloaded and executed. This bypasses code review and could introduce malicious code.

Content

Scanner excerpt · scripts/briefing.sh (reported line 172)May include surrounding context.

sh
echo "=== Crypto Prices ==="
    for coin in BTC ETH SOL XRP; do
        echo -n "$coin/USD: "
        curl -s --max-time 10 "https://api.coinbase.com/v2/prices/$coin-USD/spot" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d['data']['amount'])" 2>/dev/null || echo "N/A"
    done
}

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The trigger phrases are very generic everyday requests such as 'Give me a briefing', 'Morning update', and 'What's happening today?', which can easily collide with normal conversation and cause unintended skill activation. In an agent environment, over-broad invocation patterns can lead to accidental execution of web-searching and local file-generating behavior when the user did not explicitly intend to use this specific skill.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
92% confidence
Finding

The skill clearly instructs use of shell commands, file reads/writes, network access, and session spawning, but it declares no explicit tool scope or permissions boundary. That makes the skill harder to review and increases the chance an agent will grant broader capabilities than users expect, especially because it also writes persistent files and accesses multiple external services.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The skill does substantial external data collection and persistent disk writes, but the user-facing description does not prominently warn about those behaviors upfront. That weakens informed consent and can surprise users with network access, generated documents, and saved audio artifacts in their home directory.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The trigger phrases are broad enough to match common conversational requests like 'daily update' or 'what's happening today,' which can cause over-invocation of a high-capability skill. In context, accidental triggering is more dangerous because the skill immediately plays audio, spawns a sub-agent, performs web research, and writes files without an additional confirmation step.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
Confidence
86% confidence
Finding

The skill persists generated briefings under a dated folder in the user's documents directory, creating durable artifacts that may contain location, language preferences, trends, and synthesized content. In context this persistence is part of the product, but it still creates privacy and retention risk because the files remain on disk and the skill also stores configuration under the home directory.

Content

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

DATE=$(date +%Y-%m-%d) TIMESTAMP=$(date +%Y-%m-%d-%H%M) OUTPUT_DIR="$OUTPUT_FOLDER/$DATE" mkdir -p "$OUTPUT_DIR"

text

### Step 1: Gather Data — Weather

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

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

md
local tz_encoded="${tz/\//%2F}"

    echo "=== Current Weather ($city) ==="
    curl -s --max-time 10 "https://api.open-meteo.com/v1/forecast?latitude=$lat&longitude=$lon&current=temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m&timezone=$tz_encoded"
    echo ""
    echo ""
    echo "=== 7-Day Forecast ==="

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · scripts/briefing.sh (reported line 67)May include surrounding context.

sh
local tz_encoded="${tz/\//%2F}"

    echo "=== Current Weather ($city) ==="
    curl -s --max-time 10 "https://api.open-meteo.com/v1/forecast?latitude=$lat&longitude=$lon&current=temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m&timezone=$tz_encoded"
    echo ""
    echo ""
    echo "=== 7-Day Forecast ==="

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · scripts/briefing.sh (reported line 71)May include surrounding context.

sh
local tz_encoded="${tz/\//%2F}"

    echo "=== Current Weather ($city) ==="
    curl -s --max-time 10 "https://api.open-meteo.com/v1/forecast?latitude=$lat&longitude=$lon&current=temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m&timezone=$tz_encoded"
    echo ""
    echo ""
    echo "=== 7-Day Forecast ==="

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

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

md
echo "=== Crypto Prices ==="
    for coin in BTC ETH SOL XRP; do
        echo -n "$coin/USD: "
        curl -s --max-time 10 "https://api.coinbase.com/v2/prices/$coin-USD/spot" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d['data']['amount'])" 2>/dev/null || echo "N/A"
    done
}

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

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

md
echo "=== Crypto Prices ==="
    for coin in BTC ETH SOL XRP; do
        echo -n "$coin/USD: "
        curl -s --max-time 10 "https://api.coinbase.com/v2/prices/$coin-USD/spot" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d['data']['amount'])" 2>/dev/null || echo "N/A"
    done
}

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

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

md
echo "=== Crypto Prices ==="
    for coin in BTC ETH SOL XRP; do
        echo -n "$coin/USD: "
        curl -s --max-time 10 "https://api.coinbase.com/v2/prices/$coin-USD/spot" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d['data']['amount'])" 2>/dev/null || echo "N/A"
    done
}

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

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

md
echo "=== Crypto Prices ==="
    for coin in BTC ETH SOL XRP; do
        echo -n "$coin/USD: "
        curl -s --max-time 10 "https://api.coinbase.com/v2/prices/$coin-USD/spot" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d['data']['amount'])" 2>/dev/null || echo "N/A"
    done
}

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · scripts/briefing.sh (reported line 172)May include surrounding context.

sh
echo "=== Crypto Prices ==="
    for coin in BTC ETH SOL XRP; do
        echo -n "$coin/USD: "
        curl -s --max-time 10 "https://api.coinbase.com/v2/prices/$coin-USD/spot" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d['data']['amount'])" 2>/dev/null || echo "N/A"
    done
}

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The clean command performs irreversible deletion with rm -rf on directories older than 30 days. Although it prints which directory is being removed, there is no confirmation step before deletion, and this file itself does not provide a stronger user warning or safeguard for the destructive action.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
93% confidence
Finding

The default config sets the skill language to "en" and the status/help text presents language as a fixed configuration value rather than offering a user choice at runtime. This is a natural-language locale policy concern because the skill defaults to a specific language without explicit opt-in or selection by the user.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.