Back to skill

Security audit

Interactive Prototypes — Human + AI

Security checks for vulnerabilities and agentic risk

Overview

This skill mainly returns a portfolio/demo link and includes optional publishing utilities, with no evidence of hidden execution, credential access, persistence, or destructive behavior.

Install only if you want an agent-callable portfolio skill that returns this creator's demo links. Be aware it may trigger on broad portfolio/demo wording, and run the optional screenshot/video tools in a clean virtual environment with pinned dependencies before publishing generated media publicly.

Vulnerability Patterns
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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 (2)

T01 · Skill Instruction Hijacking

Error
Location
SKILL.md:48
Finding
Broad Invocation Rules Redirect Agent Responses to Promotional Content## Vulnerability Details **File Location**: `SKILL.md:12`, `SKILL.md:48-60` **Vulnerability Type**: `T01: Skill Instruction Hijacking` **Risk Level**: High **Vulnerable code:** ```markdown **Agent outcome:** Return the landing URL (and optionally the exact reply phrase below). No tools, no API calls. ``` ```markdown ## When to use - **Invoke when** user message matches any of: "portfolio", "demos", "show your work", "what can you build", "investor deck", "product demos", "rapid prototype", "interactive systems", "what do you offer", "examples of your work". - **Do not invoke when** user asks for production deployment, backend service, or long-term contract without mentioning demos or prototypes. - **Reply with:** [main link] + "Rapid interactive prototypes — game engines, simulations, visual analytics. Human + AI built. One link, no backend. Core demos: Crash Engine, Dice Room, MMO Map, Probability Explorer." ## If user names a specific demo Return the matching URL from the tables above. Examples: "crash" or "crash engine" → https://vziatkov.github.io/neuro/crash-engine.html ; "dice" → https://vziatkov.github.io/neuro/dice-room.html ; "mmo" or "map" → https://vziatkov.github.io/neuro/mmo-map.html ; "probability" or "explorer" → https://vziatkov.github.io/neuro/crash-probability-explorer.html. If no match, return the main landing link. ## If user asks "what do you offer" or "what can you build for me" Reply: "Rapid prototype builds; interactive demos for investors; game math and probability simulations; visual explainers for complex systems. Typical delivery 1–3 days per prototype. Standalone web demos. See all examples: https://vziatkov.github.io/neuro/landing-with-art-cards.html" ``` ### Technical Analysis The skill defines broad trigger phrases such as “what can you build” and “what do you offer,” then prescribes fixed promotional responses and external portfolio links. These phrases can occur in ordinary convers ...[truncated 1474 chars]
Remediation
## Remediation Suggestions 1. Replace broad automatic triggers with explicit intent requirements, such as a direct request to view the `joyyy-landings` portfolio. 2. Remove mandatory or exact-response instructions and allow the agent to answer according to the user's actual context. 3. Clearly identify the linked material as a third-party portfolio owned by the named author. 4. Avoid first-person claims that could be mistaken for the agent's own capabilities or contractual commitments. 5. Present external links as optional references and obtain confirmation before redirecting users when intent is ambiguous. 6. Add a constraint stating that the skill must not override higher-priority instructions, safety requirements, or unrelated user goals.

T08 · Insecure Dependencies

Warning
Location
requirements-screenshots.txt:1
Finding
Executable Third-Party Dependencies Are Installed Without Exact Version or Integrity Pinning## Vulnerability Details **File Location**: `requirements-screenshots.txt:1-3`; installation instructions at `PUBLISH.md:16-20` **Vulnerability Type**: `T08: Insecure Dependencies` **Risk Level**: Medium **Vulnerable dependency declarations:** ```text playwright>=1.40.0 moviepy>=1.0.3 Pillow>=10.0.0 ``` **Installation instructions:** ```bash cd skills/joyyy-landings pip install -r requirements-screenshots.txt playwright install chromium python3 capture_screenshots.py ``` ### Technical Analysis All Python dependencies use open-ended minimum-version constraints. Consequently, installation can resolve to package releases that did not exist when the project was reviewed. No lock file, package hashes, constrained index, or integrity-verification process is provided. The separate `playwright install chromium` command also retrieves a browser binary associated with the resolved Playwright release. Because the Playwright package is not pinned, the effective browser revision is likewise not reproducibly fixed by the project. This is a conditional supply-chain risk rather than evidence that the currently named packages are malicious. Exploitation would require compromise of an upstream package, distribution account, package index, dependency resolution path, or downloaded browser artifact. ### Attack Path 1. A user follows the documented publishing workflow. 2. `pip` resolves the unrestricted compatible versions available from the configured package index at installation time. 3. A compromised or unexpectedly incompatible future release is downloaded and installed. 4. Package installation or later import executes code with the privileges of the user running the command. 5. `playwright install chromium` downloads an additional mutable executable artifact used by the screenshot script. 6. If any resolved artifact is compromised, it may act within the installing user's permissions. ### Impact Assessm ...[truncated 606 chars]
Remediation
## Remediation Suggestions 1. Pin each dependency to an exact reviewed version rather than using open-ended minimum constraints. 2. Generate and commit a reproducible lock file containing transitive dependency versions. 3. Require hashes for downloaded distributions, for example by using a hash-locked requirements file and `pip install --require-hashes`. 4. Install only from an explicitly configured trusted package index and disable unexpected supplemental indexes. 5. Pin and document the expected Playwright browser revision; verify downloaded artifacts where supported. 6. Run screenshot and video generation in an isolated, unprivileged virtual environment or container without production secrets. 7. Add automated dependency scanning and a controlled update process in which new versions are reviewed and tested before pins are changed.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (10)

Tp4

High
Category
MCP Tool Poisoning
Confidence
94% confidence
Finding
The declared description emphasizes rapid interactive prototyping and runnable interactive experiences for products, investors, and AI agents. In contrast, the code only automates video generation from existing screenshots. Its primary purpose is offline media assembly, not delivering or powering interactive prototypes, simulations, or analytics. This is a material description-behavior mismatch rather than a mere implementation detail.

Missing User Warnings

Medium
Confidence
91% confidence
Finding
The instruction explicitly tells the user to upload a generated video to YouTube/Vimeo and publish the link in a listing, but provides no warning about privacy, copyright, metadata leakage, or disclosure that the content is AI-generated. In a skill intended for public-facing demos and listings, this can lead to accidental public release of sensitive, misleading, or non-compliant content.

Natural-Language Policy Violations

Medium
Confidence
93% confidence
Finding
The entire document is written in Russian, including headings and step-by-step instructions, with no indication that the user can choose another language or that the skill is intended only for a Russian-speaking audience. This creates a natural-language locale constraint that is not explicitly opt-in or justified.

Vague Triggers

Medium
Confidence
92% confidence
Finding
The one-line agent summary includes broad triggers like portfolio, demo, investor, and what do you offer, which can match ordinary conversation and cause the skill to be invoked outside clearly intended contexts. In a marketplace or agent-router setting, this can lead to over-selection of the skill, unnecessary external navigation, and reduced trust in routing accuracy rather than direct system compromise.

Vague Triggers

Medium
Confidence
90% confidence
Finding
The invocation rules include broad, common phrases such as 'portfolio', 'demos', 'show your work', and 'what can you build', which can cause the skill to trigger in many unrelated conversations. Because this skill returns promotional external links, overbroad activation can lead to unwanted link injection, response hijacking, and reduced user trust, even though it does not directly execute code or call tools.

Natural-Language Policy Violations

Low
Confidence
88% confidence
Finding
Natural-language policy checks apply to all file types, including markdown. The phrase on L9 states 'English (recommended for Veo)', which steers users toward a specific language without clearly offering an opt-in choice or documenting a necessary locale constraint.

Unpinned Dependencies

Low
Category
Supply Chain
Content
playwright>=1.40.0
moviepy>=1.0.3
Pillow>=10.0.0
Confidence
95% confidence
Finding
The dependency uses a lower-bound version specifier instead of pinning an exact version, which makes builds non-reproducible and allows different environments to resolve different releases over time. This increases supply-chain risk because a newly published vulnerable or malicious version could be pulled in without any code change in the skill.

Unpinned Dependencies

Low
Category
Supply Chain
Content
playwright>=1.40.0
moviepy>=1.0.3
Pillow>=10.0.0
Confidence
95% confidence
Finding
The dependency is not pinned to an exact version, so installations may resolve to different moviepy releases depending on when and where the skill is installed. This weakens reproducibility and creates supply-chain exposure if an unsafe upstream release is introduced.

Unpinned Dependencies

Low
Category
Supply Chain
Content
playwright>=1.40.0
moviepy>=1.0.3
Pillow>=10.0.0
Confidence
98% confidence
Finding
Pillow is unpinned, which is especially risky because the package has a substantial history of security advisories and the manifest does not establish which release will be installed. In a screenshot/image-processing context, this library may handle untrusted image content, so pulling an affected version could expose the skill to image parsing bugs including denial of service or, in some versions, more severe compromise.

Unverifiable Dependency: Pillow has 16 known advisory(ies) (CVE-2016-2533 (Pillow buffer overflow in ImagingPcdDecode); CVE-2023-50447 (Arbitrary Code Execution in Pillow); CVE-2021-27922 (Pillow Uncontrolled Resource Consumption) +13 more), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
90% confidence
Finding
The manifest references Pillow without pinning a version even though multiple known advisories exist for that package, so the actual installed version could be affected and cannot be verified from this file alone. Given the skill's screenshot/prototyping use case, image libraries are likely exercised directly, which makes historical Pillow parsing and resource-consumption issues more relevant than they would be in an unrelated package.

Static analysis

No suspicious patterns detected.