跳转到正文
报告库
用途分类 / 文档处理

Lark Wiki Skill 安全审计

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

飞书知识库:管理知识空间、空间成员和文档节点。创建和查询知识空间、查看和管理空间成员、管理节点层级结构、在知识库中组织文档和快捷方式。当用户需要在知识库中查找或创建文档、浏览知识空间结构、查看或管理空间成员、移动或复制节点时使用。当用户给出 doubao.com 的 /wiki/ URL/token 时,也应直接使用本 skill,不要因为域名不是飞书而回退到 WebFetch;路由依据是 URL 路径模式和 token,而不是域名。不负责:上传文件到知识库节点下(走 lark-drive)、编辑文档/表格/Base 内容(走 lark-doc / lark-sheets / lark-base)。

第三方安全检查结论

先别安装或运行

已检查文件
14
发现的风险
4
会不会运行危险命令?检查是否下载程序后直接运行、让他人远程控制电脑,或藏起要运行的命令。未发现风险
会不会泄露文件和密钥?检查是否发送含密码或密钥的文件,以及代码里是否直接写了密钥。未发现风险
会不会删除文件或一直在后台运行?检查是否大范围删除文件、改写磁盘,或设置自动启动。发现 2 项风险
高风险

删除节点默认会连带删除整个子树

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

`+node-delete` 的 `--include-children` 默认值为 `true`。虽然命令要求 `--yes`,但现有说明没有要求在确认前列出后代节点或单独确认级联范围。因此,“删除这个页面”可能被执行为删除页面及其所有子页面。

为什么需要注意

父节点下的文档结构和内容可能被不可逆地一起删除,影响范围远大于用户看到的单个节点。

该风险由实际命令语义支持:节点删除不可逆,且 `--include-children` 默认为 `true`,所以在用户只确认删除当前页面、却未明确理解级联范围时,可能同时删除整个子树。`--yes` 能阻止未经确认的请求,但现有文字只要求确认高风险操作,没有要求先展示或单独确认后代节点。用户可要求作者在默认级联删除前列出子节点,并对 `include_children=true` 单独确认。

references/lark-wiki-node-delete.md:3来自说明文档打开原文件
Delete a wiki node (or pull a cloud doc out of Wiki). OpenAPI: `DELETE /open-apis/wiki/v2/spaces/:space_id/nodes/:node_token`.> ⚠️ **High-risk write & irreversible** — deletes the node and (by default) its whole subtree. Requires explicit `--yes`; without it the CLI returns a `confirmation_required` error and nothing is deleted.
查看另外 1 个位置
references/lark-wiki-node-delete.md:29来自说明文档打开原文件
|------|------|----------|---------|-------------|| `--node-token` | string | **Yes** | — | `node_token`, cloud-doc `obj_token`, or a Lark URL embedding one; URL paths also imply `--obj-type` || `--obj-type` | enum | Conditional | — | Required for a raw token (URL inputs auto-infer). `wiki` = the token is a `node_token`; otherwise the cloud-doc type || `--space-id` | string | No | — | Auto-resolved via `get_node` when omitted (extra lookup; pass it to skip) || `--include-children` | bool | No | `true` | Cascade-delete the subtree (default). `--include-children=false` lifts direct children up to the parent || `--yes` | bool | Yes (real delete) | — | Confirm the high-risk operation. Without it the CLI returns `confirmation_required` || `--as` | enum | No | `auto` | Identity `user`/`bot`; wiki is user-centric → pass `--as user` |
中风险

按名称删除知识空间时会在首个精确命中后停止,可能隐藏后续同名空间

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

名称解析在累计到一个精确匹配后就停止翻页,文档承认这可能漏掉后页的同名空间。虽然用户必须选择 `space_id`,但若候选列表不完整,用户可能误以为唯一显示的空间就是目标。

为什么需要注意

用户可能确认错误的 `space_id`,随后整个空间及其所有节点被不可逆删除。

文档明确承认:找到首个累计精确匹配后即停止翻页,因此可能遗漏后页同名空间。删除前强制展示候选并由用户明确选择 `space_id`,显著降低自动误删风险,但确认只能基于已展示的不完整集合,用户仍可能误判其唯一性。用户可要求名称删除解析完整翻页,或明确标注“候选可能不完整”并提供继续搜索选项。

references/lark-wiki-delete-space.md:143来自说明文档打开原文件
#### 翻页与匹配策略**边翻边匹配**:每拿一页就在已累计的 items 上对 `name` 做精确匹配(区分大小写、保留空格),满足任一条件即停止翻页:- (A) **累计精确匹配 ≥ 1 条** → 停止翻页,已找到目标- (B) **`has_more=false`**(已翻完所有页)→ 停止翻页结束后:1. 如果累计精确匹配 ≥ 1:把**所有**精确匹配作为候选列给用户2. 如果精确匹配 = 0(此时必然已走到 `has_more=false`,已收集全量 items):在全量 items 上做**宽松匹配**(`name` trim 空格 + 大小写不敏感 + 子串包含),作为候选3. 宽松匹配也 0 条:停下来问用户是不是名字拼错、或者调用方没权限看到这个空间;**不要**自己改名字重试> 不做更激进的归一化(比如去括号、去版本号尾缀),那些容易把 "客户台账(归档)" 误命中到 "客户台账"。#### 早停的小边界早停(条件 A)意味着**可能漏掉**位于更后面页的同名空间。这种重名 corner case 由下面的"用户确认"兜底:LLM 展示候选时应照抄 `name + space_id`,用户如果觉得不是自己想删的那一个,可以要求继续翻页。
查看另外 2 个位置
references/lark-wiki-delete-space.md:193来自说明文档打开原文件
> [!IMPORTANT]> 删库不可逆。关键不变量:**发给服务端的 `--space-id` 必须是用户在上一轮对话里明确指认过的那一个**,不是 LLM 单方面"从匹配结果自动选"。## 风险等级- Risk:**`high-risk-write`**- 框架会强制要求 `--yes` 确认;不传 `--yes` 时命令会直接返回 `unsafe_operation_blocked` 错误,不会真的发请求> [!CAUTION]> `wiki +delete-space` 是**不可逆的写入操作**。执行前务必与用户再次确认 `--space-id`,并清楚该空间下的所有节点都会一并被删除。
references/lark-wiki-delete-space.md:162来自说明文档打开原文件
#### 确认流程(硬约束)**无论精确还是模糊,无论命中 1 条还是多条,发起删除前都必须先把候选列给用户**,由用户明确回选一个 `space_id`。不要因为"只命中一条"就跳过确认直接删。列候选时至少包含以下字段,方便用户分辨:- `name`(原始值,不做归一化)- `space_id`- `space_type`(`team` / `person` 等)- `description`(若有)- `visibility`(若有)
会不会绕过安全保护?检查是否跳过网站安全验证、开放过多文件权限,或取消操作前的确认。发现 2 项风险
中风险

bot 创建节点时会额外向当前 CLI 用户授予可管理权限

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

当使用 bot 身份创建节点时,CLI 会自动尝试给“当前 CLI 用户”授予 `full_access`。这是创建节点之外的权限变更,说明中没有要求用户单独批准,也没有显示用哪个 `open_id`。

为什么需要注意

本地认证对应的人可能获得该节点的管理权限,即使用户只授权了 bot 创建节点;选错本地账号时还可能把控制权扩展给意外人员。

这是创建之外的主动权限变更:仅在 `--as bot` 创建成功后,CLI 会尝试把当前 CLI 用户提升为该节点的 `full_access`,而所示流程没有单独确认或在执行前展示目标 `open_id`。影响限于当前 CLI 用户和新建节点;缺少用户 ID 时会跳过,失败也会报告,且明确禁止自动转移 owner。用户可要求作者披露目标账户并将自动授权改为显式选择。

references/lark-wiki-node-create.md:61来自说明文档打开原文件
> [!IMPORTANT]> 如果节点是**以应用身份(bot)创建**的,如 `lark-cli wiki +node-create --as bot`,在创建成功后 CLI 会**尝试为当前 CLI 用户自动授予该知识库节点的 `full_access`(可管理权限)**。>> 以应用身份创建时,结果里会额外返回 `permission_grant` 字段,明确说明授权结果:> - `status = granted`:当前 CLI 用户已获得该知识库节点的可管理权限> - `status = skipped`:本地没有可用的当前用户 `open_id`,因此不会自动授权;可提示用户先完成 `lark-cli auth login`,再让 AI / agent 继续使用应用身份(bot)授予当前用户权限> - `status = failed`:节点已创建成功,但自动授权用户失败;会带上失败原因,并提示稍后重试或继续使用 bot 身份处理该节点>> `permission_grant.perm = full_access` 表示该资源已授予“可管理权限”>
查看另外 1 个位置
references/lark-wiki-node-create.md:59来自说明文档打开原文件
- `title`:节点标题- `permission_grant`(可选):仅 `--as bot` 时返回,说明是否已自动为当前 CLI 用户授予可管理权限> [!IMPORTANT]> 如果节点是**以应用身份(bot)创建**的,如 `lark-cli wiki +node-create --as bot`,在创建成功后 CLI 会**尝试为当前 CLI 用户自动授予该知识库节点的 `full_access`(可管理权限)**。>> 以应用身份创建时,结果里会额外返回 `permission_grant` 字段,明确说明授权结果:> - `status = granted`:当前 CLI 用户已获得该知识库节点的可管理权限> - `status = skipped`:本地没有可用的当前用户 `open_id`,因此不会自动授权;可提示用户先完成 `lark-cli auth login`,再让 AI / agent 继续使用应用身份(bot)授予当前用户权限> - `status = failed`:节点已创建成功,但自动授权用户失败;会带上失败原因,并提示稍后重试或继续使用 bot 身份处理该节点>> `permission_grant.perm = full_access` 表示该资源已授予“可管理权限”>> **不要擅自执行 owner 转移。** 如果用户需要把 owner 转给自己,必须单独确认。
中风险

成员或管理员权限可在没有确认门槛的情况下直接授予或撤销

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

成员添加和移除都被标记为危险 API,但均没有 `--yes` 门槛;添加还允许 `admin`,代表完整空间管理权。说明要求解析成员 ID,却没有要求把解析出的空间、身份、成员和角色展示给用户确认。

为什么需要注意

名称解析错误、账号选错或角色误判可能把整个空间的管理权给错人,或立即撤销合法成员/管理员的访问。

添加和移除成员都是实际的账户权限修改,文档明确说明危险 API 没有 `--yes` 门槛;添加时还能授予具有完整空间管理能力的 `admin`。虽然主说明要求先解析目标类型和 ID,移除也要求匹配原始授权,但所示规则没有要求执行前向用户展示并确认空间、调用身份、成员和角色。用户可限制为 dry-run,并要求每次授权、撤销或角色切换前进行完整目标确认。

references/lark-wiki-member-add.md:33来自说明文档打开原文件
| Flag | Type | Required | Default | Description ||------|------|----------|---------|-------------|| `--space-id` | string | **Yes** | — | Wiki space ID; use `my_library` for the personal document library (user only) || `--member-id` | string | **Yes** | — | Member ID; interpretation is decided by `--member-type` || `--member-type` | enum | **Yes** | — | `openchat` / `userid` / `email` / `opendepartmentid` / `openid` / `unionid` / `appid` || `--member-role` | enum | **Yes** | — | `admin` (full space administration) / `member` (collaborator) || `--need-notification` | bool | No | unset | Send an in-app notification after the grant. **Omitting the flag sends no `need_notification` query at all** — passing `--need-notification=false` is the explicit opt-out || `--as` | enum | No | `auto` | Identity `user`/`bot`; wiki is user-centric → pass `--as user` |
查看另外 4 个位置
references/lark-wiki-member-remove.md:3来自说明文档打开原文件
Remove a member from a wiki space. OpenAPI: `DELETE /open-apis/wiki/v2/spaces/:space_id/members/:member_id`. Unlike most DELETEs, this endpoint **requires a body** carrying `member_type` and `member_role` — the `:member_id` path segment alone is ambiguous without both.> The underlying `members.delete` API is flagged `danger: true` in the schema browser, but the operation is recoverable — call [`+member-add`](lark-wiki-member-add.md) with the same `(member_id, member_type, member_role)` to restore. No `--yes` gate.
SKILL.md:72来自说明文档打开原文件
- 调用 `lark-cli wiki +member-add` 前,先把自然语言里的“人 / 群 / 部门 / 应用”解析成正确的 `--member-id`,不要猜格式。- 用户场景默认优先 `--member-type=openid`:用 `lark-cli contact +search-user --query "<姓名/邮箱/手机号>" --format json` 获取 `open_id`。- 群组场景使用 `--member-type=openchat`:用 `lark-cli im +chat-search --query "<群名关键词>" --format json` 获取 `chat_id`。- 应用场景使用 `--member-type=appid`:`--member-id` 传应用 ID,格式通常为 `cli_xxx`。- `userid` / `unionid` 只在下游明确要求时才使用;先拿到 `open_id`,再调用 `lark-cli api GET /open-apis/contact/v3/users/<open_id> --params '{"user_id_type":"open_id"}' --format json` 读取 `user_id` / `union_id`。- 部门场景使用 `--member-type=opendepartmentid`:当前 CLI 没有 shortcut,需调用 `lark-cli api POST /open-apis/contact/v3/departments/search --as user --params '{"department_id_type":"open_department_id"}' --data '{"query":"<部门名>"}'` 获取 `open_department_id`。- 只有在目标类型和身份都已确认可行后,才调用 `lark-cli wiki +member-add`。对于部门场景,这意味着必须是 `--as user`。
references/lark-wiki-member-add.md:3来自说明文档打开原文件
Add a member to a wiki space. OpenAPI: `POST /open-apis/wiki/v2/spaces/:space_id/members`. Shortcut over the raw `wiki members create` — adds enum hints, optional `--need-notification`, `my_library` resolution, and a flattened single-member output envelope.> The underlying `members.create` API is flagged `danger: true` in the schema browser, but adding a member is **not** confirmation-gated (no `--yes`). To revert, call [`+member-remove`](lark-wiki-member-remove.md) with the same `(member_id, member_type, member_role)` tuple.
references/lark-wiki-member-add.md:35来自说明文档打开原文件
|------|------|----------|---------|-------------|| `--space-id` | string | **Yes** | — | Wiki space ID; use `my_library` for the personal document library (user only) || `--member-id` | string | **Yes** | — | Member ID; interpretation is decided by `--member-type` || `--member-type` | enum | **Yes** | — | `openchat` / `userid` / `email` / `opendepartmentid` / `openid` / `unionid` / `appid` || `--member-role` | enum | **Yes** | — | `admin` (full space administration) / `member` (collaborator) || `--need-notification` | bool | No | unset | Send an in-app notification after the grant. **Omitting the flag sends no `need_notification` query at all** — passing `--need-notification=false` is the explicit opt-out || `--as` | enum | No | `auto` | Identity `user`/`bot`; wiki is user-centric → pass `--as user` |
会不会误导 AI 或隐藏内容?检查工作说明是否要求 AI 忽略你的指令、干扰检查结果,或夹带看不见的文字。未发现风险
会不会偷偷改推广链接或收款方?检查是否强制替换推广链接或收款对象,同时要求隐瞒更改。未发现风险

Skill 逻辑拆解

7 个说明模块

该 Skill 通过已安装的 `lark-cli` 调用飞书 Wiki API,使用用户或 bot 身份查询、创建、移动、复制和删除知识空间/节点,并管理空间成员;这些操作会作用于真实云端资源。

查看原文
SKILL.md:4来自说明文档打开原文件
version: 1.0.3description: "飞书知识库:管理知识空间、空间成员和文档节点。创建和查询知识空间、查看和管理空间成员、管理节点层级结构、在知识库中组织文档和快捷方式。当用户需要在知识库中查找或创建文档、浏览知识空间结构、查看或管理空间成员、移动或复制节点时使用。当用户给出 doubao.com 的 /wiki/ URL/token 时,也应直接使用本 skill,不要因为域名不是飞书而回退到 WebFetch;路由依据是 URL 路径模式和 token,而不是域名。不负责:上传文件到知识库节点下(走 lark-drive)、编辑文档/表格/Base 内容(走 lark-doc / lark-sheets / lark-base)。"metadata:  requires:    bins: ["lark-cli"]  cliHelp: "lark-cli wiki --help"---
SKILL.md:89来自说明文档打开原文件
```bashlark-cli schema wiki.<resource>.<method>   # 调用原生 API 前必须先查看 --data / --params 参数结构,不要猜测字段格式lark-cli wiki <resource> <method> [flags]  # 调用 API```

Skill 默认偏向用户身份,因为省略 `--as` 可能被解析为 bot;这会决定可见资源、个人知识库以及写操作作用于哪个账户视角。

查看原文
SKILL.md:21来自说明文档打开原文件
## 身份选择:优先使用 user 身份知识空间和节点都是用户的个人资源,**策略上应优先显式使用 `--as user`**(CLI 的 `--as` 默认值为 `auto`,不带 `--as` 时常被解析成 `bot`,列出的是应用所属空间而非用户的)。仅当用户明确要求“应用 / bot 视角”时才用 `--as bot`(仍受上面的成员管理硬限制约束)。

Skill 包含不可逆删除、权限授予/撤销以及改变文档位置和权限继承的写操作。空间删除和节点删除有 `--yes` 门槛;成员变更没有该门槛。

查看原文
references/lark-wiki-delete-space.md:5来自说明文档打开原文件
删除一个飞书知识空间(知识库)。OpenAPI 对应 `DELETE /open-apis/wiki/v2/spaces/:space_id`。- **不可逆**:该操作会将知识空间连同其下所有节点彻底删除,执行前必须反复确认- **同步 / 异步两种返回**:
references/lark-wiki-member-add.md:3来自说明文档打开原文件
Add a member to a wiki space. OpenAPI: `POST /open-apis/wiki/v2/spaces/:space_id/members`. Shortcut over the raw `wiki members create` — adds enum hints, optional `--need-notification`, `my_library` resolution, and a flattened single-member output envelope.> The underlying `members.create` API is flagged `danger: true` in the schema browser, but adding a member is **not** confirmation-gated (no `--yes`). To revert, call [`+member-remove`](lark-wiki-member-remove.md) with the same `(member_id, member_type, member_role)` tuple.
references/lark-wiki-move-to-drive.md:109来自说明文档打开原文件
- CLI 写操作预检查使用 `space:document:move`,任务轮询使用 `wiki:space:read`。- 调用方必须能移动源 Wiki 节点并写入目标 Drive 文件夹。- 成功后源节点会从 Wiki 树中消失,目标文档改用 Drive 目标位置的权限模型;原 Wiki 层级继承权限不再保留。- 省略 `--folder-token` 时,“根目录”属于当前 `--as` 身份,user 与 bot 的可见资源范围可能不同。> [!CAUTION]> 这是会改变文档归属和权限继承的**写入操作**。执行前必须确认源 Wiki 节点、目标 Drive 位置和调用身份。
从这里开始 · 工作说明SKILL.md
lark-wiki
连线表示工作说明包含的模块,不是实际运行顺序。点击模块可查看原文。

文件引用关系图

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

检查范围与遗漏

逐文件查看涉及的内容

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

  • SKILL.md已纳入全文
  • references/lark-wiki-delete-space.md已纳入全文
  • references/lark-wiki-member-add.md已纳入全文
  • references/lark-wiki-member-list.md已纳入全文
  • references/lark-wiki-member-remove.md已纳入全文
  • references/lark-wiki-move-to-drive.md已纳入全文
  • references/lark-wiki-move.md已纳入全文
  • references/lark-wiki-node-copy.md已纳入全文
  • references/lark-wiki-node-create.md已纳入全文
  • references/lark-wiki-node-delete.md已纳入全文
  • references/lark-wiki-node-get.md已纳入全文
  • references/lark-wiki-node-list.md已纳入全文
  • references/lark-wiki-space-create.md已纳入全文
  • references/lark-wiki-space-list.md已纳入全文

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

  • SKILL.md工作说明
  • references/lark-wiki-delete-space.md配套文件
  • references/lark-wiki-member-add.md配套文件
  • references/lark-wiki-member-list.md配套文件
  • references/lark-wiki-member-remove.md配套文件
  • references/lark-wiki-move-to-drive.md配套文件
  • references/lark-wiki-move.md配套文件
  • references/lark-wiki-node-copy.md配套文件
  • references/lark-wiki-node-create.md配套文件
  • references/lark-wiki-node-delete.md配套文件
  • references/lark-wiki-node-get.md配套文件
  • references/lark-wiki-node-list.md配套文件
  • references/lark-wiki-space-create.md配套文件
  • references/lark-wiki-space-list.md配套文件

代码和说明中提到的操作

连接外部网站
SKILL.md:37来自说明文档打开原文件
  - 用户明确选定后再执行 `lark-cli wiki +delete-space --space-id <ID> --yes`(高风险写操作,必须显式 `--yes`)。  - 反例:不要把 wiki URL / 名称直接当 `--space-id`(如 `--space-id "https://.../wiki/<wiki_token>"`);务必先用 `wiki +node-get` 解析出 `data.space_id` 再传。- 用户要在知识库中创建新节点,优先使用 `lark-cli wiki +node-create`。
references/lark-wiki-move-to-drive.md:87来自说明文档打开原文件
  "obj_type": "docx",  "url": "https://example.feishu.cn/docx/doxcnXXX"}
references/lark-wiki-node-get.md:20来自说明文档打开原文件
|------|------|----------|---------|-------------|| `--node-token` | string | **Yes** | — | `node_token`, cloud-doc `obj_token`, or a Lark URL embedding one (e.g. `https://feishu.cn/wiki/<token>` or `https://feishu.cn/docx/<token>`). Matches the `--node-token` naming used by sibling `+node-delete` / `+node-copy` / `+move`. || `--token` | string | — (deprecated) | — | Deprecated original name; still accepted for backward compatibility but emits a `Flag --token has been deprecated, use --node-token instead` warning on stderr. New scripts should use `--node-token 
运行命令
SKILL.md:89来自说明文档打开原文件
```bashlark-cli schema wiki.<resource>.<method>   # 调用原生 API 前必须先查看 --data / --params 参数结构,不要猜测字段格式
references/lark-wiki-delete-space.md:14来自说明文档打开原文件
```bash# 同步或异步删除一个知识空间(必须显式加 --yes 确认)
references/lark-wiki-delete-space.md:122来自说明文档打开原文件
```bashlark-cli wiki +node-get \
读取了多少行
1,397
文件校验值(用于核对版本)
c78c8c1d9d2ffa9c8481657490392a6b82d808ad6872c629794325965ac7b5eb