Ae1
- Category
- analysis-evasion
- Confidence
- 100% confidence
- Finding
Referenced artifact was not completely inspected
- Content
md | `render.mjs` | one design → **one image** (og card, badge, element, page, SVG) |
Security audit
Security checks for vulnerabilities and agentic risk
The skill does what it claims: renders HTML, SVGs, and URLs into images using local Chromium, with the main risks disclosed.
Install this only if you are comfortable installing Node dependencies plus Playwright Chromium. Use it on your own HTML or URLs you trust; pages rendered by Chromium can run JavaScript and contact the network. Avoid pointing it at untrusted HTML, especially when your machine has access to private services or local-only resources.
Referenced artifact was not completely inspected
| `render.mjs` | one design → **one image** (og card, badge, element, page, SVG) |
Referenced artifact was not completely inspected
| `render.mjs` | one design → **one image** (og card, badge, element, page, SVG) |
Referenced artifact was not completely inspected
| `render.mjs` | one design → **one image** (og card, badge, element, page, SVG) |
Referenced artifact was not completely inspected
| `render.mjs` | one design → **one image** (og card, badge, element, page, SVG) |
Referenced artifact was not completely inspected
| `render.mjs` | one design → **one image** (og card, badge, element, page, SVG) |
Referenced artifact was not completely inspected
| `render.mjs` | one design → **one image** (og card, badge, element, page, SVG) |
Referenced artifact was not completely inspected
| `render.mjs` | one design → **one image** (og card, badge, element, page, SVG) |
Referenced artifact was not completely inspected
| `icons.mjs` | one design → **a favicon or app-icon set** (`.ico`/`.icns`/apple-touch/PWA) |
Referenced artifact was not completely inspected
| `icons.mjs` | one design → **a favicon or app-icon set** (`.ico`/`.icns`/apple-touch/PWA) |
Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.
<!doctype html>
<!--
html-shot starter template: a transparent, square mark — an app icon, a favicon master, a
badge. The counterpart to template.example.html, which is an opaque 1200x630 card.
Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.
<!doctype html>
<!--
html-shot starter template: a 1200x630 social card. System fonts only, so it renders
out of the box with no /fonts directory.
Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.
npx skills add rockbenben/aishort-skills
Or clone this repo and copy (or symlink) `skills/html-shot/` into your agent's skills
folder — `~/.claude/skills/` for Claude Code, `~/.agents/skills/` for the cross-runtime
convention Codex and Gemini CLI also read, or wherever your agent keeps them.
Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.
First run only — install the engine:
# $SKILL_DIR = wherever the skill landed (Claude Code: ~/.claude/skills/html-shot)
SKILL_DIR=~/.claude/skills/html-shot
cd "$SKILL_DIR" && npm install && node node_modules/playwright/cli.js install chromium
The trigger examples are broad ordinary-language phrases like "turn this design into a 2x og image" and "screenshot the hero section of that page," which can cause the skill to activate in routine conversation rather than only when explicitly intended. Over-broad triggering increases the chance the agent invokes a capability that executes local Chromium against user-supplied HTML/URLs, expanding exposure to unsafe content or unintended network access.
The early capability description presents the skill as a convenient HTML/URL/SVG-to-image renderer without prominently warning that rendering HTML in Chromium executes JavaScript and can initiate outbound requests. Although a warning appears later, surfacing the capability before the risk can mislead users into treating untrusted input as safe, increasing SSRF, data exfiltration, or local-environment exposure risk.
npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.
npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.
Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.
仅首次运行 —— 装引擎:
# $SKILL_DIR = skill 实际所在目录(Claude Code 为 ~/.claude/skills/html-shot)
SKILL_DIR=~/.claude/skills/html-shot
cd "$SKILL_DIR" && npm install && node node_modules/playwright/cli.js install chromium
Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.
仅首次运行 —— 装引擎:
# $SKILL_DIR = skill 实际所在目录(Claude Code 为 ~/.claude/skills/html-shot)
SKILL_DIR=~/.claude/skills/html-shot
cd "$SKILL_DIR" && npm install && node node_modules/playwright/cli.js install chromium
The auto-trigger phrases are broad natural-language descriptions like '生成 og 图' and '网页截图', which can overlap with ordinary conversation and cause the skill to activate unexpectedly. In this skill's context, unintended activation is more dangerous because the tool can render HTML/URLs and may execute page JavaScript and make network requests.
The skill explicitly supports rendering arbitrary URLs and states that HTML genuinely executes in Chromium with outbound requests enabled, which gives it effective network capability. Because the manifest declares no tool scope or allowed-tools restrictions, an agent may invoke a network-capable skill without clear authorization boundaries, increasing the chance of SSRF-style access, unintended external fetches, or data exfiltration through rendered pages.
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.
1. **First run only** — install the engine (below). If it is already installed, `render.mjs`
just works; if it is not, the script exits with the exact install command to run.
2. **Write or copy the HTML.** Two starters, and they size themselves differently on purpose:
- `template.example.html` — a card. `body` gets an explicit `width`/`height` in px and the
output size flows from there.
- `icon.example.html` — a transparent mark or app icon. The shape sits on a **child**
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
node {SKILL_DIR}/node_modules/playwright/cli.js install --with-deps chromium
sudo apt install fonts-noto-cjk fonts-noto-color-emoji # Debian/Ubuntu
`{SKILL_DIR}` is this skill's own directory — whatever path the agent reports when it loads
These lines explicitly say output for CJK text depends on the machine's locale if no lang is provided. That implies language/locale-sensitive behavior can be imposed implicitly rather than by an explicit user choice, which falls under the locale policy concerns for natural-language content.
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
| An absolutely-positioned element drifts off the card | `position:absolute` resolves against the viewport unless an ancestor is positioned. Put `position:relative` on `body` (the starter template does). |
| Works locally, 404s in Linux CI | A reference whose case does not match the file on disk. Windows/macOS match case-insensitively, Linux does not — the render prints `note — /IMG/A.PNG is spelled /img/a.png on disk` when it spots one. |
| `browserType.launch` fails on Alpine / `node:*-alpine` | Playwright has no musl Chromium build. Switch the image to a glibc base (`node:22-slim`, `node:22-bookworm`). |
| CJK/emoji come out as tofu boxes (□□□) — Linux only | The machine has no CJK/emoji font. `sudo apt install fonts-noto-cjk fonts-noto-color-emoji`, or reference a bundled webfont so the card no longer depends on the host. |
| `browserType.launch` fails with "Host system is missing dependencies" — Linux only | Chromium's shared libs are absent: `node {SKILL_DIR}/node_modules/playwright/cli.js install --with-deps chromium`. |
| Han characters look subtly wrong — Japanese text drawn with Chinese shapes, or vice versa | `<html lang="…">` selects the CJK fallback font. Set it to the content's language (`zh-CN`, `zh-TW`, `ja`, `ko`); with no `lang` the result follows the rendering machine's locale. |
| The same HTML looks different on another machine | System fonts differ across Windows/macOS/Linux, and `lang` steers CJK fallback. For byte-comparable output in CI, set `lang` and bundle a webfont via `@font-face` instead of relying on `system-ui`. |
Detected: suspicious.dangerous_exec