Back to skill

Security audit

Aliyun OSS or Tencent COS oss upload online access

Security checks for vulnerabilities and agentic risk

Overview

The skill largely matches its stated upload-and-share purpose, but it needs review because it can publish local or URL-fetched content to public cloud storage and its setup guidance can expose cloud credentials.

Install only if you intentionally want files to become public internet-accessible links. Do not use it for confidential files, do not paste real cloud keys into chat, configure secrets through a protected environment or secret store, restrict the cloud key to one bucket and prefix, and avoid URL uploads unless private-network and metadata addresses are blocked.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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
Findings (3)

T09 · Insecure Skill Coding Practices

Error
Location
scripts/upload.js:433
Finding
Unrestricted URL Fetching Enables SSRF and Public Data Exfiltration## Vulnerability Details **File Location**: `scripts/upload.js:433-457`, `scripts/upload.js:480-485`, `scripts/upload.js:517-524`, and `scripts/upload.js:572-578` **Vulnerability Type**: Server-Side Request Forgery (SSRF) with public disclosure **Risk Level**: High **Vulnerable code:** ```js function getBufferFromUrl(url) { return new Promise((resolve, reject) => { const parsed = new URL(url); const client = parsed.protocol === 'https:' ? https : http; client.get(url, { timeout: 60000 }, (res) => { if (res.statusCode >= 300 && res.statusCode < 400 && res.headers.location) { return getBufferFromUrl(res.headers.location).then(resolve).catch(reject); } const chunks = []; let size = 0; res.on('data', (chunk) => { size += chunk.length; if (size > MAX_SIZE) { res.destroy(); reject(new Error('File exceeds the 100 MB limit')); return; } chunks.push(chunk); }); res.on('end', () => resolve(Buffer.concat(chunks))); res.on('error', reject); }).on('error', reject); }); } ``` ```js if (/^https?:\/\//i.test(input)) { try { buffer = await getBufferFromUrl(input); } catch (e) { console.error('Download failed:', e.message || e); process.exit(1); } ``` The downloaded bytes are subsequently made publicly readable: ```js await client.put(key, buffer, { timeout: 600000, headers: { 'content-type': getContentType(filename), 'x-oss-object-acl': 'public-read', }, }); ``` ```js const putParams = { Bucket: bucket, Region: region, Key: key, Body: buffer, ContentType: getContentType(filename), ACL: 'public-read', }; ``` ### Technical Analysis The script accepts any user-supplied HTTP or HTTPS URL and requests it from the host running the skill. It does not resolve ...[truncated 2297 chars]
Remediation
## Remediation Suggestions 1. Disable remote URL ingestion by default unless it is essential to the skill. 2. Prefer an explicit allowlist of trusted HTTPS hostnames. 3. Resolve the hostname before connecting and reject every address in loopback, private, link-local, multicast, unspecified, documentation, carrier-grade NAT, and other reserved IPv4 and IPv6 ranges. 4. Perform destination validation for every resolved address, not only the first result. 5. Re-resolve and revalidate the destination after every redirect. 6. Set a small redirect limit and resolve relative `Location` values with `new URL(location, currentUrl)`. 7. Reject protocol changes and allow only HTTPS where possible. 8. Protect against DNS rebinding by connecting to a previously validated address while preserving the expected TLS hostname, or use a hardened outbound proxy. 9. Accept only successful response statuses and enforce response-size limits using both `Content-Length` and streaming byte counts. 10. Require explicit user confirmation before publishing remotely fetched content and consider private objects or short-lived signed URLs instead of `public-read`. 11. Block cloud metadata destinations at both application and network/firewall layers.

T09 · Insecure Skill Coding Practices

Warning
Location
SKILL.md:89
Finding
Documentation Encourages Disclosure of Long-Lived Cloud Credentials Through Agent Conversations## Vulnerability Details **File Location**: `SKILL.md:89-113` **Vulnerability Type**: Unsafe credential handling guidance **Risk Level**: Medium **Vulnerable documentation:** ```text Conversation example (Aliyun OSS): Me: Install the oss-upload-online-access skill from ClawHub. I use Aliyun OSS, and my credentials are: Region: oss-cn-shenzhen Bucket: my-bucket AccessKey ID: LTAIxxxxxxxxxxxxxxxx AccessKey Secret: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx OpenClaw: Okay, installing oss-upload-online-access through ClawHub and writing the configuration... The credentials have been written to ~/.openclaw/openclaw.json. ``` ```text Conversation example (Tencent COS): Me: Install the oss-upload-online-access skill from ClawHub. I use Tencent COS, and my credentials are: Bucket: my-bucket-1250000000 Region: ap-guangzhou SecretId: AKIDxxxxxxxxxxxxxxxx SecretKey: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx OpenClaw: Okay, installing oss-upload-online-access through ClawHub and writing the configuration... The credentials have been written to ~/.openclaw/openclaw.json. ``` ### Technical Analysis These installation examples instruct users to submit OSS/COS access credentials directly through an AI-agent conversation and expect the agent to write them into configuration. Credentials placed in a conversation may be retained in chat history, model context, telemetry, debugging records, tool traces, screenshots, or platform logs. This guidance also conflicts with the same document's stated rule that an AI must not read, output, or otherwise handle credential values. Labeling the conversation as local or private does not guarantee that credential values will avoid platform logging and retention systems. ### Attack Path 1. A user follows the documented installation example. 2. The user enters a cloud access-key ID and secret into the agent c ...[truncated 949 chars]
Remediation
## Remediation Suggestions 1. Remove all instructions that ask users to paste credentials into an AI conversation. 2. Direct users to a platform secret manager, protected environment-variable interface, or local setup utility whose input is never sent to the model. 3. Ensure credential values are passed directly from the secret store to the upload process without entering prompts or agent-visible tool output. 4. Use short-lived or workload-identity credentials where supported. 5. Apply least-privilege IAM policies restricted to the required bucket, object prefix, and operations. 6. Warn users to rotate any real credentials previously entered into conversations. 7. Add automated redaction for known credential fields in application logs and execution traces. 8. Make the setup guidance consistent with the document's prohibition against AI access to credential values.

T08 · Insecure Dependencies

Note
Location
package.json:6
Finding
Unpinned Third-Party Dependencies and Missing Lockfile Create Supply-Chain Risk## Vulnerability Details **File Location**: `package.json:6-11`; related installation instructions at `SKILL.md:161-167` **Vulnerability Type**: Non-reproducible dependency installation **Risk Level**: Low **Vulnerable dependency declaration:** ```json { "dependencies": { "ali-oss": "^6.20.0", "axios": "^1.6.0", "cos-nodejs-sdk-v5": "^2.14.2", "stream-to-buffer": "^0.1.0" } } ``` **Related installation instructions:** ```text npm install ``` ### Technical Analysis All dependencies use caret ranges, allowing `npm install` to select later compatible releases. The audited project contains no package lockfile, so direct and transitive dependency versions are not reproducibly fixed or integrity-pinned. A future installation may therefore execute code different from the code reviewed during this audit. npm packages can execute lifecycle scripts during installation, and imported SDK code executes in the same process as the upload script, which has access to cloud credentials and file contents. The audited script directly imports `ali-oss` and `cos-nodejs-sdk-v5`, but no use of `axios` or `stream-to-buffer` was identified. Keeping unnecessary packages expands the dependency graph and supply-chain attack surface without providing functionality. This finding identifies unsafe dependency management rather than evidence that any currently declared package is malicious. ### Attack Path 1. A user or platform installs the skill using `npm install`. 2. npm resolves the mutable version ranges and transitive dependency graph at installation time. 3. A subsequently compromised or unsafe compatible release is selected. 4. Malicious code runs through an installation lifecycle script or when the dependency is imported. 5. That code executes with the privileges of the agent process and may access environment variables, local files, cloud credentials, or outbound network connections. ### Impact ...[truncated 592 chars]
Remediation
## Remediation Suggestions 1. Remove `axios` and `stream-to-buffer` if they are not required. 2. Pin reviewed direct dependencies to exact versions rather than caret ranges. 3. Generate, review, and commit a `package-lock.json` with integrity hashes. 4. Replace documented `npm install` deployment steps with `npm ci`. 5. Run dependency vulnerability and provenance checks in CI. 6. Review transitive dependency changes before updating the lockfile. 7. Consider disabling lifecycle scripts during installation where compatible with the selected SDKs. 8. Perform updates through controlled, reviewed pull requests rather than resolving new versions during production installation.
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
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (21)

Missing User Warnings

High
Confidence
97% confidence
Finding
The skill behavior is to upload files with public-read access and return publicly accessible URLs, but that consequence is not made prominent in the core description at the top. Users or orchestrators may interpret 'online access' or 'remote file link' as ordinary cloud storage rather than immediate public internet exposure, creating serious confidentiality risk for sensitive files.

Ae1

High
Category
analysis-evasion
Content
4. **唯一访问方式**:凭证**仅**由 `scripts/upload.js` 在进程内读取(env var 或 config.json)。调用方只能通过执行 `node scripts/upload.js` 完成上传,不得以其他任何方式触及凭证。
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
4. **唯一访问方式**:凭证**仅**由 `scripts/upload.js` 在进程内读取(env var 或 config.json)。调用方只能通过执行 `node scripts/upload.js` 完成上传,不得以其他任何方式触及凭证。
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
4. **唯一访问方式**:凭证**仅**由 `scripts/upload.js` 在进程内读取(env var 或 config.json)。调用方只能通过执行 `node scripts/upload.js` 完成上传,不得以其他任何方式触及凭证。
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
4. **唯一访问方式**:凭证**仅**由 `scripts/upload.js` 在进程内读取(env var 或 config.json)。调用方只能通过执行 `node scripts/upload.js` 完成上传,不得以其他任何方式触及凭证。
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
4. **唯一访问方式**:凭证**仅**由 `scripts/upload.js` 在进程内读取(env var 或 config.json)。调用方只能通过执行 `node scripts/upload.js` 完成上传,不得以其他任何方式触及凭证。
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
4. **唯一访问方式**:凭证**仅**由 `scripts/upload.js` 在进程内读取(env var 或 config.json)。调用方只能通过执行 `node scripts/upload.js` 完成上传,不得以其他任何方式触及凭证。
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ssd 3

High
Confidence
99% confidence
Finding
The example dialogue instructs the agent to collect cloud credentials directly in chat and write them into persistent configuration. This normalizes unsafe secret handling, increases the chance of credential retention in conversation logs or platform telemetry, and encourages agents to act as secret brokers rather than using dedicated secret-management mechanisms.

Lp3

Medium
Category
MCP Least Privilege
Confidence
95% confidence
Finding
The skill explicitly relies on sensitive environment variables for cloud credentials but does not declare any tool scope or permission metadata to make that access visible and constrainable by the platform. This weakens policy enforcement and review, increasing the chance that an agent can access secrets without clear user awareness or platform gating.

Vague Triggers

Medium
Confidence
94% confidence
Finding
The top-level description includes broad phrases like uploading files, accessing files online, and getting remote links, which can match many generic user requests not specifically asking for public cloud publication. Overbroad routing can cause the skill to trigger in situations where users did not intend internet exposure, especially because this skill defaults to creating publicly accessible URLs.

Vague Triggers

Medium
Confidence
90% confidence
Finding
The 'when to use' section lists broad activation phrases without exclusions or warning criteria, making accidental invocation more likely. In context, accidental invocation is risky because the skill uploads content to third-party cloud storage and returns public URLs by default.

Description-Behavior Mismatch

Medium
Confidence
94% confidence
Finding
The skill accepts arbitrary HTTP(S) URLs, downloads their contents, and re-uploads them to public object storage. That expands the capability from 'upload a file' to 'fetch and republish remote content', which can be abused for SSRF-like access to internal resources, unauthorized mirroring of third-party content, or laundering content behind the operator's cloud bucket.

Missing User Warnings

Medium
Confidence
92% confidence
Finding
The Aliyun upload code sets 'x-oss-object-acl' to 'public-read', making every uploaded object publicly accessible by default. Because the skill's purpose is to return online access URLs, this behavior is contextual, but it still creates a meaningful risk of unintended data exposure if users upload sensitive files or misunderstand that links are world-readable.

Missing User Warnings

Medium
Confidence
92% confidence
Finding
The Tencent COS path likewise sets ACL to 'public-read', so uploaded files become internet-accessible without any explicit consent mechanism in the script. In this skill context that may be intended for sharing, but the absence of warnings or safer defaults increases the chance of accidental public disclosure of confidential content.

Context-Inappropriate Capability

Medium
Confidence
96% confidence
Finding
The main flow treats any HTTP(S) input as a fetch target and retrieves arbitrary remote content before uploading it. In an agent skill context, this is dangerous because it gives the skill outbound network reach beyond the stated purpose, potentially enabling access to internal metadata services, intranet endpoints, or other sensitive URLs if an attacker can influence the input.

Natural-Language Policy Violations

Low
Confidence
91% confidence
Finding
The human-readable guidance strings for all configuration fields are written only in Chinese, such as the required-field instructions under both provider sections. This imposes a specific language on users without any opt-in or explanation that the skill is region-specific, matching the language/locale policy concern.

Unpinned Dependencies

Low
Category
Supply Chain
Content
"license": "MIT-0",
  "private": true,
  "dependencies": {
    "ali-oss": "^6.20.0",
    "axios": "^1.6.0",
    "cos-nodejs-sdk-v5": "^2.14.2",
    "stream-to-buffer": "^0.1.0"
Confidence
94% confidence
Finding
The dependency uses a caret range (^6.20.0), which allows newer compatible releases to be installed than the one originally reviewed. This weakens build reproducibility and can expose consumers to newly introduced vulnerable or malicious upstream versions through the supply chain.

Unpinned Dependencies

Low
Category
Supply Chain
Content
"private": true,
  "dependencies": {
    "ali-oss": "^6.20.0",
    "axios": "^1.6.0",
    "cos-nodejs-sdk-v5": "^2.14.2",
    "stream-to-buffer": "^0.1.0"
  }
Confidence
98% confidence
Finding
The axios dependency is not pinned and uses a caret range (^1.6.0), so different installs may resolve to different releases. In a skill that uploads files and returns public URLs, dependency drift in a network-facing HTTP client raises supply-chain and security risk, especially because vulnerable axios releases exist and could affect request handling.

Unverifiable Dependency: axios has 16 known advisory(ies) (CVE-2026-44494 (axios Vulnerable to Full Man-in-the-Middle via Prototype Pollution Gadget in `co); CVE-2026-44495 (axios Vulnerable to Credential Theft and Response Hijacking via Prototype Pollut); CVE-2025-62718 (Axios has a NO_PROXY Hostname Normalization Bypass that Leads to SSRF) +13 more), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
89% confidence
Finding
The manifest does not pin axios, and the package family has multiple known advisories, so it is not possible to verify whether deployed installations resolve to a safe version. Because this skill is network-oriented and likely performs remote HTTP interactions during file upload or URL generation, an affected axios version could enable issues such as SSRF, request manipulation, or credential exposure depending on usage.

Unpinned Dependencies

Low
Category
Supply Chain
Content
"dependencies": {
    "ali-oss": "^6.20.0",
    "axios": "^1.6.0",
    "cos-nodejs-sdk-v5": "^2.14.2",
    "stream-to-buffer": "^0.1.0"
  }
}
Confidence
93% confidence
Finding
The COS SDK dependency is specified with a caret range (^2.14.2), allowing unreviewed future patch/minor releases to be installed. This creates a supply-chain integrity issue and reduces reproducibility for code that likely handles cloud storage credentials and uploads.

Unpinned Dependencies

Low
Category
Supply Chain
Content
"ali-oss": "^6.20.0",
    "axios": "^1.6.0",
    "cos-nodejs-sdk-v5": "^2.14.2",
    "stream-to-buffer": "^0.1.0"
  }
}
Confidence
90% confidence
Finding
The stream-to-buffer package is unpinned (^0.1.0), so installs are not deterministic and may pull in unreviewed upstream changes. Even for a small utility dependency, this increases software supply-chain risk and can indirectly affect file handling behavior.

Static analysis

No suspicious patterns detected.