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.
Why this conclusion was reached
2/4 dimensions flagged4 undeclared or violating capabilities were inferred.
2 high-risk artifacts or egress signals were extracted.
There is no explicit malicious chain in the report.
1 dependency or supply-chain issues need attention.
What drove the risk score up
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
Most important evidence
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 Declared capability vs actual capability
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() Suspicious artifacts and egress
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
Dependencies and supply chain
| Package | Version | Source | Known vuln | Notes |
|---|---|---|---|---|
| puppeteer | ^23.0.0 | npm | No | Version not pinned; auto-updates to latest |
| crypto | builtin | Node.js | No | Standard library module |
File composition
package-lock.json scripts/read-aloud.js README.md scripts/read-url.js scripts/demo.js scripts/generate-paragraph.js scripts/extract.js