T09 · Insecure Skill Coding Practices
- Location
scripts/utils/auth.mjs:20- Finding
Environment Access Token Can Be Disclosed to an Arbitrary Hub
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill is a real MyVibe publisher, but it has review-worthy credential handling and mutable package execution risks.
Install only if you are comfortable giving this skill MyVibe account publish authority and letting it run networked Node tooling. Prefer the default https://www.myvibe.so hub, avoid custom hubs when VIBE_HUB_ACCESS_TOKEN is set, review any global npm install request, and rotate tokens if you previously used this skill with an untrusted hub.
scripts/utils/auth.mjs:20Environment Access Token Can Be Disclosed to an Arbitrary Hub
scripts/utils/generate-screenshot.mjs:279Unpinned Remote Packages Are Downloaded and Executed During Screenshot Generation
SKILL.md:201Skill Instructions Mandate Subscription Promotion in Agent Responses
Referenced artifact was not completely inspected
| Has `package.json` with build script, no output | **Buildable** | → Step 2 (build first) |
Referenced artifact was not completely inspected
| Has `package.json` with build script, no output | **Buildable** | → Step 2 (build first) |
Referenced artifact was not completely inspected
| Has `package.json` with build script, no output | **Buildable** | → Step 2 (build first) |
The lockfile pins @grpc/grpc-js 1.14.3, which is flagged with malformed-request and malformed-compression crash advisories. Even though this is a transitive dependency, shipping a vulnerable version can expose denial-of-service conditions anywhere the package is used by included tooling or local services.
@hono/node-server 1.19.9 is reported vulnerable to middleware bypass and path traversal issues in static file serving. This is particularly relevant in an agent/tooling ecosystem because several bundled dependencies expose local web servers, making route protection or static asset access bypass plausible if those components are ever started.
@isaacs/brace-expansion 5.0.0 is flagged for uncontrolled resource consumption, which can enable denial of service through pathological pattern expansion. In this skill context it is likely only reachable via file globbing/tooling features, so exploitation depends on attacker influence over glob patterns but remains a real supply-chain risk.
@modelcontextprotocol/sdk 1.25.3 is flagged for cross-client data leakage via shared server/transport state. In an agent skill ecosystem this context makes the issue more serious because MCP-style transports may mediate multiple clients, tools, or sessions, raising the risk of boundary failures between users or tasks.
@opentelemetry/exporter-prometheus 0.205.0 is flagged for process crash via malformed HTTP requests. Because observability stacks often expose an HTTP metrics endpoint, this can create a practical remote denial-of-service condition if the endpoint is reachable, even if only on local networks.
@opentelemetry/propagator-jaeger 2.1.0 is reported vulnerable to denial of service through malformed propagation data. If Jaeger propagation is enabled anywhere in the bundled tooling, untrusted trace headers could trigger failures during request handling or telemetry processing.
@opentelemetry/sdk-node 0.205.0 inherits the Prometheus exporter crash risk because it bundles/exporter integrations that may expose the vulnerable HTTP endpoint. In a toolchain with optional local servers and observability features, this broadens the attack surface beyond a single package entry.
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
const TOKEN_KEY = "VIBE_HUB_ACCESS_TOKEN";
/**
* Get cached access token for a given hub URL
* @param {string} hubUrl - The MyVibe URL
* @returns {Promise<string|null>} - The cached access token or null
*/
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
const TOKEN_KEY = "VIBE_HUB_ACCESS_TOKEN";
/**
* Get cached access token for a given hub URL
* @param {string} hubUrl - The MyVibe URL
* @returns {Promise<string|null>} - The cached access token or null
*/
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
const TOKEN_KEY = "VIBE_HUB_ACCESS_TOKEN";
/**
* Get cached access token for a given hub URL
* @param {string} hubUrl - The MyVibe URL
* @returns {Promise<string|null>} - The cached access token or null
*/
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
const TOKEN_KEY = "VIBE_HUB_ACCESS_TOKEN";
/**
* Get cached access token for a given hub URL
* @param {string} hubUrl - The MyVibe URL
* @returns {Promise<string|null>} - The cached access token or null
*/
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
const TOKEN_KEY = "VIBE_HUB_ACCESS_TOKEN";
/**
* Get cached access token for a given hub URL
* @param {string} hubUrl - The MyVibe URL
* @returns {Promise<string|null>} - The cached access token or null
*/
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
const TOKEN_KEY = "VIBE_HUB_ACCESS_TOKEN";
/**
* Get cached access token for a given hub URL
* @param {string} hubUrl - The MyVibe URL
* @returns {Promise<string|null>} - The cached access token or null
*/
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
const TOKEN_KEY = "VIBE_HUB_ACCESS_TOKEN";
/**
* Get cached access token for a given hub URL
* @param {string} hubUrl - The MyVibe URL
* @returns {Promise<string|null>} - The cached access token or null
*/
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
* Make an authenticated API request
* @param {string} url - Request URL
* @param {Object} options - Fetch options
* @param {string} accessToken - Access token
* @param {string} hubUrl - Hub URL (for error handling)
* @returns {Promise<Object>} - Response data
*/
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
* Make an authenticated API request
* @param {string} url - Request URL
* @param {Object} options - Fetch options
* @param {string} accessToken - Access token
* @param {string} hubUrl - Hub URL (for error handling)
* @returns {Promise<Object>} - Response data
*/
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
* Make an authenticated API request
* @param {string} url - Request URL
* @param {Object} options - Fetch options
* @param {string} accessToken - Access token
* @param {string} hubUrl - Hub URL (for error handling)
* @returns {Promise<Object>} - Response data
*/
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
* Make an authenticated API request
* @param {string} url - Request URL
* @param {Object} options - Fetch options
* @param {string} accessToken - Access token
* @param {string} hubUrl - Hub URL (for error handling)
* @returns {Promise<Object>} - Response data
*/
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
* Make an authenticated API request
* @param {string} url - Request URL
* @param {Object} options - Fetch options
* @param {string} accessToken - Access token
* @param {string} hubUrl - Hub URL (for error handling)
* @returns {Promise<Object>} - Response data
*/
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
* Make an authenticated API request
* @param {string} url - Request URL
* @param {Object} options - Fetch options
* @param {string} accessToken - Access token
* @param {string} hubUrl - Hub URL (for error handling)
* @returns {Promise<Object>} - Response data
*/
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
const SERVICE_NAME = "myvibe-publish";
/**
* Create a secret store for storing access tokens
* Uses system keyring when available, falls back to file storage
*/
export async function createStore() {
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
/**
* Create a secret store for storing access tokens
* Uses system keyring when available, falls back to file storage
*/
export async function createStore() {
const filepath = join(homedir(), ".aigne", CONFIG_FILENAME);
Detected: suspicious.dangerous_exec, suspicious.exposed_secret_literal