Skip to content
Report library
Purpose / Other

Wecomcli Todo Skill Security Audit

What the author says it does (original text)

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

Independent security check

Do not install or run it yet

Files checked
7
Risks found
5
Could it run dangerous commands?Looks for programs run straight after downloading, remote control of your computer, and hidden commands.Risks found: 1
High risk

Embedding user content in a single-quoted shell command can enable command injection

Source references: 3
What we found

The create command uses the shell template `--json '<JSON parameters>'`, while title and description are derived from the user's words. The source does not require argv-based execution, stdin, or safe escaping. If an agent substitutes the JSON directly, a single quote in user content can terminate the argument and expose following text to the shell.

Why this matters

A malicious or accidentally crafted todo could run additional commands and potentially access or alter files, credentials, or account data available to the agent.

What this evidence establishes

The documentation shows JSON inside single quotes and derives titles from user messages, but it does not include the executor or explain how the placeholder is passed. Directly interpolating user text containing a single quote into a shell string could enable command injection; an argument array or reliable escaping would prevent it. Users can ask the author to document parameter handling and restrict the agent from shell-concatenating user content.

This assessment concerns the code and conditions shown, not proof that harm has occurred.
references/todo-create.md:16In the instructionsOpen original file
```bashwecom-cli todo create --json '<JSON 参数>'```
Show 2 other places
references/todo-create.md:41In the instructionsOpen original file
调用本命令前,按以下规则从用户原话里提取参数。除非真的提不出,**不要**用追问让用户重新说一遍——他刚才已经把事情讲清楚了,再问一次是劣体验。
references/todo-create.md:45In the instructionsOpen original file
绝大多数情况下能从用户消息里提炼出标题。优先采用"动宾"结构,尽量保持用户的原始表达。当标题过长,非常细节的背景细节才放进 `description`。
Could it expose your files or keys?Looks for uploads of files containing passwords or keys, and keys written directly in the code.Risks found: 2
Medium risk

Merely saying a todo is “about someone” can automatically add that person as a participant

Source references: 3
What we found

The Skill treats phrases such as “related to someone” or “about someone” as grounds for assignment rather than requiring an explicit assignment request. The create payload contains the title, description, and assignee list together.

Why this matters

A person may be added to a corporate todo they were not meant to join, changing their account's task relationship and potentially exposing work information in the title or description.

Creation can add people to the assignee list, while the skill treats merely saying a task is “about” or “related to” someone as sufficient to add them. This could expose the task title, description, or association to that person and assign work without clear authorization. Users can restrict additions to explicit wording such as “assign/invite/share responsibility,” requiring confirmation otherwise.

references/todo-create.md:31In the instructionsOpen original file
|---|---|---|---|---|| `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` 单独传无效 |
Show 2 other places
references/todo-create.md:61In the instructionsOpen original file
当用户表述中暗示某人与待办有参与或关联关系(如"与某人相关的待办""关于某人""和某人一起跟进"),应将关联人加入 `follower_ids`。
references/todo-create.md:33In the instructionsOpen original file
| `description` | string | 否 | — | 详细描述(可选的展开说明,不是标题)|| `follower_ids` | string[] | 否 | `[]` | 分派人 userid 列表(前缀 `wo`),最多 50 人;用户给姓名时先通过 `wecomcli-contact` 技能查 `userid` || `deadline` | object | 否 | — | 截止时间。结构见 SKILL.md `deadline` 对象规范 |
Medium risk

Todo updates may import information from chats or memory without field-by-field confirmation

Source references: 3
What we found

When the user only asks to “make it clearer,” the Skill tells the agent to find participants, times, links, or reference numbers in the current conversation, todo details, and available chat or memory search results. If the agent considers the information certain, it updates directly.

Why this matters

Links, reference numbers, people, or dates from other conversations or memories may be persisted in a corporate todo. If the todo has participants, this can broaden visibility and can also preserve incorrectly matched context as a work record.

The update flow explicitly permits sourcing participants, times, links, and reference numbers from the conversation, task details, and available chat or memory retrieval, then updating whenever the model considers the data certain. This could place sensitive links, associations, or identifiers from another context into a corporate task without item-by-item confirmation. Users can require source restrictions and a preview plus approval before such data is written.

references/todo-update.md:3In the instructionsOpen original file
批量更新待办的标题、描述、分派人名单或截止时间。
Show 2 other places
references/todo-update.md:8In the instructionsOpen original file
```bashwecom-cli todo update --json '<JSON 参数>'```
references/todo-update.md:105In the instructionsOpen original file
- **避免冗余更新**:如果用户只是把待办**已经记录过的内容又复述了一遍**(例如标题已经等于用户这次说的内容),这是确认而不是修改,**不要发起 `update`**,直接回复"这条已经记好了"即可。尤其**不要把 `description` 更新成与 `title` 相同的内容**——description 只用于承载标题之外的补充信息,没有新增信息就不要写。- **补全信息先查上下文**:用户要求"写清楚点"、补充参与人/时间/链接/单号时,先从当前会话、待办详情和可用的聊天/记忆检索结果中找;能确定就更新,找不到或有歧义时再一次性向用户确认,避免直接让用户重发。- **仅改部分字段**:未传的字段保持原值;若要清空 `followers`,传空数组 `[]`;若要清空 `deadline`,传空对象 `{}`。**没有关闭提醒的入参**:`remind_at_deadline=false`/不传只是改成默认提前提醒,不会关闭提醒(详见「修改截止时间与提醒」)
Could it delete files or keep running?Looks for broad file deletion, disk overwrites, and programs set to start automatically.No risks found
Could it bypass safety checks?Looks for skipped website security checks, excessive file access, or actions that skip your approval.Risks found: 2
High risk

A common phrase such as “finished” can mark every participant complete without confirmation

Source references: 3
What we found

The Skill directly maps “完成了” to `finished_all: true`. The documentation also states that this value lets a creator mark every participant complete, rather than only completing the current user's portion.

Why this matters

A creator's ordinary statement that may describe only their own progress can overwrite other participants' real status, prematurely close work, and distort responsibility records.

The skill allows a creator to mark every participant complete with `finished_all=true`, and classifies the common phrase “完成了” as an explicit request for that action. A creator's ambiguous statement that may only mean their own work is done could therefore change other participants' status without confirmation. Users can ask that this value be used only when “all/every participant” is explicit, with confirmation otherwise.

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

Setting only a deadline can still trigger a backend-default reminder

Source references: 2
What we found

The Skill explicitly says that when a user supplies only a deadline, the reminder flag is omitted, but this means a backend-default early reminder—not disabled reminders. The create interface has no off setting.

Why this matters

A user may receive a WeCom notification without explicitly requesting one. On shared devices, for sensitive tasks, or outside working hours, this can cause disruption or reveal that the task exists.

The documentation explicitly says that setting only a deadline still uses the backend's default advance reminder, and the API has no “disable reminder” input. A user who only asked to record a due date may therefore receive an unrequested notification. Users can require the agent to disclose this effect before setting a deadline; if silence is essential, omit the deadline or verify available reminder controls in WeCom.

SKILL.md:52In the instructionsOpen original file
- **作为返回字段**:未设置截止时间的待办,`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`。
Show 1 other places
references/todo-create.md:66In the instructionsOpen original file
- `remind_at_deadline` 必须与 `deadline` 一起传,只用来选提醒时机("提前"还是"截止时");脱离 `deadline` 单独传无效。入参层面没有"关闭提醒"这一档,但是否真正提醒由后台判断,以返回的 `extra_info` 为准。- 用户只说**截止时间/到期时间**,或给出任务发生日期时,填写 `deadline`,不要传 `remind_at_deadline`(即按后台默认提前时间提醒)。- 用户明确要**提醒/到点提醒/截止时提醒/待办提醒**且给出具体时刻时,提醒时刻即 `deadline.type=datetime`,同时传 `remind_at_deadline=true`;只给日期时不传 `remind_at_deadline=true`。
Could it mislead the AI or hide text?Checks the skill instructions for requests to ignore you, influence the report, or hide text in invisible characters.No risks found
Could it change links or payment recipients without asking?Looks for forced referral or payment changes combined with instructions to hide the change.No risks found

Inside this skill

3 instruction sections

The Skill operates WeCom todos through the external `wecom-cli` binary and requires a shared prerequisite check that is not included in the supplied source. This review can therefore assess the instructions but cannot verify the CLI's actual permissions, authentication, or network behavior.

View source
SKILL.md:7In the instructionsOpen original file
  requires:    bins: ["wecom-cli"]---
SKILL.md:12In the instructionsOpen original file
> 执行任何 `wecom-cli` 命令前,必须先读取并完成 `wecomcli-shared` 技能的公共前置检查。

Deletion has different effects depending on ownership: a creator deletes the todo for all participants, while a non-creator only leaves it. The Skill instructs the agent to check the creator and to use deletion only when explicitly requested.

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

Query results can contain todo text, participants, creator, status, deadline, and source. For direct list requests, the Skill presents names and todo details to the user while instructing the agent not to expose internal todo IDs.

View source
references/todo-list.md:74In the instructionsOpen original file
|---|---|---|| `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:128In the instructionsOpen original file
  - 某分组无数据则整个分组省略- **标题**:`title`- **创建人**:`creator.user_name`,如果创建人是用户自己,则缺省- **参与人**:`followers[].user_name` 用 `、` 拼接;无参与人时缺省- **截止时间**:`deadline.value`;无截止时间时缺省
SKILL.md:76In the instructionsOpen original file
### 特别注意- 禁止将 `todo_id`(待办 ID)展示给用户。
Start here · InstructionsSKILL.md
wecomcli-todo
Lines connect the instruction file to its sections, not an observed execution order. Select a section to read the source.

File reference map

References: 9
Files making referencesReferenced content
Lines show actual file references, not execution order. Select a node to highlight its connections and inspect the files and source locations. Dashed lines include files that still need locating.
Files and check records7 files

Coverage and gaps

Content covered in each file

These are the source ranges included in this check, not a guarantee that every issue has been resolved.

  • SKILL.mdFull text included
  • references/todo-create.mdFull text included
  • references/todo-delete.mdFull text included
  • references/todo-finish.mdFull text included
  • references/todo-get.mdFull text included
  • references/todo-list.mdFull text included
  • references/todo-update.mdFull text included

This report is for the version above. We read the available code and instructions without running the skill or checking extra packages it installs. This is not a promise of safety: a different version or setup may behave differently.

  • SKILL.mdInstructions
  • references/todo-create.mdSupporting file
  • references/todo-delete.mdSupporting file
  • references/todo-finish.mdSupporting file
  • references/todo-get.mdSupporting file
  • references/todo-list.mdSupporting file
  • references/todo-update.mdSupporting file

Operations mentioned in code and instructions

Run commands
SKILL.md:25In the instructionsOpen original file
**[重要事项]** 执行任何操作前,必须先定位「接口路由表」指向的参考文档并完整读取,再执行命令,避免出现参数错误。严禁凭路由表描述或自身记忆猜测拼参数。
references/todo-create.md:15In the instructionsOpen original file
```bashwecom-cli todo create --json '<JSON 参数>'
references/todo-delete.md:10In the instructionsOpen original file
```bashwecom-cli todo delete --json '<JSON 参数>'
Lines read
666
File checksum (to compare versions)
1e55d010e37a3cdafac20a69082d9f36a7ec1609a6495c0baf4583166bf39704