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

Wecomcli Contact Skill 安全审计

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

使用 wecom-cli 按姓名、拼音、英文名或别名搜索企业微信通讯录中的人员,并查询匹配人员的 userid、部门和职务。适用于查找联系人、区分同名人员、获取用户 userid,以及列出全部同名人员。

第三方安全检查结论

发现安全风险

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

若关键词被直接拼入示例 shell 命令,单引号可突破 JSON 参数边界

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

命令模板用 shell 单引号包裹 JSON,而关键词来自用户输入。材料没有规定使用参数数组或可靠的 JSON/shell 转义。若执行代理直接替换占位符,含单引号和 shell 运算符的关键词可能结束引号并被 shell 解释。

为什么需要注意

恶意或意外构造的搜索词可能导致额外本机命令以代理当前权限执行,从而读取或修改其可访问的文件和凭据。该结果取决于实际命令构造方式,并非仅凭模板即可断定会发生。

这段证据能说明什么

可见命令只是用单引号包住占位文本 `<JSON 参数>`,并未展示把用户关键词直接拼接进 shell 命令的实现。若执行器确实用未经转义的字符串替换该占位符,关键词中的单引号可能造成 shell 注入;但材料也可能由安全的 JSON 序列化和参数化进程调用来执行。缺少脚本或构造命令的代码,无法确认该风险。用户可要求作者证明参数通过结构化 argv 传递,并对 JSON 和 shell 边界进行安全编码。

这项判断针对展示的代码和适用条件,不表示风险已经实际发生。
SKILL.md:22来自说明文档打开原文件
```bashwecom-cli contact users search --json '<JSON 参数>'```
查看另外 1 个位置
SKILL.md:29来自说明文档打开原文件
|---|---|---|---|---|| `keywords` | string[] | 是 | — | 搜索关键词列表,可按姓名(用户名)/ 拼音 / 英文名 / 别名匹配,最多 10 个;多个关键词之间是 OR 关系 || `search_mode` | string | 否 | — | 搜索模式,默认不传该参数;仅当需要拿到完整人员名单时,才显式传 `"list"` |
会不会泄露文件和密钥?检查是否发送含密码或密钥的文件,以及代码里是否直接写了密钥。发现 1 项风险
中风险

搜索结果可能向请求者披露企业通讯录中的个人和组织信息

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

接口结果包含唯一 userid、姓名、邮箱、职务和部门路径;完整名单模式还可枚举所有同名命中。技能只要求用户明确提出“完整名单”,未显示要求核验请求者是否有权查看这些资料或限制输出字段。

为什么需要注意

若底层账号权限较高,未经授权的请求者可能获得员工联系方式、组织归属、职务以及可用于其他企业微信操作的唯一标识。批量同名查询会扩大披露范围。

该技能会查询并返回企业通讯录中的唯一 userid、姓名、邮箱、职务和部门路径;当用户明确要求完整名单时,还会启用全量命中模式。可见规则没有说明如何核验请求者对这些个人及组织信息的访问权限;仅提到必须先完成另一个技能的前置检查,但该技能内容未提供。因此,在底层账号权限较宽或回复直接展示这些字段时,可能向请求者披露敏感通讯录信息。用户可要求作者说明共享前置检查是否包含身份、权限和最小字段输出控制。

SKILL.md:33来自说明文档打开原文件
- 默认(不传 `search_mode`):返回最相关的候选结果,用于常规按名 / 拼音等查单个人的场景,绝大多数场景走此分支。- 传 `search_mode = "list"`:返回全量命中列表。仅当用户明确要"完整名单"时才传,典型话术如"一共有几个张三 / 所有叫李四的人 / 列出全部同名 / 全部同名人员"等清点、穷举意图;此时不受"前 5 位"展示上限约束。
查看另外 2 个位置
SKILL.md:40来自说明文档打开原文件
| `users` | array | 命中的用户列表 || `users[].userid` | string | 用户唯一标识 || `users[].name` | string | 中文姓名 || `users[].alias` | string | 英文名 / 别名(可能为空) || `users[].email` | string | 邮箱(可能为空) || `users[].position` | string | 管理职务(如"负责人"),**不是**"职位"(可能为空) || `users[].matched_keywords` | string[] | 本条 user 命中的请求关键词|| `users[].departments` | string[] | 所在部门路径列表(从大到小),主部门靠前 || `hint` | string | 结果限制提示(可能为空):当某个关键词的命中结果因限制未完整返回时,接口会在此字段给出说明 |
SKILL.md:11来自说明文档打开原文件
> 执行任何 `wecom-cli` 命令前,必须先读取并完成 `wecomcli-shared` 技能的公共前置检查。
会不会删除文件或一直在后台运行?检查是否大范围删除文件、改写磁盘,或设置自动启动。未发现风险
会不会绕过安全保护?检查是否跳过网站安全验证、开放过多文件权限,或取消操作前的确认。未发现风险
会不会误导 AI 或隐藏内容?检查工作说明是否要求 AI 忽略你的指令、干扰检查结果,或夹带看不见的文字。未发现风险
会不会偷偷改推广链接或收款方?检查是否强制替换推广链接或收款对象,同时要求隐瞒更改。未发现风险

Skill 逻辑拆解

2 个说明模块

该技能调用本机已有的 `wecom-cli`,把关键词作为 JSON 参数提交给企业微信联系人搜索接口。

查看原文
SKILL.md:6来自说明文档打开原文件
  requires:    bins: ["wecom-cli"]---
SKILL.md:22来自说明文档打开原文件
```bashwecom-cli contact users search --json '<JSON 参数>'```
SKILL.md:29来自说明文档打开原文件
|---|---|---|---|---|| `keywords` | string[] | 是 | — | 搜索关键词列表,可按姓名(用户名)/ 拼音 / 英文名 / 别名匹配,最多 10 个;多个关键词之间是 OR 关系 || `search_mode` | string | 否 | — | 搜索模式,默认不传该参数;仅当需要拿到完整人员名单时,才显式传 `"list"` |

默认搜索返回最相关候选;用户明确要求完整名单时,技能会启用 `list` 模式并返回全部命中,不受五人展示上限限制。

查看原文
SKILL.md:32来自说明文档打开原文件
- 默认(不传 `search_mode`):返回最相关的候选结果,用于常规按名 / 拼音等查单个人的场景,绝大多数场景走此分支。- 传 `search_mode = "list"`:返回全量命中列表。仅当用户明确要"完整名单"时才传,典型话术如"一共有几个张三 / 所有叫李四的人 / 列出全部同名 / 全部同名人员"等清点、穷举意图;此时不受"前 5 位"展示上限约束。

在执行任何命令前,该技能要求读取并完成另一个名为 `wecomcli-shared` 的技能;其内容未包含在所提供材料中,因此本次审计无法核实该前置步骤会要求哪些权限、网络操作或凭据处理。

查看原文
SKILL.md:11来自说明文档打开原文件
> 执行任何 `wecom-cli` 命令前,必须先读取并完成 `wecomcli-shared` 技能的公共前置检查。
从这里开始 · 工作说明SKILL.md
wecomcli-contact
连线表示工作说明包含的模块,不是实际运行顺序。点击模块可查看原文。
文件与检查记录1 个文件

检查范围与遗漏

逐文件查看涉及的内容

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

  • SKILL.md已纳入全文

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

  • SKILL.md工作说明

代码和说明中提到的操作

运行命令
SKILL.md:21来自说明文档打开原文件
```bashwecom-cli contact users search --json '<JSON 参数>'
读取了多少行
59
文件校验值(用于核对版本)
94ca5e35439af192529299d744869e9b9fddd3f1f37f1d86325ec16c8f7e7703