Scan Report
25 /100
voice-tts
语音输入(Whisper ASR)+ 语音输出(Edge TTS)技能,支持 agent 专属音色,可调用 send_voice_reply.mjs 发送 Telegram 语音消息
Legitimate voice TTS/ASR skill for OpenClaw with no malicious behavior, but with undocumented shell execution, credential reading, and network access in code that is not declared in SKILL.md.
Safe to install
Add explicit declarations to SKILL.md: (1) shell:WRITE for subprocess/pip/curl usage, (2) credential reading (openclaw.json botToken access), (3) network:WRITE for Telegram API calls. Also remove the references to non-existent scripts/edge_tts and scripts/whisper from SKILL.md.
Findings 5 items
| Severity | Finding | Location |
|---|---|---|
| Medium | Undocumented shell subprocess execution Doc Mismatch | bin/voice-asr.mjs:67 |
| Medium | Undocumented network access (Telegram API) Doc Mismatch | scripts/send_voice_reply.mjs:80 |
| Low | SKILL.md references non-existent internal script files Doc Mismatch | SKILL.md:200 |
| Low | Credential reading from openclaw.json not capability-declared Sensitive Access | scripts/send_voice_reply.mjs:49 |
| Low | install.sh uses proxy variable unquoted in pip command Doc Mismatch | install.sh:40 |
| Resource | Declared | Inferred | Status | Evidence |
|---|---|---|---|---|
| Filesystem | NONE | READ | ✓ Aligned | bin/voice-asr.mjs:7 (fs.readFileSync reads openclaw.json); lib/config.mjs:43 |
| Filesystem | NONE | WRITE | ✓ Aligned | bin/voice-asr.mjs:85-91 (copyFileSync/unlinkSync for archiving); bin/voice-tts.m… |
| Shell | NONE | WRITE | ✓ Aligned | bin/voice-asr.mjs:67 (spawn('python3', ...)); bin/voice-tts.mjs:51 (spawn('pytho… |
| Network | NONE | WRITE | ✓ Aligned | scripts/send_voice_reply.mjs:80-91 (curl POST to https://api.telegram.org/) |
| Environment | NONE | READ | ✓ Aligned | bin/voice-asr.mjs:82 (process.env.OPENCLAW_WORKSPACE); scripts/send_voice_reply.… |
| Skill Invoke | NONE | READ | ✓ Aligned | bin/voice-asr.mjs:93-95 (generates output instructing agent to call send_voice_r… |
4 findings
Medium External URL 外部 URL
http://127.0.0.1:7897 SKILL.md:50 Medium External URL 外部 URL
https://nodejs.org/ install.sh:37 Medium External URL 外部 URL
https://pypi.tuna.tsinghua.edu.cn/simple install.sh:49 Medium External URL 外部 URL
https://api.telegram.org/bot$ scripts/send_voice_reply.mjs:80 File Tree
11 files · 34.1 KB · 980 lines JavaScript 6f · 473L
Markdown 1f · 261L
Shell 2f · 208L
JSON 2f · 38L
├─
▾
bin
│ ├─
voice-asr.mjs
JavaScript
│ └─
voice-tts.mjs
JavaScript
├─
▾
lib
│ ├─
audio.mjs
JavaScript
│ ├─
config.mjs
JavaScript
│ └─
errors.mjs
JavaScript
├─
▾
scripts
│ └─
send_voice_reply.mjs
JavaScript
├─
▾
tests
│ └─
smoke.sh
Shell
├─
config.default.json
JSON
├─
install.sh
Shell
├─
package.json
JSON
└─
SKILL.md
Markdown
Dependencies 3 items
| Package | Version | Source | Known Vulns | Notes |
|---|---|---|---|---|
edge-tts | latest (unpinned in install.sh) | pip | No | No version pinning in install.sh — pip install without version constraint |
whisper | latest (unpinned in install.sh) | pip | No | No version pinning in install.sh — pip install without version constraint |
click | latest (unpinned in install.sh) | pip | No | No version pinning in install.sh — pip install without version constraint |
Security Positives
✓ No evidence of reverse shell, C2, or data exfiltration to unauthorized destinations
✓ All network calls are to legitimate, documented endpoints (api.telegram.org, pypi.org, nodejs.org)
✓ No base64 encoding, obfuscation, or anti-analysis techniques detected
✓ No credential exfiltration — botToken is only used locally for Telegram API authentication
✓ File operations are scoped to expected paths (media directories, /tmp, workspace)
✓ Audio file archiving uses copy-before-delete pattern to prevent data loss
✓ Timeout protection on subprocess calls (SIGKILL after timeout)
✓ No access to ~/.ssh, ~/.aws, .env, or other sensitive credential paths
✓ pip install uses trusted packages (edge-tts, whisper, click) from official PyPI