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

Content
View full analysis

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
View 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
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

High
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
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.

Content

Scanner excerpt · package.json (reported line 21)May include surrounding context.

json
"author": "OpenClaw Assistant",
  "license": "MIT",
  "dependencies": {
    "csv-parse": "^5.5.0"
  },
  "engines": {
    "node": ">=14.0.0"

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.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.