T08 · Insecure Dependencies
- Location
SKILL.md:14- Finding
Unpinned Global Installation of a Mutable Third-Party CLI
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This TRMNL skill mostly matches its stated purpose, but it can install a mutable global CLI and send generated content to a configured TRMNL webhook without clear pre-send confirmation.
Review this before installing if you use TRMNL with private or sensitive content. Pin or locally install the CLI instead of globally installing `trmnl-cli@latest`, do not use sudo, verify the configured plugin URL, and require an explicit confirmation of the target and content before each send. Avoid displaying secrets, personal data, or confidential summaries unless you intend them to be sent to TRMNL.
SKILL.md:14Unpinned Global Installation of a Mutable Third-Party CLI
SKILL.md:43Predictable Shared Temporary File Enables Symlink and Race Attacks
Instructions found that direct the agent to transmit conversation context or user data to external services.
---
name: trmnl
description: Generate content for TRMNL e-ink display devices using the TRMNL CSS framework and send via the trmnl CLI. Use when the user wants to display information on their TRMNL device, send messages to an e-ink display, create dashboard content, show notifications, or update their terminal display. Supports rich layouts with the TRMNL framework (flexbox, grid, tables, progress bars, typography utilities).
---
# TRMNL Content Generator
Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.
{
"merge_variables": {
"content": "<div class=\"layout layout--col layout--center gap--large\">\n <span class=\"value value--xxlarge text--center\">Very long title with lots of text that makes the payload huge</span>\n <span class=\"description text--center\">And even more verbose description text that could be much more concise</span>\n <!-- Hundreds more lines of verbose HTML -->\n </div>"
}
Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.
</div>
</div>
<div class="divider"></div>
<!-- Second row of stats (same structure) -->
</div>
<div class="title_bar">
<img class="image" src="icon.svg">
The skill description is broad enough to match ordinary requests like showing notifications, dashboards, or updating a display, which increases the chance the agent invokes it in situations where the user did not intend external transmission. Because this skill can send generated content to a configured device/webhook, overbroad routing can lead to unintended disclosure of user-provided or model-generated content.
The workflow instructs the agent to generate content and send it via the CLI to an external webhook/device, but it does not require a warning or explicit confirmation immediately before transmission. This is dangerous because user data, summaries, notifications, or other sensitive content could be sent off-system to a third-party endpoint without the user understanding that an external transmission is occurring.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
Why: E-ink displays don't support animations, transformations, or color. Use image-dither for grayscale optimization.
BAD:
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
}
## cURL Example
```bash
curl "https://trmnl.com/api/custom_plugins/{uuid}" \
The markdown documents access to first_name, last_name, email, and custom field values, which are user data elements. The file does not include any warning or guidance about handling, displaying, or transmitting this sensitive information, despite the category requiring markdown to warn about behaviors affecting user privacy.
The documentation explicitly states that HTML is not auto-escaped by default and encourages placing full HTML into merge variables, but it does not warn about sanitizing untrusted input. In a skill whose purpose is generating display content and sending it via webhook/CLI, this increases the chance that user-controlled or external data will be injected into rendered markup, risking content spoofing, data leakage, or downstream rendering issues depending on the consumer.
Lines L047-L050 describe locale support using only en-US, de-DE, and fr-FR, which can imply a fixed set of preferred locales rather than user-selectable formatting. This may conflict with language/locale policy expectations because the text does not state that users can choose other locales or that these are merely examples.
No suspicious patterns detected.