T08 · Insecure Dependencies
- Location
SKILL.md:30- Finding
Unpinned Third-Party Installer Execution Through npx
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill appears to generate stained-glass images as advertised, but it handles API tokens and prompt data with incomplete provider disclosure and uses unpinned install guidance.
Review this before installing. Use only non-sensitive prompts, verify that your Neta token is intended for use with api.talesofai.com, prefer a scoped and revocable token, avoid placing real tokens directly on the command line, and avoid unpinned npx installation when a pinned or ClawHub-native install path is available.
SKILL.md:30Unpinned Third-Party Installer Execution Through npx
stainedglassartgenerator.js:3API Token Exposure Through Command-Line Arguments
The README instructs users to run npx skills add blammectrappora/stained-glass-art-generator without pinning a specific version. This can cause users to fetch and execute whatever code is currently published under that package or tag at install time, creating a supply-chain risk if the package is updated maliciously or the account is compromised. Because this is an installation command in documentation, it directly encourages unsafe execution behavior.
The skill declares only tools: Bash and does not explicitly constrain tool permissions or allowed capabilities, even though its documented behavior requires calling an external API using a token. That mismatch can cause the runtime to grant broader-than-necessary execution/network behavior through Bash, increasing the chance of unintended outbound access or misuse of the provided API token.
The install instruction uses npx skills add blammectrappora/stained-glass-art-generator without pinning a specific version or immutable reference. This creates a supply-chain risk: users may install whatever version is current at execution time, including a later compromised or malicious update.
The script tells users to obtain a token from neta.art/open, then uses that token in the x-token header when calling talesofai.com endpoints. That is a credential-routing mismatch that may expose user tokens to an unexpected service and is especially concerning because the skill is presented as a branded integration for a different provider.
The skill metadata and token instructions point users to Neta AI, but the code actually sends authenticated requests to api.talesofai.com. This mismatch can mislead users into providing credentials and prompts to a different third-party service than advertised, undermining informed consent and creating a supply-chain style trust issue.
The hardcoded api.talesofai.com destination confirms that data is sent to an external service distinct from the one named in the skill metadata. While outbound networking is normal for an image generator, the undisclosed provider mismatch makes this transmission materially more dangerous in context.
console.error("");
async function createTask() {
const res = await fetch("https://api.talesofai.com/v3/make_image", {
method: "POST",
headers,
body: JSON.stringify(body),
The hardcoded api.talesofai.com destination confirms that data is sent to an external service distinct from the one named in the skill metadata. While outbound networking is normal for an image generator, the undisclosed provider mismatch makes this transmission materially more dangerous in context.
console.error("");
async function createTask() {
const res = await fetch("https://api.talesofai.com/v3/make_image", {
method: "POST",
headers,
body: JSON.stringify(body),
The code transmits the user's free-text prompt and optional reference identifier to an external API without any explicit disclosure at runtime that this content will leave the local environment. In a skill context, prompts may contain sensitive or proprietary information, so undisclosed external sharing increases privacy and compliance risk.
The polling request repeatedly contacts the same third-party service to retrieve task results, extending the duration and volume of external communication. By itself this is routine, but in the context of misleading provider identity it reinforces that the skill continuously interacts with an unexpected remote backend.
await new Promise((r) => setTimeout(r, interval));
const res = await fetch(
`https://api.talesofai.com/v1/artifact/task/${taskUuid}`,
{ headers }
);
No suspicious patterns detected.