T08 · Insecure Dependencies
- Location
setup.mjs:145- Finding
Unpinned Dependencies and Unverified Remote Font Downloads
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This skill is a disclosed Gemini-and-Canvas image text rendering helper, with some privacy and supply-chain cautions but no evidence of deception, persistence, or malicious behavior.
Install only if you are comfortable sending prompts, rendered text images, and any --ref images you provide to Google Gemini. Prefer running setup in a minimal environment without unnecessary secrets, and review or pin dependencies and downloaded fonts if reproducibility matters.
setup.mjs:145Unpinned Dependencies and Unverified Remote Font Downloads
The skill metadata and description frame this as a text-preserving rendering utility, but the code also exposes full Gemini-powered image generation through generate/pipeline flows. This hidden expansion of capability broadens data handling, outbound network use, and model-side prompt/media processing beyond what a caller would reasonably expect, which is a real security and trust-boundary issue for agent skills.
The skill explicitly depends on environment variables and external Gemini API calls, but it does not declare any tool scope or allowed-tools restrictions. This creates a capability/permission mismatch where an agent may invoke network and env access without clear least-privilege boundaries, increasing the chance of unintended secret exposure or unauthorized outbound requests.
The skill instructs the agent to send user prompts, rendered text images, and optional reference images to Gemini, but it does not provide a clear privacy notice or external-transfer warning at the point of use. This is risky because users may unknowingly submit sensitive text or images to a third-party service, and the broad triggers make such transmission more likely to happen unexpectedly.
The auto-activation triggers are very broad, covering common words like 'text', 'title', and any non-Latin script, so the skill may run for many ordinary image requests without clear user intent. In this skill's context, unintended activation matters because it can cause prompts and possibly images to be routed into an external analysis/generation pipeline, expanding data exposure and unexpected API usage.
The analysis prompt is entirely written in Korean and instructs the LLM to operate in that locale, which can force a specific language behavior regardless of user preference. Under the policy, locale constraints should either be user-selectable or clearly justified as region-specific, neither of which is present here.
The generate/pipeline paths accept arbitrary --ref image paths and upload their contents to Gemini without restricting file origin, purpose, or type beyond a simple extension-based MIME guess. In an agent setting, this can cause unintended exfiltration of local images or sensitive visual data to a third-party API, which exceeds the stated text-preservation function and increases privacy risk.
The natural-language description is written entirely in Korean and presents the skill as such without indicating any language choice or opt-in. Under the policy for language/locale constraints, this can be a policy concern when a skill appears to assume a specific language without documenting user choice or a justified regional scope.
Using a caret range for the canvas dependency allows newer package versions to be installed without explicit review, which weakens build reproducibility and can silently introduce vulnerable or malicious upstream changes. In this skill context, canvas is a native/image-processing dependency and has had security advisories before, so drift in resolved versions is more risky than for a purely cosmetic package.
"render": "node render.mjs render"
},
"dependencies": {
"canvas": "^3.1.0",
"@google/generative-ai": "^0.21.0"
}
}
The manifest references canvas with a non-exact version while known advisories exist for that package, making it impossible to verify from this file alone whether the installed version is safe. In an image-rendering skill that processes text and graphics, a vulnerable native parsing/rendering library can increase exposure to crashes, denial of service, or memory-safety issues depending on the deployed version.
Using a caret range for @google/generative-ai permits automatic adoption of future releases, reducing supply-chain control and reproducibility. Because this library handles AI-service interactions and potentially sensitive prompts or generated content, unexpected upstream changes could affect security posture, data handling, or integrity of outputs.
},
"dependencies": {
"canvas": "^3.1.0",
"@google/generative-ai": "^0.21.0"
}
}
Detected: suspicious.dangerous_exec, suspicious.env_credential_access