T09 · Insecure Skill Coding Practices
- Location
scripts/lib/ci_client.mjs:83- Finding
Predictable Key Used to Encrypt Persisted Cloud Credentials
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This Tencent Cloud storage skill mostly matches its stated purpose, but it needs Review because it handles powerful cloud credentials with weak local secret protection and can send authenticated SDK requests to unvalidated custom endpoints.
Install only after reviewing the cloud permissions you will grant. Prefer short-lived STS credentials or a least-privilege Tencent sub-account, avoid persisting long-lived keys in .env or .env.enc, leave KIKI=1 enabled when you do not need deletion or local credential management, and do not set custom COS Domain, ServiceDomain, or Protocol values unless you fully trust and verify the endpoint.
scripts/lib/ci_client.mjs:83Predictable Key Used to Encrypt Persisted Cloud Credentials
scripts/cos_node.mjs:97Custom SDK Endpoints Can Redirect Authenticated Requests
package.json:10Unpinned Dependency Installation Produces Non-Reproducible Builds
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
.env
.env.enc
.env.enc.bak
The skill is presented primarily as a COS/CI operations helper, but it also instructs the agent to persist cloud credentials locally, modify .gitignore, run setup/bootstrap scripts, and install npm dependencies. This mismatch is dangerous because users may consent to file storage actions without realizing the skill also performs sensitive local environment changes and secret handling.
Referenced artifact was not completely inspected
- `scripts/cos_node.mjs`:COS 存储、写操作、处理作业和通用 CI 能力。
Referenced artifact was not completely inspected
- `scripts/cos_node.mjs`:COS 存储、写操作、处理作业和通用 CI 能力。
Referenced artifact was not completely inspected
- `scripts/cos_node.mjs`:COS 存储、写操作、处理作业和通用 CI 能力。
Referenced artifact was not completely inspected
- `scripts/cos_node.mjs`:COS 存储、写操作、处理作业和通用 CI 能力。
Referenced artifact was not completely inspected
- `scripts/cos_node.mjs`:COS 存储、写操作、处理作业和通用 CI 能力。
Referenced artifact was not completely inspected
- `scripts/cos_node.mjs`:COS 存储、写操作、处理作业和通用 CI 能力。
Referenced artifact was not completely inspected
- `scripts/cos_node.mjs`:COS 存储、写操作、处理作业和通用 CI 能力。
Referenced artifact was not completely inspected
- `scripts/cos_node.mjs`:COS 存储、写操作、处理作业和通用 CI 能力。
Referenced artifact was not completely inspected
- `scripts/preview_gen.mjs`:检索结果的本地批量签名与 HTML 预览生成。
Referenced artifact was not completely inspected
- `scripts/preview_gen.mjs`:检索结果的本地批量签名与 HTML 预览生成。
Referenced artifact was not completely inspected
除了入口拦截,`scripts/lib/ci_client.mjs` 的 `cosRequest` 与 `scripts/cos_node.mjs` 的 `cosRequestPromise` 会在请求层再次拒绝 DELETE 请求,双重兜底避免绕过。需要调整隐藏列表时,修改其中的 `STRICT_HIDDEN_ACT
The skill explicitly supports persisting cloud credentials into a local .env file and automatic reuse later. Storing long-lived SecretId/SecretKey material in project files materially increases the risk of accidental disclosure through local compromise, backups, editor tooling, misconfigured permissions, or downstream automation.
{baseDir}/scripts/setup.sh --from-env
{baseDir}/scripts/setup.sh --from-env --persist
The documented support for encrypting and decrypting .env files confirms that the skill manages raw credential material locally and can restore it to plaintext on demand. Even with encryption at rest, embedding secret-management flows inside a broad cloud-operations skill expands exposure and makes credential access a first-class capability available to the agent.
| | `upload` → 指向知识库桶 | "上传到知识库" → 上传文档 |
| | `hybrid-search` → 指向知识库数据集 | "查询知识库" → 语义检索文档内容 |
| **🚫 禁止** | ~~deleteBucket~~ | **不允许删除/清空存储桶** |
| **🔐 凭证管理** | `encrypt-env` | 加密 .env → .env.enc 并删除明文 |
| | `decrypt-env` | 解密 .env.enc → .env 还原明文 |
## 安全注意事项
The ability to decrypt .env.enc back to plaintext .env creates an explicit path from protected-at-rest secrets to readable local files during normal skill use. This undermines the claimed safety of local encryption because any agent with skill access can potentially materialize secrets on disk where other processes or users may access them.
| | `hybrid-search` → 指向知识库数据集 | "查询知识库" → 语义检索文档内容 |
| **🚫 禁止** | ~~deleteBucket~~ | **不允许删除/清空存储桶** |
| **🔐 凭证管理** | `encrypt-env` | 加密 .env → .env.enc 并删除明文 |
| | `decrypt-env` | 解密 .env.enc → .env 还原明文 |
## 安全注意事项
The encryption design derives the key from predictable local attributes such as hostname, username, and project path, which are not high-entropy secrets. If an attacker can learn or guess those values on the same machine or environment, the protection may be weak, and the presence of a documented decrypt path further increases the chance of credential recovery.
- 密钥派生:`SHA-256(hostname + username + 项目绝对路径)`
- **加密文件绑定当前机器和用户**,拷贝到其他机器/用户无法解密
- 如需还原明文:`node scripts/cos_node.mjs decrypt-env`
- 清理凭证:`rm -f .env .env.enc`
**其他安全要求**:
- **永远不要在对话中回显** SecretId/SecretKey
Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).
| 服务 | 开通 action | 请求 | 关闭 action | 请求 |
| --- | --- | --- | --- | --- |
| 数据万象绑定 | `create-ci-bucket` | `PUT /`,CAM `ci:CreateCIBucket` | `delete-ci-bucket` | `PUT /?unbind`,CAM `ci:DeleteCIBucket` |
| 文档处理 | `create-doc-process-bucket` | `POST /docbucket`,CAM `ci:CreateDocProcessBucket` | `delete-doc-process-bucket` | `DELETE /docbucket`,CAM `ci:DeleteDocProcessBucket` |
| 媒体处理 | `create-media-bucket` | `POST /mediabucket`,CAM `ci:CreateMediaBucket` | `delete-media-bucket` | `DELETE /mediabucket`,CAM `ci:DeleteMediaBucket` |
| 智能语音 | `create-asr-bucket` | `POST /asrbucket`,CAM `ci:CreateAsrBucket` | `delete-asr-bucket` | `DELETE /asrbucket`,CAM `ci:DeleteAsrBucket` |
| 文件处理 | `create-file-process-bucket` | `POST /file_bucket`,CAM `ci:CreateFileProcessBucket` | `delete-file-process-bucket` | `DELETE /file_bucket`,CAM `ci:DeleteFileProcessBucket` |
Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).
| 服务 | 开通 action | 请求 | 关闭 action | 请求 |
| --- | --- | --- | --- | --- |
| 数据万象绑定 | `create-ci-bucket` | `PUT /`,CAM `ci:CreateCIBucket` | `delete-ci-bucket` | `PUT /?unbind`,CAM `ci:DeleteCIBucket` |
| 文档处理 | `create-doc-process-bucket` | `POST /docbucket`,CAM `ci:CreateDocProcessBucket` | `delete-doc-process-bucket` | `DELETE /docbucket`,CAM `ci:DeleteDocProcessBucket` |
| 媒体处理 | `create-media-bucket` | `POST /mediabucket`,CAM `ci:CreateMediaBucket` | `delete-media-bucket` | `DELETE /mediabucket`,CAM `ci:DeleteMediaBucket` |
| 智能语音 | `create-asr-bucket` | `POST /asrbucket`,CAM `ci:CreateAsrBucket` | `delete-asr-bucket` | `DELETE /asrbucket`,CAM `ci:DeleteAsrBucket` |
| 文件处理 | `create-file-process-bucket` | `POST /file_bucket`,CAM `ci:CreateFileProcessBucket` | `delete-file-process-bucket` | `DELETE /file_bucket`,CAM `ci:DeleteFileProcessBucket` |
Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).
| --- | --- | --- | --- | --- |
| 数据万象绑定 | `create-ci-bucket` | `PUT /`,CAM `ci:CreateCIBucket` | `delete-ci-bucket` | `PUT /?unbind`,CAM `ci:DeleteCIBucket` |
| 文档处理 | `create-doc-process-bucket` | `POST /docbucket`,CAM `ci:CreateDocProcessBucket` | `delete-doc-process-bucket` | `DELETE /docbucket`,CAM `ci:DeleteDocProcessBucket` |
| 媒体处理 | `create-media-bucket` | `POST /mediabucket`,CAM `ci:CreateMediaBucket` | `delete-media-bucket` | `DELETE /mediabucket`,CAM `ci:DeleteMediaBucket` |
| 智能语音 | `create-asr-bucket` | `POST /asrbucket`,CAM `ci:CreateAsrBucket` | `delete-asr-bucket` | `DELETE /asrbucket`,CAM `ci:DeleteAsrBucket` |
| 文件处理 | `create-file-process-bucket` | `POST /file_bucket`,CAM `ci:CreateFileProcessBucket` | `delete-file-process-bucket` | `DELETE /file_bucket`,CAM `ci:DeleteFileProcessBucket` |
Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).
| --- | --- | --- | --- | --- |
| 数据万象绑定 | `create-ci-bucket` | `PUT /`,CAM `ci:CreateCIBucket` | `delete-ci-bucket` | `PUT /?unbind`,CAM `ci:DeleteCIBucket` |
| 文档处理 | `create-doc-process-bucket` | `POST /docbucket`,CAM `ci:CreateDocProcessBucket` | `delete-doc-process-bucket` | `DELETE /docbucket`,CAM `ci:DeleteDocProcessBucket` |
| 媒体处理 | `create-media-bucket` | `POST /mediabucket`,CAM `ci:CreateMediaBucket` | `delete-media-bucket` | `DELETE /mediabucket`,CAM `ci:DeleteMediaBucket` |
| 智能语音 | `create-asr-bucket` | `POST /asrbucket`,CAM `ci:CreateAsrBucket` | `delete-asr-bucket` | `DELETE /asrbucket`,CAM `ci:DeleteAsrBucket` |
| 文件处理 | `create-file-process-bucket` | `POST /file_bucket`,CAM `ci:CreateFileProcessBucket` | `delete-file-process-bucket` | `DELETE /file_bucket`,CAM `ci:DeleteFileProcessBucket` |
Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).
| 数据万象绑定 | `create-ci-bucket` | `PUT /`,CAM `ci:CreateCIBucket` | `delete-ci-bucket` | `PUT /?unbind`,CAM `ci:DeleteCIBucket` |
| 文档处理 | `create-doc-process-bucket` | `POST /docbucket`,CAM `ci:CreateDocProcessBucket` | `delete-doc-process-bucket` | `DELETE /docbucket`,CAM `ci:DeleteDocProcessBucket` |
| 媒体处理 | `create-media-bucket` | `POST /mediabucket`,CAM `ci:CreateMediaBucket` | `delete-media-bucket` | `DELETE /mediabucket`,CAM `ci:DeleteMediaBucket` |
| 智能语音 | `create-asr-bucket` | `POST /asrbucket`,CAM `ci:CreateAsrBucket` | `delete-asr-bucket` | `DELETE /asrbucket`,CAM `ci:DeleteAsrBucket` |
| 文件处理 | `create-file-process-bucket` | `POST /file_bucket`,CAM `ci:CreateFileProcessBucket` | `delete-file-process-bucket` | `DELETE /file_bucket`,CAM `ci:DeleteFileProcessBucket` |
请求域名均为 `https://<bucket>.ci.<region>.myqcloud.com`。所有 `delete-*` action 在严格模式下隐藏并拒绝执行;其中 `delete-ci-bucket` 虽使用 `PUT`,仍按解绑删除语义保护。
Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).
| 数据万象绑定 | `create-ci-bucket` | `PUT /`,CAM `ci:CreateCIBucket` | `delete-ci-bucket` | `PUT /?unbind`,CAM `ci:DeleteCIBucket` |
| 文档处理 | `create-doc-process-bucket` | `POST /docbucket`,CAM `ci:CreateDocProcessBucket` | `delete-doc-process-bucket` | `DELETE /docbucket`,CAM `ci:DeleteDocProcessBucket` |
| 媒体处理 | `create-media-bucket` | `POST /mediabucket`,CAM `ci:CreateMediaBucket` | `delete-media-bucket` | `DELETE /mediabucket`,CAM `ci:DeleteMediaBucket` |
| 智能语音 | `create-asr-bucket` | `POST /asrbucket`,CAM `ci:CreateAsrBucket` | `delete-asr-bucket` | `DELETE /asrbucket`,CAM `ci:DeleteAsrBucket` |
| 文件处理 | `create-file-process-bucket` | `POST /file_bucket`,CAM `ci:CreateFileProcessBucket` | `delete-file-process-bucket` | `DELETE /file_bucket`,CAM `ci:DeleteFileProcessBucket` |
请求域名均为 `https://<bucket>.ci.<region>.myqcloud.com`。所有 `delete-*` action 在严格模式下隐藏并拒绝执行;其中 `delete-ci-bucket` 虽使用 `PUT`,仍按解绑删除语义保护。
Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).
| 文档处理 | `create-doc-process-bucket` | `POST /docbucket`,CAM `ci:CreateDocProcessBucket` | `delete-doc-process-bucket` | `DELETE /docbucket`,CAM `ci:DeleteDocProcessBucket` |
| 媒体处理 | `create-media-bucket` | `POST /mediabucket`,CAM `ci:CreateMediaBucket` | `delete-media-bucket` | `DELETE /mediabucket`,CAM `ci:DeleteMediaBucket` |
| 智能语音 | `create-asr-bucket` | `POST /asrbucket`,CAM `ci:CreateAsrBucket` | `delete-asr-bucket` | `DELETE /asrbucket`,CAM `ci:DeleteAsrBucket` |
| 文件处理 | `create-file-process-bucket` | `POST /file_bucket`,CAM `ci:CreateFileProcessBucket` | `delete-file-process-bucket` | `DELETE /file_bucket`,CAM `ci:DeleteFileProcessBucket` |
请求域名均为 `https://<bucket>.ci.<region>.myqcloud.com`。所有 `delete-*` action 在严格模式下隐藏并拒绝执行;其中 `delete-ci-bucket` 虽使用 `PUT`,仍按解绑删除语义保护。
Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).
| 文档处理 | `create-doc-process-bucket` | `POST /docbucket`,CAM `ci:CreateDocProcessBucket` | `delete-doc-process-bucket` | `DELETE /docbucket`,CAM `ci:DeleteDocProcessBucket` |
| 媒体处理 | `create-media-bucket` | `POST /mediabucket`,CAM `ci:CreateMediaBucket` | `delete-media-bucket` | `DELETE /mediabucket`,CAM `ci:DeleteMediaBucket` |
| 智能语音 | `create-asr-bucket` | `POST /asrbucket`,CAM `ci:CreateAsrBucket` | `delete-asr-bucket` | `DELETE /asrbucket`,CAM `ci:DeleteAsrBucket` |
| 文件处理 | `create-file-process-bucket` | `POST /file_bucket`,CAM `ci:CreateFileProcessBucket` | `delete-file-process-bucket` | `DELETE /file_bucket`,CAM `ci:DeleteFileProcessBucket` |
请求域名均为 `https://<bucket>.ci.<region>.myqcloud.com`。所有 `delete-*` action 在严格模式下隐藏并拒绝执行;其中 `delete-ci-bucket` 虽使用 `PUT`,仍按解绑删除语义保护。
Detected: suspicious.env_credential_access