file-transfer-thru-local-workspace
The skill exposes Gateway credentials in install-time environment variables and systemd service files, contradicting its own security claim that credentials are not hardcoded. Undeclared credential reading from ~/.openclaw/openclaw.json and binding to 0.0.0.0 on all interfaces compound the risk.
为什么得出这个结论
2/4 个维度触发发现 2 项声明之外的能力或越权行为。
提取到 3 个一般风险产物,需要结合上下文判断。
报告包含 4 步攻击链,另有 3 项高危或严重发现。
发现 1 项需要关注的依赖或供应链线索。
攻击链
初始入口 · install.sh:1
权限提升 · install.sh:42
权限提升 · install.sh:51
最终危害 · install.sh:68
风险分是怎么被拉高的
install.sh reads gateway token/password from ~/.openclaw/openclaw.json and passes it as GATEWAY_AUTH_VALUE env var, which ends up in process list and systemd service files
SKILL.md states '认证值不在技能包中硬编码' and '不在日志中明文显示', but the install script embeds the credential in systemd Environment= directive
Both install.sh and upload-server.js read ~/.openclaw/openclaw.json for gateway auth token/password — not declared in permissions or docs
Server listens on 0.0.0.0:15170 rather than localhost only, expanding attack surface if credentials are weak or missing
最关键的证据
Gateway credentials embedded in systemd service and process environment
install.sh reads the gateway token/password from ~/.openclaw/openclaw.json and embeds it in the GATEWAY_AUTH_VALUE environment variable, which appears in /etc/systemd/system/openclaw-upload.service and in process listings (ps eww). This violates SKILL.md's explicit claim that credentials are not stored in the skill package.
install.sh:68 Undeclared credential file access
Both install.sh (lines 42-49) and upload-server.js (lines 31-38) read ~/.openclaw/openclaw.json to extract gateway.auth.token or gateway.auth.password. This is not declared in package.json permissions or SKILL.md capabilities.
install.sh:42 SKILL.md security claim contradicted by implementation
SKILL.md explicitly states '✅ 认证值不在技能包中硬编码' and '✅ 认证值不在日志中明文显示'. However, install.sh embeds the gateway credential in a systemd service file (Environment=GATEWAY_AUTH_VALUE=...) which is stored on disk in plaintext.
SKILL.md:126 Service created with elevated privileges if run as root
install.sh runs as the current USER and creates a systemd service. If executed as root, the service runs as root, giving the web-accessible upload service root-level file access on the system.
install.sh:52 Hardcoded workspace path /home/admin
upload-server.js defaults WORKSPACE to '/home/admin/.openclaw/workspace' rather than using HOME environment variable. This could cause issues on non-admin systems and indicates a possible default/development artifact.
src/upload-server.js:13 Security documentation references non-existent files
SKILL.md references SECURITY-AUDIT.md and docs/AUTH-COMPATIBILITY.md in its directory structure, but these files do not exist in the package.
SKILL.md:161 Skill packages directory accessible via web UI
The skill browses and zips all installed skill packages under ~/.openclaw/workspace/skills/ via the web UI. While authenticated, this gives any web user read access to all installed skill code including their SKILL.md files and any secrets stored within.
src/upload-server.js:78 声明能力 vs 实际能力
install.sh:42-49 reads ~/.openclaw/openclaw.json; upload-server.js:31 reads ~/.openclaw/openclaw.json install.sh:68-75 pipes credential as env var to nohup node; install.sh:51-66 creates systemd service with Environment=GATEWAY_AUTH_VALUE=${AUTH_VALUE} upload-server.js:337 server.listen(PORT, '0.0.0.0') 可疑产物与外联
http://127.0.0.1:15170/ SKILL.md:228
https://clawhub.ai/user/chengwang86 skill-card.md:7
https://clawhub.ai/chengwang86/file-transfer-thru-local-workspace skill-card.md:29
依赖与供应链
| 包名 | 版本 | 来源 | 漏洞 | 备注 |
|---|---|---|---|---|
| node (runtime) | >=14.0.0 | system | 否 | Runtime dependency; no npm packages installed |
| zip (system binary) | any | system | 否 | Used for skill package zipping; called via spawn |
文件构成
src/upload-server.js SKILL.md install.sh skill-card.md