安全决策报告
file-transfer-thru-local-workspace
文件传输技能存在网络暴露和认证绕过风险,服务监听在0.0.0.0且支持无认证模式,允许未授权文件操作和技能包下载
最直接的威胁证据
01
扫描发现开放端口15170的服务 初始入口 · src/upload-server.js
02
利用无认证模式访问上传API 权限提升 · src/upload-server.js
03
上传恶意文件或删除任意文件 最终危害 · src/upload-server.js
为什么得出这个结论
2/4 个维度触发 阻止
声明与实际能力
发现 2 项声明之外的能力或越权行为。
复核
隐藏执行与外联
提取到 1 个一般风险产物,需要结合上下文判断。
阻止
攻击链与高危发现
报告包含 3 步攻击链,另有 0 项高危或严重发现。
复核
依赖与供应链卫生
没有完整依赖信息,供应链判断需要保留弹性。
攻击链
01
扫描发现开放端口15170的服务
初始入口 · src/upload-server.js:510
02
利用无认证模式访问上传API
权限提升 · src/upload-server.js:250
03
上传恶意文件或删除任意文件
最终危害 · src/upload-server.js:300
风险分是怎么被拉高的
服务暴露在0.0.0.0公网监听 +20
upload-server.js:510 在0.0.0.0:15170监听,任何网络可达的客户端都可访问
支持无认证模式 +15
install.sh和upload-server.js允许AUTH_VALUE为空,导致完全无认证访问
技能包浏览下载功能 +10
可访问workspace下所有技能目录,存在配置/密钥泄露风险
最关键的证据
中危 敏感访问
服务暴露在公网监听
upload-server.js在0.0.0.0:15170监听端口,任何可网络可达的客户端均可访问上传/下载/删除API,存在未授权访问风险
src/upload-server.js:510 改为127.0.0.1或localhost监听,仅允许本地访问
中危 文档欺骗
认证机制与文档不符
文档描述'智能认证适配',但代码允许AUTH_VALUE为空导致完全无认证,install.sh:46-48明确处理无认证场景
install.sh:46 强制要求有效认证,不允许无认证模式运行
中危 敏感访问
技能包浏览可访问所有技能目录
getSkillsList()函数读取workspace下所有技能目录,可打包下载任意技能内容,可能导致其他技能的clawhub.json等敏感配置泄露
src/upload-server.js:68 限制技能浏览范围或需要更高权限验证
低危 供应链
使用grep解析JSON配置文件
install.sh使用grep/cut解析JSON而非jq等专用工具,可能因格式差异导致解析错误或意外值提取
install.sh:31 使用jq或node -e解析JSON更可靠
声明能力 vs 实际能力
文件系统 通过
声明 WRITE
→ 推断 WRITE
package.json permissions 声明与实际一致 网络访问 阻止
声明 listen
→ 推断 ADMIN
upload-server.js:510 监听0.0.0.0而非localhost,暴露风险超出预期 命令执行 阻止
声明 NONE
→ 推断 WRITE
install.sh:60使用nohup/env启动后台进程,uninstall.sh:23使用pkill 可疑产物与外联
中危 外部 URL
http://127.0.0.1:15170/ SKILL.md:228
依赖与供应链
没有结构化依赖告警。
文件构成
7 个文件 · 1904 行
HTML 1 个文件 · 688 行JavaScript 1 个文件 · 511 行Markdown 1 个文件 · 389 行Shell 2 个文件 · 183 行JSON 2 个文件 · 133 行
需关注文件 · 3
src/upload-server.js 服务暴露在公网监听 · 技能包浏览可访问所有技能目录
SKILL.md http://127.0.0.1:15170/
install.sh 认证机制与文档不符 · 使用grep解析JSON配置文件
其他文件 · upload.html · clawhub.json · uninstall.sh · package.json
安全亮点
使用path.basename()防止路径遍历攻击
使用spawn执行zip命令而非直接eval shell字符串
有基本的Token认证机制(虽然可能为空)
文件操作限定在uploads目录内