Back to skill

Security audit

daily news briefing

Security checks for vulnerabilities and agentic risk

Overview

This skill is a coherent news-briefing helper with a local template generator, but users should treat generated HTML metadata as untrusted before publishing.

Install only if you are comfortable with a skill that uses web research for current news and can generate local Markdown or HTML briefing skeletons. For HTML output, avoid using titles, audience labels, dates, or scopes supplied by untrusted parties, and review or escape those fields before publishing the generated file on a trusted site.

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/render_briefing_package.py:16
Finding

Unescaped Template Substitution Enables HTML Injection

Content
View full analysis
str: safe = template_text for key, value in replacements.items(): safe = safe.replace("{{" + key + "}}", value) return safe ``` Command-line values are placed directly into the replacement map: ```python replacements = { "title": args.title, "date": args.date, "audience": args.audience, "scope": args.scope, "summary_bullet_1": "[Add the most important development]", "summary_bullet_2": "[Add the second most important development]", "summary_bullet_3": "[Add the third most important development]", "story_1_headline": "[Insert lead headline]", "story_1_summary": "[Summarize the lead story in 2 to 4 sentences.]", "story_1_why": "[Explain why this matters now.]", "story_1_sources": "[Add source links]", "story_2_headline": "[Insert second headline]", "story_2_summary": "[Summarize the second story.]", "story_2_why": "[Explain the implication.]", "story_2_sources": "[Add source links]", "story_3_headline": "[Insert third headline]", "story_3_summary": "[Summarize the third story.]", "story_3_why": "[Explain the implication.]", "story_3_sources": "[Add source links]", "watch_item_1": "[Add watch item]", "watch_item_2": "[Add watch item]", "watch_item_3": "[Add watch item]", "closing_take": "[Write a concise closin ...[truncated 3219 chars]
Remediation
View remediation
dict[str, str]: return { key: escape(value, quote=True) for key, value in replacements.items() } ``` Use the escaped map only for HTML rendering: ```python html_replacements = build_html_replacements(replacements) write_file( output_dir / "briefing.html", render_with_placeholders( html_template, html_replacements, ).rstrip() + "\n", ) ``` 2. Keep separate replacement maps for Markdown and HTML. HTML escaping should not be applied indiscriminately to Markdown output because the two formats have different rendering requirements. 3. Prefer an established template engine with automatic HTML escaping, such as Jinja2 configured with `autoescape=True`, if additional templates or dynamic contexts are introduced. 4. Treat all future story text, source links, headlines, and watchlist content as untrusted. Escape element text and validate URL schemes separately before inserting links into `href` attributes. 5. Add regression tests using payloads containing: - Script elements. - Closing HTML tags. - Event-handler attributes. - Double and single quotation marks. - Ampersands and angle brackets. - `javascript:` URLs if dynamic hyperlink attributes are later supported. 6. Verify that generated HTML displays these test values as literal text and does not create additional DOM elements or executable event handlers. ]]>
Vulnerability Patterns
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (5)

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

The skill markets itself as producing verified, current, trustworthy news briefings, but the described automation only scaffolds templates and metadata rather than actually performing news gathering, verification, or substantive synthesis. This can mislead users into treating generated output as validated current intelligence, creating decision-making, reputational, and compliance risk when the content is stale, incomplete, or placeholder-based.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
70% confidence
Finding

Without declared permissions the skill's intent is opaque and cannot be validated.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The manifest description says to use the skill for 'any recurring news summary,' which is a broad activation condition without clear boundaries or exclusions. This could overlap with ordinary requests to summarize news and cause unintended invocation beyond the intended premium daily-briefing use case.

Content

No source excerpt is available for this finding.

Autonomous Decision Making

Medium
Category
Excessive Agency
Confidence
80% confidence
Finding

Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.

Content

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

md
## Security Notes

- The bundled script only renders local templates into an output folder.
- Do not ask the user to run remote shell commands or download opaque installers.
- Keep source links visible and near each story so the user can verify claims quickly.
- Prefer local template rendering plus verified web research over hidden automation.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
96% confidence
Finding

The template sets <html lang="en">, which hard-codes English as the document language. Under the policy criteria, forcing a specific language without user opt-in or a documented region-specific justification is a natural-language policy concern.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.