跳转到正文
报告库
用途分类 / 其他用途

Weread Skills Skill 安全审计

作者说它能做什么(原文)

微信读书助手 — 搜索书籍、管理书架、查看笔记划线、浏览书评、阅读统计、发现推荐好书

第三方安全检查结论

先别安装或运行

已检查文件
9
发现的风险
3
会不会运行危险命令?检查是否下载程序后直接运行、让他人远程控制电脑,或藏起要运行的命令。未发现风险
会不会泄露文件和密钥?检查是否发送含密码或密钥的文件,以及代码里是否直接写了密钥。发现 1 项风险
低风险

Bearer API Key 和私人阅读数据依赖统一远程网关

原文依据:6 处
发现了什么

凭证随每次调用发送到网关,并绑定用户身份;同一接口可读取书架、私密标记、阅读历史和个人笔记内容。这是实现功能所需的数据边界,但材料未说明密钥权限范围、撤销方式或网关的数据保留政策。

为什么需要注意

如果密钥泄露或网关不可信,持有者可能以用户身份查询敏感的阅读习惯和个人文本。现有材料不能证明发生了泄露。

远程网关和身份绑定 Bearer 密钥是这些功能的必要数据边界,但仍构成真实的凭证与隐私风险:密钥被发往统一网关,并可用于读取个人书架、阅读进度和笔记/点评内容。材料确实没有说明最小权限、撤销、保留期限或二次共享政策,因此用户无法从所给文档判断泄露后的影响范围。用户可在使用前询问这些政策,并限制环境变量只对该会话或进程可见。

SKILL.md:33来自说明文档打开原文件
```POST https://i.weread.qq.com/api/agent/gateway```
查看另外 5 个位置
SKILL.md:38来自说明文档打开原文件
- Header:`Authorization: Bearer $WEREAD_API_KEY`- `WEREAD_API_KEY` 从环境变量获取,格式 `wrk-xxxxxxxx`- 若未设置,提示用户:`export WEREAD_API_KEY=<你的apikey>`- API Key 绑定用户身份(vid),需要用户身份的接口会自动注入,无需手动传 vid
profile.md:31来自说明文档打开原文件
### 3. 获取笔记调 `/user/notebooks` 获取笔记概览,展示有笔记的书籍数和总笔记数。这里只做概览,不导出单本书笔记内容。如果用户要查看某本书的具体笔记内容,再按 `notes.md` 调 `/book/bookmarklist` 和 `/review/list/mine`。
notes.md:118来自说明文档打开原文件
|------|------|| `reviews` | 想法/点评数组 || `reviews[].review.reviewId` | 唯一 ID || `reviews[].review.content` | 内容文本 || `reviews[].review.abstract` | 想法对应的划线原文。仅划线想法等能定位到原文的内容有值,整本书评或章节点评可能为空或不存在 || `reviews[].review.range` | 划线原文位置范围,格式如 `"2959-3007"`。仅能定位到原文的内容有值 || `reviews[].review.chapterUid` | 章节 UID。章节相关内容可能有值 || `reviews[].review.chapterIdx` | 章节序号。章节相关内容可能有值 || `reviews[].review.createTime` | 创建时间 || `reviews[].review.star` | 评分(0-5,-1=无评分) |
profile.md:5来自说明文档打开原文件
通过组合 `/shelf/sync`、`/book/getprogress`、`/user/notebooks` 获取用户阅读概况。
notes.md:102来自说明文档打开原文件
### `/review/list/mine` — 单本书的个人想法与点评> 返回当前用户在该书上的所有个人内容,包括划线想法、章节点评和整本书评。
会不会删除文件或一直在后台运行?检查是否大范围删除文件、改写磁盘,或设置自动启动。未发现风险
会不会绕过安全保护?检查是否跳过网站安全验证、开放过多文件权限,或取消操作前的确认。发现 1 项风险
中风险

未经校验的服务器深度链接会作为可点击链接展示

原文依据:2 处
发现了什么

Skill 要求直接采用回包中的 `deepLink`,未规定允许的协议、域名或目标页面,也未要求在展示前验证。

为什么需要注意

若接口返回恶意或被篡改的链接,用户点击后可能被带到钓鱼页面、触发未知应用深链,或被诱导授权和输入凭证。链接不会自动打开,因此需要用户点击才会产生此风险。

该 Skill 明确要求把服务器返回的 `deepLink` 原样变成可点击链接,仅禁止在字段缺失时自行拼接;没有协议、域名或目标白名单。若响应含恶意或误导性链接,用户可能被带到非预期网页或应用协议。材料不能证明这种响应已经出现。用户可要求只允许可信的 HTTPS 域名或已知微信读书协议,并在其他目标上显示警告而非直接链接。

SKILL.md:94来自说明文档打开原文件
8. **上下文衔接**:对话中记住已查询的 bookId,后续操作无需用户重复提供9. **深度链接**:优先使用接口回包中的 `deepLink` 字段作为跳转链接,展示为 `[打开阅读]({deepLink})`;若回包没有 `deepLink`,不要自行拼接 `weread://` 链接10. **数据展示规范**:
查看另外 1 个位置
SKILL.md:103来自说明文档打开原文件
在展示书籍、章节、划线、想法等内容时,如果回包中有 `deepLink` 字段,直接使用该字段值作为跳转链接。- 跳转链接展示为 Markdown 超链接格式:`[打开阅读]({deepLink})`。- 各接口回包中可能包含 `deepLink` 字段,如有则直接使用。- 若回包中没有 `deepLink` 字段,不要尝试手动拼接 `weread://` 链接。
会不会误导 AI 或隐藏内容?检查工作说明是否要求 AI 忽略你的指令、干扰检查结果,或夹带看不见的文字。发现 1 项风险
高风险

服务器回包可强制代理遵循未预先限定的“升级”指令

原文依据:2 处
发现了什么

每次请求都必须检查 `upgrade_info`,一旦出现就立即停止用户任务,并按服务器返回的 `message` 完成升级。文档没有限制该消息能要求哪些操作,也没有要求向用户确认或验证升级来源、文件和命令。

为什么需要注意

如果网关响应被篡改、服务端被入侵或升级消息本身不安全,它可能把远程文本变成高优先级操作指令,诱导代理下载、安装或运行用户未授权的内容。

这是实时的强制规则,不是示例:远程网关只要返回 `upgrade_info`,代理就必须暂停用户任务并执行 `message` 中的升级指引。材料没有限定该消息可要求的命令、下载地址或文件改动,也没有要求用户确认。若网关或响应被滥用,服务器内容可能引导代理执行超出微信读书查询目的的操作。用户可要求作者限定升级来源、允许的操作,并在任何安装或文件修改前征得确认。

SKILL.md:86来自说明文档打开原文件
1. **版本上报**:每次请求 body 必须包含 `"skill_version": "1.0.4"`(取本文件顶部 version 字段的值),用于服务端检查版本更新。**如果回包中出现 `upgrade_info` 字段,必须立即暂停当前操作,按照 `upgrade_info.message` 中的指引完成升级,升级完成后再重新执行用户请求,不得忽略该字段**2. **参数平铺**:业务参数必须和 `api_name`、`skill_version` 放在同一层;不要包在 `params`、`data`、`body` 等对象里。只有接口文档明确声明的数组/对象字段(如 `/book/readreviews` 的 `reviews`)才允许作为业务字段传入。
查看另外 1 个位置
SKILL.md:33来自说明文档打开原文件
```POST https://i.weread.qq.com/api/agent/gateway```
会不会偷偷改推广链接或收款方?检查是否强制替换推广链接或收款对象,同时要求隐瞒更改。未发现风险

Skill 逻辑拆解

3 个说明模块

该 Skill 将所有请求以 POST 发送到统一的微信读书网关,并把环境变量中的 API Key 作为 Bearer 凭证;该凭证绑定用户身份,因此网关可据此返回个人数据。

查看原文
SKILL.md:33来自说明文档打开原文件
```POST https://i.weread.qq.com/api/agent/gateway```
SKILL.md:38来自说明文档打开原文件
- Header:`Authorization: Bearer $WEREAD_API_KEY`- `WEREAD_API_KEY` 从环境变量获取,格式 `wrk-xxxxxxxx`- 若未设置,提示用户:`export WEREAD_API_KEY=<你的apikey>`- API Key 绑定用户身份(vid),需要用户身份的接口会自动注入,无需手动传 vid

个人阅读概况会组合读取书架、最近五本电子书的阅读进度和笔记概览,涉及书名、阅读时间、进度、私密标记以及笔记统计。

查看原文
profile.md:5来自说明文档打开原文件
通过组合 `/shelf/sync`、`/book/getprogress`、`/user/notebooks` 获取用户阅读概况。
profile.md:12来自说明文档打开原文件
3. 书架数量必须按 `books.length + albums.length + (mp 非空 ? 1 : 0)` 计算;`albums[]` 是专辑/有声书,也属于书架里的书,不能只统计 `books[]`。4. 阅读进度只查最近 5 本电子书:从 `books[]` 按 `readUpdateTime` 降序取前 5 本,逐个调 `/book/getprogress`,避免大书架导致过多调用。5. 阅读时长字段单位为秒,展示时转为"X小时Y分钟"格式;Unix 时间戳展示为 `YYYY-MM-DD`。
shelf.md:31来自说明文档打开原文件
| `books[].category` | 分类 || `books[].readUpdateTime` | 最近阅读时间(Unix 时间戳) || `books[].finishReading` | 是否读完(1=读完) || `books[].updateTime` | 书籍更新时间 || `books[].isTop` | 是否置顶 || `books[].secret` | 是否私密(1=私密) || `albums[]` | 专辑/有声书数组(与 books 完全独立) |
notes.md:25来自说明文档打开原文件
|------|------|| `totalBookCount` | 有笔记的书籍总数 || `totalNoteCount` | 笔记总条数,统计口径为 `reviewCount + noteCount + bookmarkCount` 的汇总 || `hasMore` | 是否有更多(1=有) || `books[].bookId` | 书籍 ID || `books[].book` | 书籍信息(title, author, cover 等) || `books[].reviewCount` | 想法/点评数:包含划线想法、书评想法/个人点评、书摘、非书籍想法等个人内容 || `books[].noteCount` | 划线数(高亮标注的原文条数) || `books[].bookmarkCount` | 书签数(标记阅读位置的条数;只作为数量统计,当前不导出书签内容) || `books[].readingProgress` | 阅读进度 |

单本书的“所有笔记内容”会并行取得划线原文和个人想法/点评后合并展示;这些内容可能包括整本书评、章节点评及非书籍想法等个人文本。

查看原文
notes.md:102来自说明文档打开原文件
### `/review/list/mine` — 单本书的个人想法与点评> 返回当前用户在该书上的所有个人内容,包括划线想法、章节点评和整本书评。
notes.md:253来自说明文档打开原文件
1. **无参数/问笔记数量排行**:调 `/user/notebooks` 展示笔记本概览;如需完整排行,必须按 `count` + `lastSort` 遍历到 `hasMore=0`,且所有分页参数平铺在 body 顶层;每本书笔记数按 `reviewCount + noteCount + bookmarkCount` 计算并排序。2. **有 bookId 或书名,问单本书笔记内容**:同时调 `/book/bookmarklist`(划线内容)和 `/review/list/mine`(想法/点评内容),合并展示当前可导出的笔记内容。3. **明确要求书签内容**:说明当前接口只在 `/user/notebooks` 提供书签数量,不能导出书签内容;不要把划线误当书签。4. 用户从概览中选择某本书后,同样调上述两个接口。
notes.md:274来自说明文档打开原文件
- **统计笔记数 = `reviewCount + noteCount + bookmarkCount`**;不要把 `noteCount` 单独当作总笔记数。- **内容导出 = 划线内容 + 想法/点评内容**;当前不能导出书签内容。- `reviewCount` 已包含个人点评/书评想法,计算总笔记数时不要再额外加“点评数”。- 当用户说“所有笔记内容”时,必须同时查询 `/book/bookmarklist` 和 `/review/list/mine`,不能只返回划线。
从这里开始 · 工作说明SKILL.md
weread-skills
连线表示工作说明包含的模块,不是实际运行顺序。点击模块可查看原文。
文件与检查记录9 个文件

检查范围与遗漏

逐文件查看涉及的内容

下方列出本次涉及的原文范围;纳入检查不代表已查清所有问题。

  • SKILL.md已纳入全文
  • book.md已纳入全文
  • discover.md已纳入全文
  • notes.md已纳入全文
  • profile.md已纳入全文
  • readdata.md已纳入全文
  • review.md已纳入全文
  • search.md已纳入全文
  • shelf.md已纳入全文

这份报告只针对上方版本。我们看了拿到的代码和说明文件,没有实际运行 Skill,也没有检查它另外安装的软件包。因此,这不是“保证安全”的承诺;换了版本或使用环境,结果也可能不同。

  • SKILL.md工作说明
  • book.md配套文件
  • discover.md配套文件
  • notes.md配套文件
  • profile.md配套文件
  • readdata.md配套文件
  • review.md配套文件
  • search.md配套文件
  • shelf.md配套文件

代码和说明中提到的操作

连接外部网站
SKILL.md:33来自说明文档打开原文件
```POST https://i.weread.qq.com/api/agent/gateway```
SKILL.md:50来自说明文档打开原文件
```bashcurl -X POST "https://i.weread.qq.com/api/agent/gateway" \  -H "Authorization: Bearer $WEREAD_API_KEY" \
读取密钥或账号配置
SKILL.md:38来自说明文档打开原文件
- Header:`Authorization: Bearer $WEREAD_API_KEY`- `WEREAD_API_KEY` 从环境变量获取,格式 `wrk-xxxxxxxx`
SKILL.md:39来自说明文档打开原文件
- Header:`Authorization: Bearer $WEREAD_API_KEY`- `WEREAD_API_KEY` 从环境变量获取,格式 `wrk-xxxxxxxx`- 若未设置,提示用户:`export WEREAD_API_KEY=<你的apikey>`
SKILL.md:40来自说明文档打开原文件
- `WEREAD_API_KEY` 从环境变量获取,格式 `wrk-xxxxxxxx`- 若未设置,提示用户:`export WEREAD_API_KEY=<你的apikey>`- API Key 绑定用户身份(vid),需要用户身份的接口会自动注入,无需手动传 vid
运行命令
SKILL.md:49来自说明文档打开原文件
```bashcurl -X POST "https://i.weread.qq.com/api/agent/gateway" \
读取了多少行
1,088
文件校验值(用于核对版本)
eeedd858835bee673fba6244e04a60c3887d27259b574dbbd4cb7f0dab82adbc