Suspicious — Risk Score 42/100
Last scan:2 days ago Rescan
42 /100
claw-body
Give your Claw a body — real-time digital avatar with face, voice and expressions, powered by NuwaAI. Also supports presentation mode for PPT/PDF narration.
该技能为合法的 NuwaAI 数字人avatar集成工具,核心功能正常,但存在多项文档-行为差异(shell执行、文件写入、凭证读取)未在 SKILL.md 中声明,构成安全分析师级别的越权行为。
Skill Nameclaw-body
Duration56.7s
Enginepi
Use with caution
要求开发者补充 allowed-tools 声明(filesystem:READ+WRITE、shell:WRITE),明确 presentation 解析的文件路径边界,并移除硬编码的 demo API key(改由用户输入或环境变量注入)。

Findings 6 items

Severity Finding Location
Medium
未声明的 shell 执行(subprocess)
server.mjs 通过 execSync 调用 python3 解析用户上传的 PPT/PDF 文件,执行路径硬编码在 ~/Desktop/openclaw/work/...,执行超时 120 秒。SKILL.md 完全没有提及此行为。
const result = execSync(`python3 "${scriptPath}" "${tmpPath}"`, { encoding: "utf-8", timeout: 120000, ... });
→ 在 SKILL.md allowed-tools 中声明 shell:WRITE,并在文档中说明调用的是 claw-presenter 的 parse 脚本
server.mjs:310
Medium
未声明的 OpenClaw 凭证读取
server.mjs 读取 ~/.openclaw/openclaw.json 以获取 gateway token。SKILL.md 仅提到需要 enable chatCompletions 端点,未说明需要读取配置文件。
const OPENCLAW_CFG_PATH = path.join(process.env.HOME, ".openclaw", "openclaw.json");
→ 在文档中明确声明需要读取 OpenClaw 配置文件获取认证 token
server.mjs:12
Low
硬编码 demo API key
server.mjs 中硬编码了 NuwaAI demo API key(sk-ody1Xk9lw...),虽注释说明为公开试用凭证,但源码中包含活跃的 API key 存在密钥泄露风险。
apiKey: "sk-ody1Xk9lw_vXkRWEPnaO8OwTFB9gbCnng2EWUl5jNbzolDSlFItc9DvWqrr6RLcL"
→ 将 demo key 移至环境变量 NUWA_DEMO_KEY 或从外部配置文件注入
server.mjs:34
Low
文件上传路径遍历风险(已缓解)
API /api/presentation/ 支持读取任意 dir 参数的 presentation.json 和 slides/ 目录。代码有 path.resolve 校验(server.mjs:368),但 presRoot 硬编码在 ~/Desktop/openclaw/work/presentations。
const presRoot = path.join(process.env.HOME, "Desktop", "openclaw", "work", "presentations");
→ 使用更严格的沙箱路径限制,避免读取 Desktop 下的其他文件
server.mjs:249
Low
SKILL.md 缺少 allowed-tools 声明
技能元数据完全没有声明 allowed-tools,违反 AI 技能安全规范。
无 allowed-tools 字段
→ 添加 allowed-tools 声明:{"tools": ["Bash", "Read", "Write"]} 并说明用途
SKILL.md:1
Info
NuwaAI 外部服务集成
技能与 NuwaAI (nuwaai.com) 服务深度集成,涉及 WebSocket 实时通信、API 认证和数字人渲染,属于合法第三方集成但用户应知晓数据流向。
wss://wsapi.nuwaai.com/websk/humanAgent/humanctrl/webrtc/{avatarId}/asr
→ 在隐私政策或 SKILL.md 中说明 NuwaAI 作为数据处理第三方
server.mjs:226
ResourceDeclaredInferredStatusEvidence
Filesystem NONE WRITE ✗ Violation server.mjs:58 .nuwa-config.json 写入, server.mjs:318 上传文件写入 os.tmpdir()
Network NONE WRITE ✗ Violation server.mjs:215 POST到 api.nuwaai.com, server.mjs:226 WebSocket wss://wsapi.nuwaai…
Shell NONE WRITE ✗ Violation server.mjs:310 execSync python3 parse-presentation.py, server.mjs:327 同上
Environment NONE READ ✗ Violation server.mjs:10 读取 OPENCLAW_GATEWAY, OPENCLAW_TOKEN; server.mjs:13 读取 HOME 拼接路径
Skill Invoke NONE READ ✗ Violation SKILL.md 提到 claw-presenter skill 配合使用,但未声明 dependency
1 High 3 findings
🔑
High API Key 疑似硬编码凭证
apiKey: "sk-ody1Xk9lw_vXkRWEPnaO8OwTFB9gbCnng2EWUl5jNbzolDSlFItc9DvWqrr6RLcL"
server.mjs:34
🔗
Medium External URL 外部 URL
https://nuwaai.com
SKILL.md:25
🔗
Medium External URL 外部 URL
https://api.nuwaai.com/web/apiKey/auth
server.mjs:215

File Tree

6 files · 106.0 KB · 2739 lines
HTML 1f · 1680L JavaScript 3f · 862L Markdown 1f · 192L JSON 1f · 5L
├─ 📁 public
│ ├─ 📜 i18n.js JavaScript 230L · 10.3 KB
│ ├─ 📄 index.html HTML 1680L · 66.3 KB
│ └─ 📜 pcm-processor.js JavaScript 53L · 1.4 KB
├─ 📋 _meta.json JSON 5L · 129 B
├─ 📜 server.mjs JavaScript 579L · 21.5 KB
└─ 📝 SKILL.md Markdown 192L · 6.4 KB

Dependencies 1 items

PackageVersionSourceKnown VulnsNotes
node (runtime) 18+ system No Node.js 运行时,无第三方 npm 依赖

Security Positives

✓ 核心功能为合法工具:数字人 avatar 实时对话,无恶意目的
✓ API key 为 NuwaAI 官方 demo key,非窃取凭证
✓ WebSocket 通信仅用于avatar音视频,无可疑 C2 通道
✓ 路径遍历有防护(server.mjs:368 path.resolve 校验)
✓ 用户凭证(apiKey/avatarId/userId)存储在本地 .nuwa-config.json,不外传
✓ 临时文件上传后即删除(server.mjs:317 fs.unlinkSync)
✓ 无 eval、base64 解码、裸 IP 请求等高危模式