T09 · Insecure Skill Coding Practices
- Location
bin/devops-platform-enhanced.js:21- Finding
Bearer Token Stored in a Plaintext Configuration File Without Enforced Permissions
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This appears to be a legitimate DevOps CLI skill, but it handles API tokens in ways that could expose them.
Install only if you trust the publisher and can control the configured API host. Do not paste real tokens into shared shells or chat prompts; prefer short-lived or least-privilege tokens, use HTTPS-only approved endpoints, protect or remove ~/.devops-platform-config.json, and rotate any token that may have been entered on the command line or stored by this version.
bin/devops-platform-enhanced.js:21Bearer Token Stored in a Plaintext Configuration File Without Enforced Permissions
bin/devops-platform-enhanced.js:76Bearer Token Can Be Sent to an Arbitrary or Cleartext API Destination
bin/devops-platform-enhanced.js:176Token Input Is Exposed Through Command-Line Arguments and Visible Interactive Prompts
The lockfile pins axios 1.13.6, and the supplied advisory set includes high-severity issues such as SSRF-related NO_PROXY bypass and prototype-pollution-assisted MITM/credential theft scenarios. Because this skill appears to be a DevOps/platform CLI and axios is a primary HTTP client, these flaws are more relevant than in a purely local/offline package: it may handle API tokens, internal endpoints, or proxy-controlled traffic.
form-data 4.0.5 is reported vulnerable to CRLF injection via unescaped multipart field names/filenames. If this skill ever builds multipart requests from user-controlled input, an attacker may be able to manipulate HTTP message structure or inject unintended parts/headers, which is especially risky for tooling that interacts with internal DevOps APIs or artifact services.
The manifest includes axios 1.13.6, which the finding states has multiple known advisories, including SSRF and man-in-the-middle/prototype-pollution-related issues. In a DevOps platform tool that likely makes authenticated API requests to internal services, vulnerable HTTP client behavior can materially increase the risk of credential theft, request hijacking, or access to internal network resources.
The example trigger phrase around this location is overly generic and maps ordinary user language directly to internal DevOps queries. Because the skill is intended for messaging platforms and natural-language interaction, such generic phrasing increases the risk of accidental activation, unauthorized information exposure in shared channels, or the agent acting on ambiguous requests without sufficient user or channel validation.
The document presents very broad natural-language usage patterns for the agent, such as users asking generic questions in ordinary conversation, without defining explicit invocation boundaries, scope checks, or confirmation rules. In a multi-platform chat context, overly generic triggers can cause unintended skill activation, data retrieval, or disclosure in response to casual messages that merely resemble operational queries.
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
# 复制skill到OpenClaw skills目录
sudo cp -r devops-platform-skill /opt/homebrew/lib/node_modules/openclaw/skills/
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
# 复制skill到OpenClaw skills目录
sudo cp -r devops-platform-skill /opt/homebrew/lib/node_modules/openclaw/skills/
The guide explicitly shows passing an API token on the command line and documents that the token is stored locally in plaintext config files. This can expose credentials through shell history, process listings, screenshots, logs, or local file compromise, making unauthorized API access more likely.
The README explicitly instructs users to configure and use an API token and also advertises detailed error/debug output, but it does not warn that tokens are sensitive secrets or that request debugging can leak credentials into terminal output, logs, screenshots, or shell history. In a DevOps platform context, exposed tokens may grant access to application, iteration, and release-management APIs, increasing the operational risk of credential disclosure.
The documentation instructs users to configure an Open Token but provides no warning that the token is a sensitive credential requiring secure storage and careful handling. In a DevOps platform context, such tokens may grant access to application, iteration, and release-management data, so omission of credential-handling guidance increases the likelihood of accidental exposure.
The example command places the user token directly on the command line, which can expose it through shell history, process listings, terminal logging, or remote session recording. Because this skill interfaces with a DevOps platform API, compromise of the token could enable unauthorized access to operational and release data or actions available to that user.
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.
- `/application/app/{id}` - 应用详情
- `/publish/publishplan/list` - 迭代列表
- `/publish/publishplan/myplanlist` - 我的迭代
- `/publish/publishplan/applist` - 迭代应用
- `/publish/publishplan/favorite` - 收藏迭代
- `/publish/publishplan/unfavorite` - 取消收藏
- `/publish/publishplan/myfavoritelist` - 收藏列表
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.
- `/application/app/{id}` - 应用详情
- `/publish/publishplan/list` - 迭代列表
- `/publish/publishplan/myplanlist` - 我的迭代
- `/publish/publishplan/applist` - 迭代应用
- `/publish/publishplan/favorite` - 收藏迭代
- `/publish/publishplan/unfavorite` - 取消收藏
- `/publish/publishplan/myfavoritelist` - 收藏列表
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.
- `/application/app/{id}` - 应用详情
- `/publish/publishplan/list` - 迭代列表
- `/publish/publishplan/myplanlist` - 我的迭代
- `/publish/publishplan/applist` - 迭代应用
- `/publish/publishplan/favorite` - 收藏迭代
- `/publish/publishplan/unfavorite` - 取消收藏
- `/publish/publishplan/myfavoritelist` - 收藏列表
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.
- `/application/app/{id}` - 应用详情
- `/publish/publishplan/list` - 迭代列表
- `/publish/publishplan/myplanlist` - 我的迭代
- `/publish/publishplan/applist` - 迭代应用
- `/publish/publishplan/favorite` - 收藏迭代
- `/publish/publishplan/unfavorite` - 取消收藏
- `/publish/publishplan/myfavoritelist` - 收藏列表
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.
- `/application/app/{id}` - 应用详情
- `/publish/publishplan/list` - 迭代列表
- `/publish/publishplan/myplanlist` - 我的迭代
- `/publish/publishplan/applist` - 迭代应用
- `/publish/publishplan/favorite` - 收藏迭代
- `/publish/publishplan/unfavorite` - 取消收藏
- `/publish/publishplan/myfavoritelist` - 收藏列表
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.
- `/application/app/{id}` - 应用详情
- `/publish/publishplan/list` - 迭代列表
- `/publish/publishplan/myplanlist` - 我的迭代
- `/publish/publishplan/applist` - 迭代应用
- `/publish/publishplan/favorite` - 收藏迭代
- `/publish/publishplan/unfavorite` - 取消收藏
- `/publish/publishplan/myfavoritelist` - 收藏列表
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.
- `/application/app/{id}` - 应用详情
- `/publish/publishplan/list` - 迭代列表
- `/publish/publishplan/myplanlist` - 我的迭代
- `/publish/publishplan/applist` - 迭代应用
- `/publish/publishplan/favorite` - 收藏迭代
- `/publish/publishplan/unfavorite` - 取消收藏
- `/publish/publishplan/myfavoritelist` - 收藏列表
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.
- `/application/app/{id}` - 应用详情
- `/publish/publishplan/list` - 迭代列表
- `/publish/publishplan/myplanlist` - 我的迭代
- `/publish/publishplan/applist` - 迭代应用
- `/publish/publishplan/favorite` - 收藏迭代
- `/publish/publishplan/unfavorite` - 取消收藏
- `/publish/publishplan/myfavoritelist` - 收藏列表
This is a markdown file, so missing-warning review applies to documented behaviors affecting privacy or system integrity. The summary states that debug information shows request URLs and parameters and that configuration stores API tokens in a JSON file, but it provides no explicit user warning about protecting tokens or avoiding sensitive use in debug contexts.
The CLI stores the bearer token in a JSON file under the user's home directory without any warning, encryption, or file-permission hardening. This creates a local secret-exposure risk: other local users, malware, backups, or accidental file sharing could recover the token and use it to access the DevOps platform APIs.
The interactive prompt collects the token using a plain input field and gives no notice that the value will be stored locally afterward. This increases the chance of shoulder-surfing, terminal history/log capture, and uninformed credential persistence, making sensitive API tokens easier to expose.
The save routine writes the entire configuration object, including the API token, directly to ~/.devops-platform-config.json as formatted JSON with no encryption or permission hardening. This creates a local secret-at-rest exposure: any process or user that can read the file can steal the bearer token and impersonate the user against the DevOps platform.
The CLI collects a bearer token from command-line options or an interactive prompt and persists it locally via the config helper, without warning the user that the credential will be stored on disk in plaintext. If the local machine is shared, compromised, backed up insecurely, or the file permissions are too broad, the token can be recovered and reused to access the backend API as the user.
The CLI prompts for an access token and persists it in a JSON config file under the user's home directory without any explicit warning about long-term credential storage or protections on that file. If the host is multi-user, backed up, synced, or otherwise compromised, the bearer token can be recovered and reused to access the DevOps platform API as the user.
Detected: suspicious.env_credential_access