T09 · Insecure Skill Coding Practices
- Location
scripts/fulfill.js:115- Finding
Unvalidated API origins can expose credentials, access tokens, and customer data
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This skill performs plausible dropshipping fulfillment work, but it has under-disclosed live commerce actions, credential handling, and customer-data logging that users should review before installing.
Install only after reviewing the scripts and using test or least-privilege WooCommerce/CJ credentials. Treat live runs as capable of placing supplier orders, changing WooCommerce order state, adding order notes, changing product SKUs, storing CJ tokens, and writing customer data to local logs. Prefer fixing URL validation, dry-run side effects, PII redaction, live confirmation, and dependency updates before production use.
scripts/fulfill.js:115Unvalidated API origins can expose credentials, access tokens, and customer data
scripts/fulfill.js:238Dry-run mode performs unnecessary CJ authentication and exposes the API key to avoidable network risk
scripts/fulfill.js:288Customer personally identifiable information is printed and retained in plaintext logs
A description-behavior mismatch is a serious security and safety issue here because the skill is presented as order-fulfillment automation, but the analysis indicates the underlying code performs different actions such as SKU backfilling and rebuilding local mappings instead of the declared order workflow. When a skill that touches commerce systems behaves differently than advertised, operators may authorize it under false assumptions, leading to unintended data modification, bad inventory mappings, or incorrect downstream fulfillment decisions.
Referenced artifact was not completely inspected
tch, it's logged to the rejection log and the order is skipped. Fix by running `rebuild-mapping.js` or adding the entry manually.
The lockfile pins axios 1.13.6, and the finding cites multiple published advisories including SSRF-related proxy bypass and prototype-pollution-assisted MITM/credential theft classes. In this skill, axios is the primary HTTP client used to fetch WooCommerce orders and submit them to CJ Dropshipping, so a vulnerable client library can directly affect authenticated outbound API traffic and any environment-based proxy behavior.
form-data 4.0.5 is reported vulnerable to CRLF injection through unescaped multipart field names/filenames. If this skill or future extensions construct multipart requests using untrusted order, product, or supplier-derived values, an attacker may be able to tamper with request structure or smuggle unintended headers/content to downstream services.
The package explicitly depends on axios 1.13.6, which the finding indicates is affected by multiple published advisories, including SSRF and prototype-pollution-related issues. This skill integrates with external WooCommerce and CJ Dropshipping endpoints, so a vulnerable HTTP client can materially increase risk of request manipulation, credential exposure, or abuse of network trust boundaries depending on how requests are constructed elsewhere in the skill.
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
const exp = Number(cfg.tokenExpiry || 0);
if (cfg.accessToken && exp && now < exp - 10 * 60 * 1000) return cfg.accessToken;
console.log(' 🔑 Refreshing CJ access token...');
const baseUrl = (cfg.baseUrl || 'https://developers.cjdropshipping.com/api2.0/v1').replace(/\/$/, '');
const res = await axios.post(`${baseUrl}/authentication/getAccessToken`, { apiKey: cfg.apiKey }, {
headers: { 'Content-Type': 'application/json' }, timeout: 30000,
The skill declares it requires Node but does not define an explicit tool/permission scope, while the documented behavior clearly relies on environment variables and file-based credentials. In an automation that can place external fulfillment orders and update WooCommerce state, missing scope declarations weakens operator understanding and runtime guardrails, increasing the chance of unintended access or execution with broader privileges than expected.
The skill documentation does not prominently warn that running it may update live WooCommerce order statuses and place real CJ fulfillment orders, despite describing production-affecting actions. In this context, lack of an explicit warning makes accidental execution more dangerous because users may run the default command against live credentials without realizing it will create external orders and alter store records.
This code persists the refreshed CJ access token and expiry back into ./cj-api.json, which is a sensitive file write involving credentials. While the file header mentions the JSON fields, there is no user-facing confirmation, warning, or runtime disclosure that authentication material will be stored on disk.
The createOrder function transmits shipping address, phone, customer name, and email to an external CJ API endpoint. The code contains no confirmation prompt, user-facing log, or warning comment indicating that personal data will be sent to a third-party service.
The code posts order data to CJ Dropshipping, and the payload later includes name, address, phone, and email for the customer. While the header comment says orders are submitted to CJ, it does not explicitly warn that customer personal data will be transmitted to a third-party service, and there is no confirmation prompt before live submission.
The manifest describes a fulfillment skill that fetches processing orders, submits them to CJ Dropshipping, updates WooCommerce order status, and logs results. This script instead rebuilds product-to-supplier mappings and backfills product/variation SKUs in WooCommerce, which is catalog maintenance behavior rather than order fulfillment.
The stated skill scope is order fulfillment and order-status updates, but these lines perform PUT requests to mutate WooCommerce product and variation SKUs. That is a materially different write capability than pushing orders to CJ and marking fulfillment progress.
The helper reads consumerKey and consumerSecret from ./woo-api.json and uses them for authenticated API access, but there is no user-facing log, prompt, or warning beyond a brief developer comment. This is a sensitive-credential access path, and the file does not disclose that secret material will be read and used for network authentication.
The functions perform authenticated HTTP requests to retrieve and modify WooCommerce orders and notes, which can transmit business and customer-related data and make remote state changes. The file contains no confirmation prompt, user-facing logging, or warning text explaining these network and modification actions.
follow-redirects 1.15.11 is flagged for leaking custom authentication headers across cross-domain redirects. Because this skill likely makes authenticated requests to supplier and store APIs, a malicious or compromised upstream that triggers redirects could expose API keys or bearer tokens to an unintended domain.
The dependency is specified with a caret range, which allows automatic installation of newer minor/patch releases instead of a fully pinned version. In an automation skill that submits orders to external APIs, this weakens supply-chain reproducibility and can introduce unexpected or malicious upstream changes without code review.
"license": "ISC",
"type": "commonjs",
"dependencies": {
"axios": "^1.13.6"
}
}