Back to skill

Security audit

Tiny Builder

Security checks for vulnerabilities and agentic risk

Overview

This child-focused builder appears legitimate, but it automatically uploads creations and stores detailed child session logs without enough privacy controls.

Review this carefully before installing for a child. Use it only with a parent or guardian who understands that projects may be uploaded to gui.new as shareable links and that local files can store the child's requests and session history. Avoid entering names, locations, school details, or other personal information, and regularly delete old projects and parent logs. The publisher should add explicit consent, a local-only mode, log retention/deletion controls, and safer structured publishing commands.

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
SKILL.md:101
Finding
Shell Command Injection Through Unsafe HTML Interpolation<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:101-103` and `SKILL.md:125-128` **Vulnerability Type**: Shell command injection caused by unsafe interpolation into shell-quoted JSON **Risk Level**: High ### Vulnerable Code ```bash curl -X POST https://gui.new/api/canvas \ -H 'Content-Type: application/json' \ -d '{"title": "Star Catcher Game ⭐", "html": "<your html here>"}' ``` ```bash curl -X PUT https://gui.new/api/canvas/abc123xyz \ -H 'Content-Type: application/json' \ -H 'Authorization: Bearer tok_...' \ -d '{"html": "<updated html>"}' ``` ### Technical Analysis The skill instructs the agent to insert generated HTML directly into a single-quoted shell argument passed to `curl`. Generated project content can be influenced by the user and can legitimately contain apostrophes, quotation marks, backslashes, newlines, or shell metacharacters. JSON escaping does not provide shell escaping. If inserted HTML contains a single quote, it terminates the shell's quoted `-d` argument. Subsequent shell metacharacters may then be parsed as commands or command separators rather than as HTML data. Even non-malicious apostrophes can corrupt the JSON payload and cause publishing failures. The same unsafe construction is documented for both canvas creation and canvas updates. The update request additionally uses an authorization token in the same shell process, increasing the sensitivity of successful command injection. ### Attack Path 1. An attacker supplies project text or a requested title containing a crafted single quote followed by shell syntax. 2. The agent incorporates that attacker-controlled text into the generated HTML. 3. The generated HTML is substituted for `<your html here>` or `<updated html>` in the documented command. 4. The crafted single quote closes the surrounding shell argument. 5. The shell interprets the remaining metacharacters and text as additional shell operations. 6. Those operations execute with the same opera ...[truncated 1160 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. **Do not construct shell commands by concatenating generated HTML.** Use a native HTTP client or the approved `gui.new` SDK and pass an in-memory object to a JSON serializer. 2. **Serialize JSON structurally.** For example, create the payload with a JSON library rather than manually embedding HTML inside a JSON string. 3. **If `curl` is unavoidable, generate a payload file safely:** ```bash jq -n \ --arg title "$TITLE" \ --arg html "$HTML" \ '{title: $title, html: $html}' > payload.json curl --fail-with-body \ -X POST 'https://gui.new/api/canvas' \ -H 'Content-Type: application/json' \ --data-binary @payload.json ``` For updates: ```bash jq -n --arg html "$HTML" '{html: $html}' > payload.json curl --fail-with-body \ -X PUT "https://gui.new/api/canvas/$CANVAS_ID" \ -H 'Content-Type: application/json' \ -H "Authorization: Bearer $EDIT_TOKEN" \ --data-binary @payload.json ``` 4. **Avoid invoking a command through a shell.** Execute `curl` with an argument array, or use an SDK, so shell metacharacters are never interpreted. 5. **Validate identifiers separately.** Restrict canvas IDs to the documented character set before placing them in a URL. 6. **Protect edit tokens.** Keep tokens in memory where possible, avoid logging them, redact them from errors, and never embed them in generated project files. 7. **Apply defense in depth.** Run the agent as an unprivileged account with filesystem and outbound-network restrictions independently enforced by the runtime. 8. **Add regression tests** using HTML containing apostrophes, quotes, backslashes, newlines, command substitutions, and shell separators. Verify that the content is published literally and that no additional process is executed. ]]>
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (19)

Missing User Warnings

High
Confidence
98% confidence
Finding
The skill directs the agent to transmit generated HTML to an external third-party service and return a shareable link, but gives no explicit privacy notice that user-created content leaves the local environment. In a child-facing product, sending content off-device without transparent disclosure and parental awareness materially increases privacy and compliance risk.

Missing User Warnings

High
Confidence
97% confidence
Finding
The skill instructs persistent logging of child session details, requests, behavior, and possible emotional state to a parent-visible file without any explicit notice, consent flow, or minimization. For a child-focused skill, this creates a sensitive privacy risk because it records behavioral data that may be more extensive than necessary for core functionality.

Anti-Refusal Statement

High
Category
Anti-Refusal
Content
## Learning Through Building

Every project is a stealth learning opportunity. Weave in age-appropriate knowledge naturally — never lecture.

### How to Teach Without Teaching
Confidence
85% confidence
Finding
Skill instructs the agent to omit warnings, disclaimers, or ethical commentary. Stripping safety caveats hides risk from the user and is a common jailbreak preamble.

Missing User Warnings

Medium
Confidence
89% confidence
Finding
The README says the skill outputs a shareable `gui.new` link after each build, which implies sending user-generated content to an external publishing service, but it does not clearly warn users that creations may leave the local environment. In a child-focused skill, silent or default external sharing increases privacy and safety risk because project contents could include names, preferences, or other identifying details.

Ssd 3

Medium
Confidence
95% confidence
Finding
The parent dashboard section instructs persistent retention of user-provided session content, including quoted requests and generated summaries of the child's behavior and engagement. This is a data-retention vulnerability because it encourages indefinite storage of potentially sensitive content without access controls, minimization, or lifecycle management, increasing the chance of privacy leakage.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The README explicitly describes automatic logging of children's session activity, prompts, and behavioral summaries to a persistent file, but does not present any consent flow, retention limits, minimization guidance, or privacy warning. Because the skill is aimed at children, storing this data creates elevated privacy risk and could expose sensitive personal or behavioral information if the host system is shared, backed up, or otherwise accessed.

Intent-Code Divergence

Medium
Confidence
90% confidence
Finding
Lines L006-L007 frame the skill's technical publishing model as limited to gui.new only, implying a narrow operational scope around canvas creation and updates. Later instructions add local file persistence for project backups and parent/build logs, which contradicts that earlier statement rather than merely elaborating on it.

Natural-Language Policy Violations

Medium
Confidence
86% confidence
Finding
The language guidelines require a "1st-2nd grade reading level" with specific sentence and wording constraints, and the rest of the skill is written as if interaction will occur in English only. This can amount to a language/locale policy issue because no user opt-in or alternative language handling is offered.

External Transmission

Medium
Category
Data Exfiltration
Content
After generating the HTML, POST it to gui.new to get an instant shareable link:

```bash
curl -X POST https://gui.new/api/canvas \
  -H 'Content-Type: application/json' \
  -d '{"title": "Star Catcher Game ⭐", "html": "<your html here>"}'
```
Confidence
96% confidence
Finding
This instruction explicitly sends generated HTML to an external service, which is a real external transmission path. Even if intended for legitimate publishing, it becomes dangerous when users are children and the content may contain personal details, because data leaves the local environment and may be accessible through a shareable URL.

Missing User Warnings

Medium
Confidence
93% confidence
Finding
The skill requires saving project backups to local disk without clearly informing users that content persists beyond the session. Persistent storage is a privacy concern, especially in a child-oriented context, because creations may contain names, preferences, or other personal details entered during use.

Ssd 3

Medium
Confidence
95% confidence
Finding
The parent log creates a natural-language disclosure channel containing a child’s prompts, behavior, and flags, which can expose sensitive information beyond what is needed to summarize project activity. Free-form summaries are particularly risky because they encourage retention of subjective or unexpected personal details that are hard to control.

Natural-Language Policy Violations

Medium
Confidence
90% confidence
Finding
The skill hard-codes a child-directed communication style ('simple words', celebratory tone, no opt-in) without checking the actual user’s age or offering an alternative style. This can misclassify users, encourage infantilizing responses to adults, and create compliance/safety concerns if the agent is deployed in general-audience contexts or to minors without appropriate safeguards.

Missing User Warnings

Medium
Confidence
96% confidence
Finding
The file explicitly says a child's building sessions are logged automatically, but it provides no notice about consent, retention, access controls, or how potentially sensitive child-related data is handled. Because the context involves minors, even seemingly innocuous activity logs can create meaningful privacy and compliance risk if collected without clear disclosure and safeguards.

Intent-Code Divergence

Low
Confidence
78% confidence
Finding
L007 says there should be no outside data lookups, suggesting the agent should stay within provided materials and the child's inputs. The later 'Learning Through Building' section instructs the agent to supply factual claims about astronomy, animals, dinosaurs, and weather, creating tension with the earlier no-lookups/no-outside-data framing.

Ssd 3

Low
Confidence
88% confidence
Finding
Keeping an ongoing cross-session build log creates a retained activity history for a child user, which can reveal interests and patterns over time even if the data seems harmless individually. The risk is lower than the parent summary log, but it still increases privacy exposure through unnecessary retention.

Natural-Language Policy Violations

Low
Confidence
90% confidence
Finding
The document declares `lang="en"`, which hard-codes English as the page language. Under the policy criteria, forcing a specific language without user opt-in or a documented justification can be a locale-policy issue.

Natural-Language Policy Violations

Low
Confidence
91% confidence
Finding
The root HTML element sets `lang="en"`, which hard-codes English as the document language. Under the stated policy, forcing a specific language without user opt-in or a documented region-specific reason is a natural-language locale constraint.

Natural-Language Policy Violations

Low
Confidence
93% confidence
Finding
The document root sets `lang="en"`, which hard-codes English as the language context. Under the policy rules, forcing a specific language or locale without user opt-in or a stated region-specific justification is a natural-language policy concern.

Natural-Language Policy Violations

Low
Confidence
90% confidence
Finding
The document declares `lang="en"`, which is a natural-language locale choice embedded in the file. Under the policy, forcing a specific language without user opt-in can be a locale-policy violation when no alternative or justification is provided.

Static analysis

No suspicious patterns detected.