安全决策报告

weread-fulltext

文档声明「零注入零写入」但代码实际使用 page.evaluate() 执行 JS 并写入大量文件,存在文档-行为差异;依赖无版本锁定存在供应链风险。

安装决策优先 来源: ClawHub 扫描时间: 19 小时前
文件 3
IOC 3
越权项 0
发现 4

为什么得出这个结论

0/4 个维度触发
通过
声明与实际能力

声明资源与推断能力基本一致。

复核
隐藏执行与外联

提取到 3 个一般风险产物,需要结合上下文判断。

通过
攻击链与高危发现

没有形成明确的恶意路径。

通过
依赖与供应链卫生

依赖结构存在,但暂未看到明显高危告警。

风险分是怎么被拉高的

文档声明与实际行为不符 +20

SKILL.md 声称「零注入零写入」,但代码使用 page.evaluate() 执行 JS 并写入多处文件

依赖无版本锁定 +12

requirements.txt 中 playwright>=1.40 和 rapidocr-onnxruntime>=1.3 使用开放版本范围

浏览器存储状态持久化 +5

登录态写入本地 JSON 文件,虽为正常功能但文档未明确说明

JS fetch 带凭证跨域 +5

page.evaluate() 内 fetch 请求携带 credentials:'include',虽目标为 weread.qq.com 但方式存在理论风险

最关键的证据

中危 文档欺骗

文档声明「零注入」但实际使用 page.evaluate() 执行 JS

SKILL.md 声称「零注入零写入」,但 capture_page() 函数使用 page.evaluate() 执行 JS 代码 querySelectorAll('canvas').map(...) 来获取画布数据。这是通过 Playwright 的合法 JS 注入机制。

scripts/export_fulltext.py:59
更新 SKILL.md 说明使用 Playwright page.evaluate() 进行画布捕获,或改为使用 Playwright 原生的 screenshot API
中危 文档欺骗

文档声明「零写入」但代码实际写入多个文件

SKILL.md 采集层声明「零写入」,但实际代码写入:PNG截图(spreads_dir)、manifest.jsonl、run_meta.json、chapters_official.json、登录态文件 weread_state.json 等多个文件。

scripts/export_fulltext.py:98
更正文档说明采集层实际写入截图和元数据文件
中危 供应链

依赖包无版本锁定

requirements.txt 使用开放版本范围 playwright>=1.40 和 rapidocr-onnxruntime>=1.3,依赖更新可能导致行为变化或引入漏洞。

scripts/requirements.txt:1
锁定具体版本如 playwright==1.40.0 和 rapidocr-onnxruntime==1.3.15
低危 权限提升

未声明的登录态持久化

代码将登录态保存到本地 profile/weread_state.json 文件,文档未明确说明此持久化行为。

scripts/export_fulltext.py:356
在文档中明确说明登录态保存位置和用途

声明能力 vs 实际能力

文件系统 通过
声明 WRITE
→
推断 WRITE
SKILL.md 明确说明输出 Markdown 和报告
浏览器 通过
声明 WRITE
→
推断 WRITE
SKILL.md 说明使用 Playwright 自动化
网络访问 通过
声明 READ
→
推断 READ
仅访问 weread.qq.com 域名
命令执行 通过
声明 NONE
→
推断 NONE
代码中无 subprocess 或 shell 执行

可疑产物与外联

中危 外部 URL
https://weread.qq.com

scripts/export_fulltext.py:29

中危 外部 URL
https://weread.qq.com/api/user/notebook

scripts/export_fulltext.py:122

中危 外部 URL
https://weread.qq.com/web/book/chapterInfos

scripts/export_fulltext.py:147

依赖与供应链

包名版本来源漏洞备注
playwright >=1.40 pip 否 开放版本范围,建议锁定
rapidocr-onnxruntime >=1.3 pip 否 开放版本范围,建议锁定

文件构成

3 个文件 · 579 行
Python 1 个文件 · 514 行Markdown 1 个文件 · 63 行Text 1 个文件 · 2 行
需关注文件 · 2
scripts/export_fulltext.py Python · 514 行
文档声明「零注入」但实际使用 page.evaluate() 执行 JS · 文档声明「零写入」但代码实际写入多个文件 · 未声明的登录态持久化 · https://weread.qq.com · https://weread.qq.com/api/user/notebook · https://weread.qq.com/web/book/chapterInfos
scripts/requirements.txt Text · 2 行
依赖包无版本锁定
其他文件 · SKILL.md

安全亮点

所有网络请求仅指向 weread.qq.com 官方域名,无外部 IP 连接
无凭证收割行为,仅访问自己的微信读书账号
无反向 shell、base64 解码执行等恶意模式
OCR 完全本地执行,无云端传输
代码结构清晰,有完整错误处理和日志输出
文档诚实声明了未验证范围和限制
使用 SHA-256 作为图片缓存键,防篡改验证