castreader
CastReader skill has undocumented network behavior, undeclared browser automation with anti-detection flags, and uses base64 audio processing that appears legitimate but warrants scrutiny.
为什么得出这个结论
2/4 个维度触发发现 4 项声明之外的能力或越权行为。
提取到 2 个高危 IOC 或外联信号。
没有形成明确的恶意路径。
发现 1 项需要关注的依赖或供应链线索。
风险分是怎么被拉高的
SKILL.md does not declare network requests to api.castreader.ai:8123
read-aloud.js launches Puppeteer without network:READ declaration
--disable-blink-features=AutomationControlled used in read-aloud.js:51
最关键的证据
Undeclared network requests to external API
All scripts communicate with api.castreader.ai:8123 for TTS services. SKILL.md only describes URL extraction and audio generation workflow but never explicitly declares network:READ permission or the external API endpoint.
scripts/read-url.js:51 Undeclared Puppeteer browser automation
extract.js and read-aloud.js use Puppeteer to launch headless Chrome browsers and manipulate web pages. SKILL.md only mentions 'read-url.js' and 'generate-text.js' scripts, omitting browser automation entirely.
scripts/extract.js:42 Automation detection suppression flag
read-aloud.js passes --disable-blink-features=AutomationControlled to Chrome, which suppresses navigator.webdriver detection. While common for legitimate automation, this anti-detection technique is suspicious when combined with undeclared browser access.
scripts/read-aloud.js:51 Base64 audio decoding in multiple scripts
Base64-encoded audio from API response is decoded using Buffer.from(audioBase64, 'base64'). While this is legitimate for TTS APIs, the pattern matches high-risk obfuscation signatures and was flagged by pre-scan.
scripts/generate-paragraph.js:94 Shell execution via subprocess not declared
read-url.js uses execFileSync to invoke extract.js as a child process. SKILL.md describes 'node scripts/read-url.js' but does not mention that it internally spawns another Node process.
scripts/read-url.js:79 声明能力 vs 实际能力
scripts/read-url.js:51 - POST to api.castreader.ai:8123 scripts/read-url.js:82 - fs.writeFileSync scripts/read-url.js:79 - execFileSync('node', ...) scripts/read-aloud.js:43 - puppeteer.launch() 可疑产物与外联
Buffer.from(audioBase64, 'base64' scripts/generate-paragraph.js:94
131.0.0.0 scripts/extract.js:42
https://img.shields.io/badge/OpenClaw-Skill-blue README.md:3
https://clawhub.com/castreader README.md:3
https://img.shields.io/badge/License-MIT-green.svg README.md:4
https://img.shields.io/badge/platform-macOS%20%7C%20Linux%20%7C%20Windows-lightgrey README.md:5
https://en.wikipedia.org/wiki/Text-to-speech README.md:46
https://notion.so/my-page README.md:99
https://chromewebstore.google.com/detail/castreader-tts-reader/foammmkhpbeladledijkdljlechlclpb README.md:102
http://api.castreader.ai:8123 README.md:134
https://castreader.ai README.md:161
https://castreader.ai/openclaw README.md:162
依赖与供应链
| 包名 | 版本 | 来源 | 漏洞 | 备注 |
|---|---|---|---|---|
| puppeteer | ^23.0.0 | npm | 否 | Version not pinned; auto-updates to latest |
| crypto | builtin | Node.js | 否 | Standard library module |
文件构成
package-lock.json scripts/read-aloud.js README.md scripts/read-url.js scripts/demo.js scripts/generate-paragraph.js scripts/extract.js