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

Wecomcli Todo Skill 安全审计

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

管理企业微信待办,支持创建、删除或退出、完成、查询和筛选,以及修改标题、描述、参与人名单和截止时间。

第三方安全检查结论

先别安装或运行

已检查文件
7
发现的风险
5
会不会运行危险命令?检查是否下载程序后直接运行、让他人远程控制电脑,或藏起要运行的命令。发现 1 项风险
高风险

将用户内容嵌入单引号 Shell 命令可能造成命令注入

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

创建命令采用 `--json '<JSON 参数>'` 的 Shell 模板,而标题和描述从用户原话提取。材料没有要求使用参数数组、标准输入或安全转义。如果执行代理直接替换占位符,用户内容中的单引号可能结束参数并把后续文本交给 Shell。

为什么需要注意

恶意或偶然构造的待办文本可能导致运行额外命令,进而读取或修改代理可访问的文件、凭据或账户数据。

这段证据能说明什么

文档展示了单引号包裹 JSON 的 Bash 命令,并要求从用户消息提取标题,但没有提供实际执行代码或说明占位符如何传递。若实现把含单引号的用户文本直接拼接进 Shell 字符串,可能发生命令注入;若使用参数数组或可靠转义则不会。用户可要求作者说明参数传递方式,并限制代理避免通过 Shell 拼接用户内容。

这项判断针对展示的代码和适用条件,不表示风险已经实际发生。
references/todo-create.md:16来自说明文档打开原文件
```bashwecom-cli todo create --json '<JSON 参数>'```
查看另外 2 个位置
references/todo-create.md:41来自说明文档打开原文件
调用本命令前,按以下规则从用户原话里提取参数。除非真的提不出,**不要**用追问让用户重新说一遍——他刚才已经把事情讲清楚了,再问一次是劣体验。
references/todo-create.md:45来自说明文档打开原文件
绝大多数情况下能从用户消息里提炼出标题。优先采用"动宾"结构,尽量保持用户的原始表达。当标题过长,非常细节的背景细节才放进 `description`。
会不会泄露文件和密钥?检查是否发送含密码或密钥的文件,以及代码里是否直接写了密钥。发现 2 项风险
中风险

仅提到“关于某人”就可能自动把对方加入待办参与人

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

技能把“与某人相关”或“关于某人”等关联描述视为分派依据,而不是要求用户明确说要分派。创建参数同时包含标题、描述和分派人列表。

为什么需要注意

对方可能被加入本不应参与的企业待办,改变其账户中的任务关系,并可能让其接触到待办标题或描述中的工作信息。

创建参数可把人员加入分派名单,技能又规定“关于某人”等仅表示关联的说法也应触发加入。这可能向对方暴露待办标题、描述或关联关系,并让其收到任务,而用户未必授权分派。用户可限制为只有“分派给/邀请/共同负责”等明确措辞才添加人员,其他情况先确认。

references/todo-create.md:31来自说明文档打开原文件
|---|---|---|---|---|| `title` | string | 是 | — | 短标题,长度 >= 1 || `description` | string | 否 | — | 详细描述(可选的展开说明,不是标题)|| `follower_ids` | string[] | 否 | `[]` | 分派人 userid 列表(前缀 `wo`),最多 50 人;用户给姓名时先通过 `wecomcli-contact` 技能查 `userid` || `deadline` | object | 否 | — | 截止时间。结构见 SKILL.md `deadline` 对象规范 || `remind_at_deadline` | boolean | 否 | `false` | 提醒时机,须与 `deadline` 同传:`true`=截止时刻提醒(仅 `datetime`);`false`/不传=按后台默认提前时间提醒(**非关闭提醒**)。脱离 `deadline` 单独传无效 |
查看另外 2 个位置
references/todo-create.md:61来自说明文档打开原文件
当用户表述中暗示某人与待办有参与或关联关系(如"与某人相关的待办""关于某人""和某人一起跟进"),应将关联人加入 `follower_ids`。
references/todo-create.md:33来自说明文档打开原文件
| `description` | string | 否 | — | 详细描述(可选的展开说明,不是标题)|| `follower_ids` | string[] | 否 | `[]` | 分派人 userid 列表(前缀 `wo`),最多 50 人;用户给姓名时先通过 `wecomcli-contact` 技能查 `userid` || `deadline` | object | 否 | — | 截止时间。结构见 SKILL.md `deadline` 对象规范 |
中风险

更新待办时可从聊天或记忆检索结果中补入信息,无需逐项确认

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

当用户只要求“写清楚点”时,技能指示代理从当前会话、待办详情以及可用的聊天或记忆检索结果中寻找参与人、时间、链接或单号;只要代理认为能够确定,就直接更新。

为什么需要注意

其他对话或记忆中的链接、单号、人员和时间信息可能被持久写入企业待办。若目标待办有参与人,这会扩大信息的可见范围,并可能把错误上下文固化为工作记录。

更新流程明确允许从当前会话、待办详情及聊天/记忆检索结果中补充参与人、时间、链接或单号,并在模型认为“能确定”时直接更新。这可能把其他语境中的敏感链接、人员关系或标识写入企业待办,且没有逐项确认要求。用户可要求作者限定可用来源,并在写入聊天或记忆中的信息前展示变更内容并确认。

references/todo-update.md:3来自说明文档打开原文件
批量更新待办的标题、描述、分派人名单或截止时间。
查看另外 2 个位置
references/todo-update.md:8来自说明文档打开原文件
```bashwecom-cli todo update --json '<JSON 参数>'```
references/todo-update.md:105来自说明文档打开原文件
- **避免冗余更新**:如果用户只是把待办**已经记录过的内容又复述了一遍**(例如标题已经等于用户这次说的内容),这是确认而不是修改,**不要发起 `update`**,直接回复"这条已经记好了"即可。尤其**不要把 `description` 更新成与 `title` 相同的内容**——description 只用于承载标题之外的补充信息,没有新增信息就不要写。- **补全信息先查上下文**:用户要求"写清楚点"、补充参与人/时间/链接/单号时,先从当前会话、待办详情和可用的聊天/记忆检索结果中找;能确定就更新,找不到或有歧义时再一次性向用户确认,避免直接让用户重发。- **仅改部分字段**:未传的字段保持原值;若要清空 `followers`,传空数组 `[]`;若要清空 `deadline`,传空对象 `{}`。**没有关闭提醒的入参**:`remind_at_deadline=false`/不传只是改成默认提前提醒,不会关闭提醒(详见「修改截止时间与提醒」)
会不会删除文件或一直在后台运行?检查是否大范围删除文件、改写磁盘,或设置自动启动。未发现风险
会不会绕过安全保护?检查是否跳过网站安全验证、开放过多文件权限,或取消操作前的确认。发现 2 项风险
高风险

常见的“完成了”表述可未经确认将所有参与人的部分标记完成

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

技能把“完成了”直接解释为 `finished_all: true`。文档同时说明,该值允许创建者把所有参与人一并标记完成,而不是只完成当前用户自己的部分。

为什么需要注意

创建者一句可能仅描述自己进度的普通表达,就可能覆盖其他参与人的真实状态,造成错误的任务结案、遗漏工作或责任记录失真。

该技能明确允许创建者用 `finished_all=true` 完成所有参与人的部分,又把“完成了”等常见表述直接归入“全部完成”。因此,创建者说出可能仅表示自己完成的模糊话语时,其他参与人的状态可能未经确认被更改。用户可要求作者仅在明确提到“全部/所有参与人”时使用该值,否则先确认范围。

references/todo-finish.md:3来自说明文档打开原文件
将**当前用户**在该待办中的部分标记为"已完成"。如果当前用户同时是创建人,后台会返回 `ask_finish_all` 提示,可选择把所有参与人一并标记完成。
查看另外 2 个位置
references/todo-finish.md:24来自说明文档打开原文件
| `todo_id` | string | 是 | — | 待办 ID || `finished_all` | boolean | 否 | `false` | 创建人可设为 `true` 全部完成该待办。默认 `false` 仅完成自己的部分 |
references/todo-finish.md:63来自说明文档打开原文件
  - 用户明确表达"仅我完成自己的部分"("我这边搞完了"、"我自己的部分先完成"、"先把我那块标了")→ **显式**传 `finished_all: false`。显式 false 才能让后端跳过 `ask_finish_all` 兜底,避免再次询问完成范围。  - 用户明确表达"全部完成"("完成了"、"这条结掉"、"都搞完了"),或本会话此前对同一个 `todo_id` 已经调过一次 `finished_all=false`、用户现在又一次说要完成它 → 传 `finished_all: true`。  - 表达不明确(只说"完成 XX 待办"、"把那条待办完成了",没有"仅我"或"全部"的语气)→ 不传 `finished_all`,让后端按下方 `ask_finish_all` 流程返回是否需要确认。
低风险

仅设置截止时间也会采用后台默认提醒,而非静默截止

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

技能明确规定:用户只给截止时间时不传提醒参数,但这表示按后台默认提前时间提醒,并不表示关闭提醒。创建接口也没有关闭提醒的选项。

为什么需要注意

用户可能在未明确要求提醒时收到企业微信通知;对共享设备、敏感任务或非工作时段,这可能造成打扰或暴露任务存在。

文档明确说明仅设置截止时间、不传提醒参数时,后台仍按默认提前时间提醒,且没有关闭提醒的入参。因此用户只要求记录截止日期时也可能收到未明确请求的通知。用户可要求代理在设置截止时间前提示这一副作用;若必须静默,可不设置截止时间,或在企业微信中核查可用的提醒设置。

SKILL.md:52来自说明文档打开原文件
- **作为返回字段**:未设置截止时间的待办,`deadline` 字段不返回或为 `null`。- **提醒时机(`remind_at_deadline`)**:`remind_at_deadline` 与 `deadline` 是一对,必须一起出现——脱离 `deadline` 单独传 `remind_at_deadline` 不会生效,不要这么传。`remind_at_deadline` 只决定提醒**时机**,入参层面**没有"关闭提醒"这一档**(是否真正提醒由后台判断,可能因不满足条件而不提醒,以返回的 `extra_info` 为准):  - `remind_at_deadline=true`(仅 `deadline.type=datetime` 可传)→ 在**截止时刻**提醒。  - `remind_at_deadline=false` 或不传 → 按**后台默认的提前时间**提醒(**不是关闭提醒**)。  - `deadline.type=date` 或未传 `deadline` 时不要传 `true`。
查看另外 1 个位置
references/todo-create.md:66来自说明文档打开原文件
- `remind_at_deadline` 必须与 `deadline` 一起传,只用来选提醒时机("提前"还是"截止时");脱离 `deadline` 单独传无效。入参层面没有"关闭提醒"这一档,但是否真正提醒由后台判断,以返回的 `extra_info` 为准。- 用户只说**截止时间/到期时间**,或给出任务发生日期时,填写 `deadline`,不要传 `remind_at_deadline`(即按后台默认提前时间提醒)。- 用户明确要**提醒/到点提醒/截止时提醒/待办提醒**且给出具体时刻时,提醒时刻即 `deadline.type=datetime`,同时传 `remind_at_deadline=true`;只给日期时不传 `remind_at_deadline=true`。
会不会误导 AI 或隐藏内容?检查工作说明是否要求 AI 忽略你的指令、干扰检查结果,或夹带看不见的文字。未发现风险
会不会偷偷改推广链接或收款方?检查是否强制替换推广链接或收款对象,同时要求隐瞒更改。未发现风险

Skill 逻辑拆解

3 个说明模块

该技能通过外部 `wecom-cli` 操作企业微信待办,并要求先执行另一个未包含在本次材料中的公共前置检查;因此,本次审查只能评估指令,无法核验 CLI 或前置检查的实际权限、认证和网络行为。

查看原文
SKILL.md:7来自说明文档打开原文件
  requires:    bins: ["wecom-cli"]---
SKILL.md:12来自说明文档打开原文件
> 执行任何 `wecom-cli` 命令前,必须先读取并完成 `wecomcli-shared` 技能的公共前置检查。

删除命令对创建者和参与者有不同效果:创建者会删除所有参与人可见的整条待办,非创建者只会退出。技能要求先核对创建者,并且仅在用户明确要求删除时使用该接口。

查看原文
references/todo-delete.md:5来自说明文档打开原文件
- **当前用户是创建人**:删除整条待办,其他参与人也不再继续看到/处理这条待办。- **当前用户不是创建人**:允许调用同一个 `delete` 接口,表现为**当前用户退出待办 / 从自己的待办中移除**,不是删除整条待办,也不会影响其他参与人。
references/todo-delete.md:58来自说明文档打开原文件
- 用户说某待办"已完成"时,默认是完成操作,不等于删除;只有用户明确说删除,才调用本接口删除。- **非创建人也可以删除,语义是退出待办**:不要因为 `creator.userid` 不是当前用户就拒绝,也不要回复"创建人之外无权删除"之类的话术。调用 `delete` 前仍应核对创建人,但目的只是理解本次操作语义和做幂等判断:

查询结果可包含待办正文、参与人、创建人、状态、截止时间和来源。直接查询列表时,技能会向用户展示人名和待办内容,但规定不展示内部待办 ID。

查看原文
references/todo-list.md:74来自说明文档打开原文件
|---|---|---|| `todo_id` | string | 待办 ID(前缀 `td`) || `title` | string | 待办标题 || `description` | string | 详细描述 || `status` | string | 待办整体状态:`finished` / `proceed` || `user_status` | string | 当前用户在该待办的状态:`accept` / `reject` / `finished` / `removed` / `notshow` || `creator` | object | 创建人,含 `userid`(前缀 `wo`) / `user_name`(格式 `英文名(中文名)`) || `followers` | array | 分派人列表,每项含 `userid`(前缀 `wo`) / `user_name` / `user_status` / `update_time` || `deadline` | object | 截止时间;结构见 SKILL.md `deadline` 对象规范。无截止时间时不返回或为 `null` || `extra_info` | string | 提醒时刻只读信息,可能不提醒 || `source` | string | 待办来源:`single_chat`(单聊)/ `group_chat`(群聊)/ `doc`(文档)/ `ai_summary`(智能总结)/ `meeting_summary`(会议纪要)/ `face_chat`(「面聊」功能)/ `fused_doc`(融合文档)/ `smart_sheet`(智能表格)/ `smart_doc`(智能文档)/ `JSAPI`(JSAPI) || `create_time` | string | 创建时间,格式 `YYYY-MM-DD HH:mm:ss` |
references/todo-list.md:128来自说明文档打开原文件
  - 某分组无数据则整个分组省略- **标题**:`title`- **创建人**:`creator.user_name`,如果创建人是用户自己,则缺省- **参与人**:`followers[].user_name` 用 `、` 拼接;无参与人时缺省- **截止时间**:`deadline.value`;无截止时间时缺省
SKILL.md:76来自说明文档打开原文件
### 特别注意- 禁止将 `todo_id`(待办 ID)展示给用户。
从这里开始 · 工作说明SKILL.md
wecomcli-todo
连线表示工作说明包含的模块,不是实际运行顺序。点击模块可查看原文。

文件引用关系图

9 处引用
哪些文件发起引用引用了什么
连线表示真实的文件引用,不是运行顺序。点击节点可高亮相关连线,并查看具体文件和原文位置。虚线表示还有文件需要定位。
文件与检查记录7 个文件

检查范围与遗漏

逐文件查看涉及的内容

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

  • SKILL.md已纳入全文
  • references/todo-create.md已纳入全文
  • references/todo-delete.md已纳入全文
  • references/todo-finish.md已纳入全文
  • references/todo-get.md已纳入全文
  • references/todo-list.md已纳入全文
  • references/todo-update.md已纳入全文

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

  • SKILL.md工作说明
  • references/todo-create.md配套文件
  • references/todo-delete.md配套文件
  • references/todo-finish.md配套文件
  • references/todo-get.md配套文件
  • references/todo-list.md配套文件
  • references/todo-update.md配套文件

代码和说明中提到的操作

运行命令
SKILL.md:25来自说明文档打开原文件
**[重要事项]** 执行任何操作前,必须先定位「接口路由表」指向的参考文档并完整读取,再执行命令,避免出现参数错误。严禁凭路由表描述或自身记忆猜测拼参数。
references/todo-create.md:15来自说明文档打开原文件
```bashwecom-cli todo create --json '<JSON 参数>'
references/todo-delete.md:10来自说明文档打开原文件
```bashwecom-cli todo delete --json '<JSON 参数>'
读取了多少行
666
文件校验值(用于核对版本)
1e55d010e37a3cdafac20a69082d9f36a7ec1609a6495c0baf4583166bf39704