Back to skill

Security audit

Audtools Ecommerce Category Collector

Security checks for vulnerabilities and agentic risk

Overview

The skill largely matches its stated Audtools automation purpose, but it exposes and uses hard-coded Audtools login credentials and performs bulk export actions by default.

Do not install this version as-is. The exposed Audtools password should be treated as compromised and rotated, and the skill should be changed to require credentials from environment variables, a secret manager, or an interactive prompt. Before use, require explicit confirmation for bulk export, prefer test mode or --no-export first, and run it only with a least-privileged account you are authorized to use.

Vulnerability Patterns
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • 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 (1)

T09 · Insecure Skill Coding Practices

Error
Location
scripts/collector.js:13
Finding
Hardcoded Audtools Account Credentials Exposed in Source Code and Documentation## Vulnerability Details **File Location**: `scripts/collector.js:13-24` **Additional Locations**: `SKILL.md:14`, `SKILL.md:69-70`, `README.md:79-80` **Vulnerability Type**: Hardcoded credentials and plaintext sensitive data **Risk Level**: High ### Vulnerable Code `scripts/collector.js:13-24`: ```javascript // 配置参数 const CONFIG = { baseUrl: 'https://www.audtools.com', loginUrl: 'https://www.audtools.com/login', collecUrl: 'https://www.audtools.com/users/shopns#/users/shopns/collecs?spm=m-1-2-3', username: '15715090600', password: 'zzw12345', default_items: 9999, default_interval: 2000, // 毫秒 default_close_delay: 3000, // 毫秒 exportWaitTimeout: 30000, // 导出等待超时(毫秒) }; ``` The same credentials are also disclosed in `SKILL.md`: ```markdown 1. Audtools账号(手机号:15715090600,密码:zzw12345) ``` ```markdown | `username` | `15715090600` | 登录手机号 | | `password` | `zzw12345` | 登录密码 | ``` They are repeated in `README.md`: ```markdown | `username` | `15715090600` | Audtools登录手机号 | | `password` | `zzw12345` | Audtools登录密码 | ``` ### Technical Analysis The project embeds an Audtools phone number and password directly in the executable `CONFIG` object. The `ensureLoggedIn()` function subsequently supplies these values to the Audtools login form, demonstrating that they are operational authentication data rather than inert examples. Hardcoded secrets cannot be protected through application access controls because every person or system able to read the package can recover them. Repeating the credentials in user-facing documentation further increases their exposure through source repositories, package archives, documentation indexing, backups, logs, and forks. Removing the credentials in a later commit would not reliably revoke the disclosure because they may remain available in repository history, caches, prior releases, and downloaded copies. The exposed password must therefore be ...[truncated 1710 chars]
Remediation
## Remediation Suggestions 1. **Rotate the credentials immediately** - Change the exposed Audtools password. - Invalidate active sessions and API tokens, if the service supports doing so. - Review account activity, collection jobs, and exports for unauthorized access. - Change credentials on any other service where the same password was reused. 2. **Remove all plaintext copies** - Delete the phone number and password from `scripts/collector.js`, `SKILL.md`, and `README.md`. - Replace documentation values with clearly nonfunctional placeholders. - Remove the secret from repository history using an appropriate history-rewriting procedure where feasible. - Treat all previously distributed releases and archives as permanently containing the old secret. 3. **Load secrets at runtime** - Read credentials from environment variables or an approved secret manager. - Do not provide functional fallback credentials in source code. - Fail safely with a clear error when required secrets are absent. Example: ```javascript const CONFIG = { baseUrl: 'https://www.audtools.com', loginUrl: 'https://www.audtools.com/login', collecUrl: 'https://www.audtools.com/users/shopns#/users/shopns/collecs?spm=m-1-2-3', username: process.env.AUDTOOLS_USERNAME, password: process.env.AUDTOOLS_PASSWORD, default_items: 9999, default_interval: 2000, default_close_delay: 3000, exportWaitTimeout: 30000, }; if (!CONFIG.username || !CONFIG.password) { throw new Error( 'AUDTOOLS_USERNAME and AUDTOOLS_PASSWORD must be provided securely at runtime' ); } ``` 4. **Protect secret-bearing configuration** - If a local `.env` file is supported, add it to `.gitignore` and provide only a `.env.example` containing placeholders. - Restrict secret access to the minimum required users and runtime identity. - Avoid printi ...[truncated 401 chars]
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (14)

Context-Inappropriate Capability

High
Confidence
99% confidence
Finding
The README publishes concrete Audtools login credentials and instructs users to place account secrets directly in code. Exposing reusable credentials in public documentation can lead to unauthorized account access, abuse of the Audtools platform, and credential reuse attacks if the same password is used elsewhere. In this skill context, the risk is heightened because the documented purpose is batch submission automation, so valid credentials would directly enable operational misuse at scale.

Missing User Warnings

High
Confidence
98% confidence
Finding
The documentation presents specific default login credentials without any warning that they are sensitive or must be replaced, which encourages unsafe deployment and accidental credential reuse. Even if intended as examples, concrete values in security-sensitive fields are commonly copied verbatim by users and may represent live credentials, making unauthorized access and account compromise likely. The skill’s automation of authenticated actions makes this more dangerous than a generic example snippet.

Missing User Warnings

High
Confidence
99% confidence
Finding
The skill documentation contains hard-coded account credentials (phone number and password) directly in the file. Exposing reusable authentication secrets in a skill is dangerous because anyone with access to the skill can log into the third-party service, abuse the account, access exported data, or change account settings, and the risk is heightened here because the skill automates login and export behavior against a live external service.

Intent-Code Divergence

High
Confidence
98% confidence
Finding
The header comment describes the script as an e-commerce category collection/export tool, but the implemented behavior also includes automatic authentication to Audtools using hard-coded username and password values. This is not merely incomplete implementation detail; the script actively logs into a third-party account at L123-L169 using credentials defined at L18-L19, which materially changes the skill's operational intent.

Missing User Warnings

High
Confidence
99% confidence
Finding
The script hardcodes a live username and password in source code, exposing credentials to anyone with repository or artifact access and encouraging secret reuse. In this skill context, the code also uses those credentials to perform automated login against a third-party service, which can lead to account compromise, unauthorized actions, and further data exposure if the code is shared or logged.

Natural-Language Policy Violations

Medium
Confidence
91% confidence
Finding
The natural-language instructions, headings, and usage guidance are presented only in Chinese, which effectively forces a specific language for users. SQP-3 applies to all file types and flags language-policy violations when no opt-in, alternative language, or explicit justification for the locale restriction is provided.

Missing User Warnings

Medium
Confidence
91% confidence
Finding
The skill explicitly supports automatic selection and export/download of all collected goods without any warning, confirmation step, or discussion of data sensitivity. This is risky because it enables potentially large-scale data extraction from a third-party platform and may cause unintended disclosure, policy violations, or operational impact if run against the wrong account or dataset.

Missing User Warnings

Medium
Confidence
88% confidence
Finding
The script automatically selects all collected items and clicks the export action, which can affect user data by initiating a bulk download/export. While it logs after the fact that export was triggered, there is no confirmation prompt or advance warning before the export occurs.

Natural-Language Policy Violations

Low
Confidence
77% confidence
Finding
All user-facing documentation is written in Chinese, and the skill does not indicate that language selection is optional or that the locale restriction is intentional for a region-specific audience. Under the stated policy, a fixed language without opt-in can be a natural-language policy violation.

Natural-Language Policy Violations

Low
Confidence
88% confidence
Finding
The package description is written in Chinese only ("电商分类链接批量采集工具 for Audtools"), which can impose a language-specific experience without offering any user choice or documenting a justified locale constraint. This matches the policy concern for language or locale restrictions expressed in natural language within the file.

Unpinned Dependencies

Low
Category
Supply Chain
Content
"author": "OpenClaw Assistant",
  "license": "MIT",
  "dependencies": {
    "csv-parse": "^5.5.0"
  },
  "engines": {
    "node": ">=14.0.0"
Confidence
89% confidence
Finding
The dependency uses a caret range (^5.5.0), which allows automatic installation of newer minor/patch releases. This weakens supply-chain reproducibility and can unexpectedly pull in vulnerable or malicious versions if the upstream package or release process is compromised.

Unverifiable Dependency: csv-parse has 2 known advisory(ies) (CVE-2019-17592 (Regular Expression Denial of Service in csv-parse); CVE-2026-85063 (node-csv: Prototype replacement still reachable via columns path)), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
78% confidence
Finding
The manifest references csv-parse without pinning an exact version, while advisories exist for this package family. Because the installed version is not fixed here, consumers may resolve to an affected release, creating risk of issues such as denial of service or unsafe object/property handling depending on how the library is used.

Natural-Language Policy Violations

Low
Confidence
93% confidence
Finding
This markdown file contains user-facing instructions exclusively in Chinese, including the title and all operational guidance. Under the stated policy, forcing a specific language without user opt-in can be a natural-language policy violation unless the locale constraint is explicitly documented and justified.

Natural-Language Policy Violations

Low
Confidence
75% confidence
Finding
The natural-language comments and user-facing console output are presented in Chinese throughout the script, and the skill does not indicate that it is region-specific or provide any language opt-in. Under the stated policy, forcing a specific language without user choice can be a locale-policy issue.

Static analysis

No suspicious patterns detected.