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

Lark Markdown Skill 安全审计

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

飞书 Markdown:查看、创建、上传、编辑和比较飞书中的原生 Markdown 文件。当用户要操作飞书 Markdown 文件,或比较其远端版本及本地草稿时使用。纯本地 Markdown 文件操作不触发本 skill。不负责将 Markdown 导入为飞书在线文档,也不负责文件搜索、权限、评论、移动、删除等云空间管理操作。

第三方安全检查结论

发现安全风险

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

局部 patch 可能覆盖他人的并发修改或替换所有匹配位置

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

该操作不是原子 patch:它先下载整份文件,执行 `ReplaceAll` 或正则全量替换,再整文件覆盖上传。下载与上传之间发生的修改没有并发保护,而且结果只报告命中数量,不提供具体位置。

为什么需要注意

其他人在此期间提交的内容可能被静默覆盖;过宽的文字或正则模式也可能修改文档中多个非预期位置。

文档确认 patch 会对整份 Markdown 做全量替换,并通过“下载—本地替换—整文件覆盖上传”实现。若下载后他人修改同一文件,上传可能覆盖该修改;过宽的字面或正则模式也会替换所有命中。结果只给命中数量,不能用于逐处核验。用户可要求先执行 `--dry-run`、使用精确模式,并在协作文件上避免并发编辑。

references/lark-markdown-patch.md:71来自说明文档
- `--content` 必须显式传入,但允许为空字符串- 未加 `--regex` 时,行为等价于对整份 Markdown 文本执行 `strings.ReplaceAll`- 加了 `--regex` 时,行为等价于对整份 Markdown 文本执行 RE2 全量替换;`--content` 里的 `$1`、`${name}` 会按 Go regexp replacement template 解释,字面 `$` 请写成 `$$`- 替换后的最终 Markdown 不能为空;如果 patch 结果是空字符串,CLI 会直接报错,不会上传空文件,因为 Drive 不支持零字节 Markdown,且空文件通常是误操作- `0` 命中时命令仍然成功返回,但不会上传新版本
查看另外 2 个位置
references/lark-markdown-patch.md:96来自说明文档
- 该命令的内部语义是:**download -> local replace -> overwrite upload**- 它不是服务端原子 patch;如果有人在你下载后、上传前更新了同一文件,本次 patch 仍可能覆盖那次中间修改- 它不会返回详细匹配位置,只返回命中数量- `--dry-run` 会同时展示两种可能的上传路径:`upload_all`(小文件)和 `upload_prepare/upload_part/upload_finish`(大文件分片上传)
references/lark-markdown-patch.md:49来自说明文档
# 预览底层编排lark-cli markdown +patch \  --file-token boxcnxxxx \  --pattern 'hello markdown' \  --content 'hello patched' \  --dry-run```
中风险

用本地文件覆盖远端内容时还会默认改变远端文件名

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

当 `+overwrite` 使用 `--file` 且未指定 `--name` 时,远端文件会采用本地文件名。这超出了单纯替换正文的效果。

为什么需要注意

依赖原文件名的人员、链接说明或自动化流程可能无法识别该文件,用户也可能误以为只更新了内容。

文档明确规定:使用 `--file` 且省略 `--name` 时,覆盖后的远端文件默认采用本地文件名。因此该操作可能同时改正文和文件名,影响链接展示、识别或依赖名称的流程。只有显式提供 `--name` 才能控制结果名称;用户可要求保留原名或在执行前确认新名称。

references/lark-markdown-overwrite.md:55来自说明文档
- `--content` 与 `--file` 必须二选一- 如果传了 `--name`,直接使用它作为覆盖后的文件名- 如果没传 `--name` 且使用 `--content`,默认保留远端原文件名- 如果没传 `--name` 且使用 `--file`,默认使用本地文件名- `--file` 指向的本地文件名必须带 `.md` 后缀- 覆盖成功后 **必须** 返回 `version`
查看另外 2 个位置
references/lark-markdown-overwrite.md:48来自说明文档
|------|------|------|| `--file-token` | 是 | 目标 Markdown 文件 token || `--name` | 否 | 显式指定覆盖后的文件名;必须带 `.md` 后缀。传入时优先使用它 || `--content` | 条件必填 | 新 Markdown 内容;与 `--file` 互斥;支持直接传字符串、`@file`、`-`(stdin) || `--file` | 条件必填 | 本地 `.md` 文件路径;与 `--content` 互斥 |
references/lark-markdown-overwrite.md:56来自说明文档
- `--content` 与 `--file` 必须二选一- 如果传了 `--name`,直接使用它作为覆盖后的文件名- 如果没传 `--name` 且使用 `--content`,默认保留远端原文件名- 如果没传 `--name` 且使用 `--file`,默认使用本地文件名- `--file` 指向的本地文件名必须带 `.md` 后缀- 覆盖成功后 **必须** 返回 `version`
低风险

可选的 fetch 覆盖参数会替换已有本地文件

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

`+fetch` 支持把远端内容保存到本地;加入 `--overwrite` 后,指定路径上已有的文件会被覆盖。文档没有说明会创建备份。

为什么需要注意

如果输出路径选错,未提交或无备份的本地 Markdown 内容可能丢失。

这段代码的正常用途

覆盖本地文件是显式、可选的 `--overwrite` 行为,只在同时指定 `--output` 时生效;普通 fetch 可以直接返回内容,或保存到尚未存在的目标。所引文本没有显示静默覆盖、自动添加该参数或绕过确认,因此它是有破坏潜力但清楚标注的正常文件下载选项。用户仍可要求不使用 `--overwrite`,或先确认目标路径;文档未承诺备份。

这项判断针对展示的代码和适用条件,不表示风险已经实际发生。
references/lark-markdown-fetch.md:23来自说明文档
# 覆盖已存在文件lark-cli markdown +fetch \  --file-token boxcnxxxx \  --output ./README.md \  --overwrite
查看另外 1 个位置
references/lark-markdown-fetch.md:40来自说明文档
|------|------|------|| `--file-token` | 是 | 目标 Markdown 文件 token || `--output` | 否 | 本地保存路径;既可传具体文件名,也可传目录路径。传目录时使用远端文件名保存;省略时直接返回 Markdown 内容 || `--overwrite` | 否 | 覆盖已存在的本地输出文件;仅在传入 `--output` 时生效 |
会不会绕过安全保护?检查是否跳过网站安全验证、开放过多文件权限,或取消操作前的确认。发现 1 项风险
中风险

应用身份创建文件会尝试自动授予当前 CLI 用户可管理权限

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

使用 `--as bot` 创建成功后,CLI 不只创建文件,还会尝试把该文件的 `full_access` 授予本地记录的当前 CLI 用户。创建请求本身不一定表示用户同意新增一个可管理权限主体。

为什么需要注意

该 CLI 用户可管理文件权限;如果本地 `open_id` 属于错误、旧有或共享环境中的账号,文件控制权可能授予非预期人员。

文档明确说明:仅在以 `--as bot` 创建成功后,CLI 会尝试把该文件的 `full_access` 授予本地记录的当前 CLI 用户。这是创建之外的权限变更,可能让该身份管理文件;授权也可能跳过或失败。用户可要求创建前说明授权对象,或不用 bot 身份。文档同时禁止未经单独确认转移 owner,因此这里不是所有权转移。

references/lark-markdown-create.md:91来自说明文档
> [!IMPORTANT]> 如果 Markdown 文件是**以应用身份(bot)创建**的,如 `lark-cli markdown +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`:Markdown 文件已创建成功,但自动授权用户失败;会带上失败原因,并提示稍后重试或继续使用 bot 身份处理该文件>> `permission_grant.perm = full_access` 表示该资源已授予“可管理权限”。>
查看另外 3 个位置
references/lark-markdown-create.md:92来自说明文档
> [!IMPORTANT]> 如果 Markdown 文件是**以应用身份(bot)创建**的,如 `lark-cli markdown +create --as bot`,在创建成功后,CLI 会**尝试为当前 CLI 用户自动授予该文件的 `full_access`(可管理权限)**。>
references/lark-markdown-create.md:94来自说明文档
>> 以应用身份创建时,结果里会额外返回 `permission_grant` 字段,明确说明授权结果:> - `status = granted`:当前 CLI 用户已获得该文件的可管理权限> - `status = skipped`:本地没有可用的当前用户 `open_id`,因此不会自动授权;可提示用户先完成 `lark-cli auth login`,再让 AI / agent 继续使用应用身份(bot)授予当前用户权限> - `status = failed`:Markdown 文件已创建成功,但自动授权用户失败;会带上失败原因,并提示稍后重试或继续使用 bot 身份处理该文件>
references/lark-markdown-create.md:101来自说明文档
>> **不要擅自执行 owner 转移。** 如果用户需要把 owner 转给自己,必须单独确认。
会不会误导 AI 或隐藏内容?检查工作说明是否要求 AI 忽略你的指令、干扰检查结果,或夹带看不见的文字。未发现风险
会不会偷偷改推广链接或收款方?检查是否强制替换推广链接或收款对象,同时要求隐瞒更改。未发现风险

Skill 逻辑拆解

4 个说明模块

该 Skill 通过 `lark-cli` 读取、创建、比较和修改飞书 Drive 中的原生 Markdown 文件,并优先使用用户身份;自动化场景也可使用应用身份。

查看原文
SKILL.md:17来自说明文档
- 身份:Markdown 文件通常属于用户云空间资源,优先使用 `--as user`。如为自动化场景,或应用已创建并持有目标文件权限,可按场景使用 `--as bot`。首次以 `user` 身份访问前执行 `lark-cli auth login`- `markdown +create` / `+overwrite` 失败时,先判断是不是身份和权限问题:`bot` 更常见的是 app scope 或目标目录 ACL,`user` 更常见的是用户授权或用户 ACL;不要不加判断地来回切身份重试。
SKILL.md:20来自说明文档
- 用户要**上传、创建一个原生 `.md` 文件**,使用 `lark-cli markdown +create`- 用户要**比较原生 `.md` 文件的历史版本差异**,或比较远端 Markdown 与本地草稿,使用 `lark-cli markdown +diff`- 用户要**读取 Drive 里某个 `.md` 文件内容**,使用 `lark-cli markdown +fetch`- 用户要对 Markdown 文件做**局部文本替换 / 正则替换**,优先使用 `lark-cli markdown +patch`- 用户要**覆盖更新 Drive 里某个 `.md` 文件内容**,使用 `lark-cli markdown +overwrite`- 用户要先拿 Markdown 文件的历史版本号,再做比较/下载/回滚,先用 [`lark-drive`](../lark-drive/SKILL.md) 的 `lark-cli drive +version-history`

创建和覆盖操作可以读取指定的本地文件、`@file` 内容或标准输入,并将其作为 Markdown 内容写入飞书。

查看原文
SKILL.md:35来自说明文档
- `--name` 和本地 `--file` 文件名都必须显式带 `.md` 后缀;不满足时 shortcut 会直接报错- `--content` 支持:  - 直接传字符串  - `@file` 从本地文件读取内容  - `-` 从 stdin 读取内容- `markdown +patch` 的内部语义是:**先完整下载 Markdown,再本地替换,再整文件覆盖上传**
references/lark-markdown-create.md:63来自说明文档
| `--wiki-token` | 否 | 目标 wiki 节点 token 或 wiki URL;与 `--folder-token` 互斥;传入后自动映射为 `parent_type=wiki` || `--name` | 条件必填 | 文件名,**必须显式带 `.md` 后缀**;使用 `--content` 时必填;使用 `--file` 时可省略,默认取本地文件名 || `--content` | 条件必填 | Markdown 内容;与 `--file` 互斥;支持直接传字符串、`@file`、`-`(stdin) || `--file` | 条件必填 | 本地 `.md` 文件路径;与 `--content` 互斥 |

读取操作默认返回远端正文,也可写入指定本地路径;只有显式使用 `--overwrite` 时才覆盖已有本地文件。

查看原文
references/lark-markdown-fetch.md:40来自说明文档
|------|------|------|| `--file-token` | 是 | 目标 Markdown 文件 token || `--output` | 否 | 本地保存路径;既可传具体文件名,也可传目录路径。传目录时使用远端文件名保存;省略时直接返回 Markdown 内容 || `--overwrite` | 否 | 覆盖已存在的本地输出文件;仅在传入 `--output` 时生效 |

所谓局部 patch 实际会下载整个远端文件、在本地执行全局替换,再上传整个文件;它不是服务端原子更新。

查看原文
references/lark-markdown-patch.md:71来自说明文档
- `--content` 必须显式传入,但允许为空字符串- 未加 `--regex` 时,行为等价于对整份 Markdown 文本执行 `strings.ReplaceAll`- 加了 `--regex` 时,行为等价于对整份 Markdown 文本执行 RE2 全量替换;`--content` 里的 `$1`、`${name}` 会按 Go regexp replacement template 解释,字面 `$` 请写成 `$$`- 替换后的最终 Markdown 不能为空;如果 patch 结果是空字符串,CLI 会直接报错,不会上传空文件,因为 Drive 不支持零字节 Markdown,且空文件通常是误操作- `0` 命中时命令仍然成功返回,但不会上传新版本
references/lark-markdown-patch.md:96来自说明文档
- 该命令的内部语义是:**download -> local replace -> overwrite upload**- 它不是服务端原子 patch;如果有人在你下载后、上传前更新了同一文件,本次 patch 仍可能覆盖那次中间修改- 它不会返回详细匹配位置,只返回命中数量- `--dry-run` 会同时展示两种可能的上传路径:`upload_all`(小文件)和 `upload_prepare/upload_part/upload_finish`(大文件分片上传)
从这里开始 · 工作说明SKILL.md
lark-markdown
连线表示工作说明包含的模块,不是实际运行顺序。点击模块可查看原文。

文件引用关系图

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

检查范围与遗漏

逐文件查看涉及的内容

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

  • SKILL.md已纳入全文
  • references/lark-markdown-create.md已纳入全文
  • references/lark-markdown-diff.md已纳入全文
  • references/lark-markdown-fetch.md已纳入全文
  • references/lark-markdown-overwrite.md已纳入全文
  • references/lark-markdown-patch.md已纳入全文

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

  • SKILL.md工作说明
  • references/lark-markdown-create.md配套文件
  • references/lark-markdown-diff.md配套文件
  • references/lark-markdown-fetch.md配套文件
  • references/lark-markdown-overwrite.md配套文件
  • references/lark-markdown-patch.md配套文件

代码和说明中提到的操作

运行命令
SKILL.md:47来自说明文档
```bash# BAD: 未转义正则特殊字符,可能匹配到错误位置
references/lark-markdown-create.md:9来自说明文档
```bash# 直接用行内内容创建
references/lark-markdown-diff.md:9来自说明文档
```bash# 比较两个远端版本
连接外部网站
references/lark-markdown-create.md:37来自说明文档
lark-cli markdown +create \  --folder-token "https://feishu.cn/drive/folder/fldcn_xxx" \  --file ./README.md
references/lark-markdown-create.md:47来自说明文档
lark-cli markdown +create \  --wiki-token "https://feishu.cn/wiki/wikcn_xxx" \  --file ./README.md
读取了多少行
670
文件校验值(用于核对版本)
8c786ab2dd638141dfd01acdb37a10edbddcffb96d673164b18201df909b21c4