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

Lark Calendar Skill 安全审计

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

飞书日历:管理日历日程和会议室。查看/搜索日程、创建/更新日程、管理参会人、查询忙闲和推荐时段、预定会议室。当用户需要查看日程安排、创建/修改会议、查询/预定会议室时使用。不负责:查询过去的视频会议记录(走 lark-meeting)、待办任务(走 lark-task)。

第三方安全检查结论

发现安全风险

已检查文件
14
发现的风险
6
会不会运行危险命令?检查是否下载程序后直接运行、让他人远程控制电脑,或藏起要运行的命令。未发现风险
会不会泄露文件和密钥?检查是否发送含密码或密钥的文件,以及代码里是否直接写了密钥。发现 2 项风险
中风险

日程描述中的本地图片会被自动上传到云盘

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

创建或更新描述时,相对路径形式的 Markdown 图片会自动上传。描述还支持从 `@文件路径` 或标准输入读取,因此一条看似只是在设置文字的请求也可能读取并上传工作目录中的文件。

为什么需要注意

如果描述引用了不应离开设备的截图或图片,其内容会进入飞书云端,并可能对日程参与者可见。

创建或更新日程描述时,Markdown 中位于当前工作目录内的相对本地图片路径会触发自动上传;描述也可通过 `@文件路径` 或 stdin 读取。若代理把用户提供或生成的路径直接放入描述,工作区文件内容可能被读取并上传到飞书云盘。范围受当前工作目录限制,但指令没有要求逐文件确认。用户可要求作者在任何本地文件读取或上传前展示路径并单独征得同意。

references/lark-calendar-create.md:35来自说明文档
| `--end <time>` | 是 | 结束时间(ISO 8601,**必须带时区偏移**) || `--description <markdown>` | 否 | 日程描述,统一使用此字段,格式为 **Markdown**。提供会议议程、活动内容、注意事项或链接等。支持加粗、斜体、下划线(`<u>...</u>`)、删除线、链接 `[文本](url)`、标题(`# ` 到 `### `,最多三级)、引用(`> `)、有序/无序列表、GFM 表格(`\| 列1 \| 列2 \|` + 分隔行 `\| --- \| --- \|`)、以及图片 `![图片名](图片URL)`(标准 Markdown 图片语法:远程 URL 原样使用;**本地图片路径**(相对路径、且位于当前工作目录内)会自动上传到云盘并在端上内联渲染——绝对路径或工作目录之外的路径会报错;端上已有图片读回为 Markdown 图片)。飞书文档 URL(直接粘贴裸链接,或写成 `[文本](url)`)会自动解析为内联文档,端上展示文档标题而非裸链接。支持 `@文件路径` 或 `-`(stdin)读取。**禁止**用 `***文本***` 同时表示加粗+斜体(端上会残留 `*`);应嵌套书写,如 `**<u>*~~文本~~*</u>**` 或 `*<u>**~~文本~~**</u>*`。|| `--attendee-ids <id_list>` | 否 | 参与人 ID 列表(逗号分隔)。支持用户(`ou_`)、群组(`oc_`)和会议室(`omm_`)。AI 提取时请务必保留对应前缀。bot 可作为合法参会人,无需剔除 |
查看另外 1 个位置
references/lark-calendar-update.md:46来自说明文档
| `--summary <text>` | 否 | 新日程标题。仅在显式传入 `--summary` 时更新;若传空字符串,会把标题清空 || `--description <markdown>` | 否 | 新日程描述,统一使用此字段,格式为 **Markdown**(加粗、斜体、下划线 `<u>...</u>`、删除线、链接 `[文本](url)`、标题 `# `~`### `(最多三级)、引用 `> `、有序/无序列表、GFM 表格 `\| 列1 \| 列2 \|` + 分隔行 `\| --- \| --- \|`、以及图片 `![图片名](图片URL)`(标准 Markdown 图片语法:远程 URL 原样使用;**本地图片路径**(相对路径、且位于当前工作目录内)会自动上传到云盘并在端上内联渲染——绝对路径或工作目录之外的路径会报错;端上已有图片读回为 Markdown 图片)。飞书文档 URL(裸链接或 `[文本](url)`)会自动解析为内联文档,端上展示文档标题。支持 `@文件路径` 或 `-`(stdin)读取。仅在显式传入时更新;传空字符串 `""` 会清空描述。**禁止**用 `***文本***` 同时表示加粗+斜体(端上会残留 `*`);应嵌套书写,如 `**<u>*~~文本~~*</u>**` 或 `*<u>**~~文本~~**</u>*`。 || `--start <time>` | 否 | 新开始时间(ISO 8601,**必须带时区偏移**,如 `2026-03-12T14:00+08:00`;不带偏移会按进程时区解析致偏移)。更新日程时间时必须同时传 `--end` |
中风险

参与人选择和时间偏好被要求写入长期记忆

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

工作流要求在用户澄清参与人或模糊时间含义后,把结果记录为长期记忆或长期偏好。这超出了单次日历操作,且所示指令没有要求先征得持久保存的同意。

为什么需要注意

同事身份关系、工作时间习惯或其他个人偏好可能在任务结束后继续保留,并影响后续决策。

这些是实时工作流指令,分别要求把无法唯一确定的参与人选择和用户澄清后的时间含义记录为长期记忆或偏好。来源没有说明保存位置、保留期限或保存前同意流程,因此单次日历对话可能产生持久画像。用户可要求禁用长期记忆,或要求每次保存前说明具体内容并确认。

references/lark-calendar-schedule-meeting.md:71来自说明文档
搜索参与人出现多个结果无法唯一确定时,必须询问用户并记录长期记忆。
查看另外 1 个位置
references/lark-calendar-schedule-fuzzy-time.md:58来自说明文档
处理规则:- 主动澄清真实意图,不自行猜测- 用户澄清后,将个性化定义沉淀为长期偏好
会不会删除文件或一直在后台运行?检查是否大范围删除文件、改写磁盘,或设置自动启动。未发现风险
会不会绕过安全保护?检查是否跳过网站安全验证、开放过多文件权限,或取消操作前的确认。发现 4 项风险
中风险

创建日程默认授予所有参会人编辑权限

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

`+create` 不只是邀请参会人,还自动设置 `attendee_ability: can_modify_event`,使参会人能够查看彼此并编辑日程。它还默认添加视频会议,但这些额外行为不需要单独选择。

为什么需要注意

受邀者可能修改标题、时间或其他日程内容,扩大对日程的控制范围;默认视频会议也可能创建用户未预期的会议入口。

`+create` 的记录说明它会自动允许参会人彼此可见并编辑日程,还会默认创建飞书视频会议。这些是创建命令的默认附加效果,而不是仅文档示例;用户即使只要求建日程和邀请人员,也可能授予比预期更广的编辑能力。用户可要求作者提供限制参会人权限、禁用视频会议的显式选项,并在创建前展示最终设置。

references/lark-calendar-create.md:44来自说明文档
> `--description` 行内同时加粗和斜体时,**禁止**写 `***文本***`(端上会残留 `*`);必须让 `**` 与 `*` 各自成对嵌套,例如 `**<u>*~~文本~~*</u>**` 或 `*<u>**~~文本~~**</u>*`。> 自动设置 `attendee_ability: "can_modify_event"`,参会人可查看彼此并编辑日程。> 自动设置 `free_busy_status: "busy"`,默认日程忙闲状态为忙碌。> 自动设置 `reminders: [{"minutes": 5}]`,默认日程开始前 5 分钟提醒。> 自动设置 `vchat: {"vc_type": "vc"}`,默认日程包含飞书视频会议。如需其他视频会议类型或不含视频会议,请使用完整 API 命令。> 失败保护:若添加参会人失败(如 open_id 错误),CLI 会自动删除刚创建的空日程(回滚,不通知参会人)。
查看另外 2 个位置
references/lark-calendar-create.md:79来自说明文档
> [!CAUTION]> 这是**写入操作** -- 执行前必须确认用户意图。
references/lark-calendar-create.md:47来自说明文档
> 自动设置 `reminders: [{"minutes": 5}]`,默认日程开始前 5 分钟提醒。> 自动设置 `vchat: {"vc_type": "vc"}`,默认日程包含飞书视频会议。如需其他视频会议类型或不含视频会议,请使用完整 API 命令。> 失败保护:若添加参会人失败(如 open_id 错误),CLI 会自动删除刚创建的空日程(回滚,不通知参会人)。
中风险

选择受限会议室会自动缩短重复日程序列

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

如果会议室的最晚可预约时间早于原重复规则,指令要求在用户确认继续使用该会议室后,自动把重复规则结束时间缩短。会议室选择因此同时成为对整个未来序列的修改。

为什么需要注意

原计划中超出会议室期限的未来日程会被截去,参与者可能失去后续会议安排。

对于重复日程,指令要求检查会议室可预约期限;若用户确认继续选用期限不足的会议室,就自动把整个重复规则的结束时间缩短。它要求先告知最晚日期,因此并非完全无提示,但用户对会议室的确认同时授权了日程序列截短,影响可能超出会议室选择本身。用户可要求把“选择会议室”和“缩短重复序列”拆成两次明确确认,并展示会被取消的日期。

references/lark-calendar-room-find.md:62来自说明文档
- `+room-find` 的时间输入必须是**确定时间块**,不是时间区间搜索。- 如果是重复性日程,必须校验返回中的 `reserve_until_time`(该会议室最晚可预约时间)是否覆盖 `event-rrule` 对应的重复范围。- `--city` 仅在用户明确说出城市时才提取;不要仅凭 `望京办公室`、`漕河泾园区`、`南山办公室` 这类位置名自动补城市。
查看另外 1 个位置
references/lark-calendar-room-find.md:93来自说明文档
> - **`room_name` 必须逐字透传**:展示给用户的会议室名称,必须直接使用 CLI/API 返回的 `room_name` 原值。禁止提取楼层、会议室号、容量、视频能力后重组成新的名称,禁止意译、缩写、去前缀、去后缀,或仅保留"便于阅读"的摘要名。> - **重复日程要明确阻断原因与自动缩短**:若某候选会议室的 `reserve_until_time` 无法覆盖重复性日程,**必须**向用户明确说明该会议室最长可约至何时。若用户确认继续选用该会议室,你必须**自动将日程的重复规则结束时间缩短**至该 `reserve_until_time`,以防止会议室预约失败。不能直接按原规则继续。> - **正确解释推荐结果**:如果返回结果与用户输入条件不完全字面一致,先说明底层可能返回邻近位置或相近条件的推荐候选,不要直接将其判定为异常。
中风险

组合更新可能部分成功,且默认不复查结果

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

一次更新可依次修改字段、移除参会人再添加参会人;中途失败不会回滚。顶层指令又要求写操作后通常不做二次查询,因此部分完成的状态可能只依赖错误输出被发现。

为什么需要注意

例如时间已改变、旧会议室已移除,但新会议室添加失败,日程会停留在用户未选择的中间状态。

组合更新按“字段、移除、添加”依次写入,后续步骤失败不会撤销已完成步骤,因此日程可能处于部分更新状态。错误信息会指出已完成步骤,降低了静默失败风险;顶层规则也允许在返回信息不足时复查。不过默认不二次查询,最终状态通常依赖 CLI 返回的准确性。用户可要求组合变更使用预览,并在部分失败时先报告实际完成项、经确认后再修复或回滚。

references/lark-calendar-update.md:69来自说明文档
- 更新重复性日程时,必须先确定操作范围(仅此次/全部/此次及后续),然后按 [重复性日程操作规范](lark-calendar-recurring.md) 执行。- 当同一次命令组合多个动作时,执行顺序为“日程字段 -> 移除参会人 -> 添加参会人”。若中途失败,不会自动回滚已成功步骤;错误信息会说明已完成的步骤。**⚠️ 高风险操作**: 修改时间时必须先读取原日程时长并计算新 end。如果 end 计算错误,会导致日程时长变化,用户会直接感知,禁止擅自改变原日程的时长。
查看另外 1 个位置
SKILL.md:140来自说明文档
创建、更新、删除、RSVP 等写操作完成后,直接基于命令返回结果反馈用户;不要为了“确认是否生效”主动发起二次查询。只有用户明确要求复查,或命令返回信息不足以回答用户问题时,才需要再查询。
中风险

转让组织者会不可逆地移交纪要、笔记和附件

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

转让命令使用 `--yes` 执行高敏操作;成功后组织者身份不可逆变更,日程关联的纪要、笔记和附件也随之交给接收人。重复日程还可能整体转让。

为什么需要注意

错误识别接收人或组织者身份可能把会议资料和控制权交给错误用户或机器人,原组织者无法通过反向操作保证恢复原状。

转让是需 `--yes` 的高敏写操作,并被明确描述为不可逆;关联纪要、笔记和附件会一并移交。对重复日程,后端会转让整个序列而非单次实例,但命令要求 `--transfer-series`,缺少时会失败并要求先确认,因此存在重要保护。用户仍应在确认前核对接收人、整个序列范围及随附资料清单,并可要求先用 `--dry-run`。

references/lark-calendar-transfer.md:29来自说明文档
| `--event-id <id>` | **是** | 日程 ID(`uid_originalTime` 形式) || `--to-user-id <ou_...>` | **是** | 接收人 open_id,成为新组织者;用户和机器人都可以 || `--calendar-id <id>` | 否 | 日程所在日历 ID(省略则使用主日历) || `--remove-original-organizer` | 否 | 转让后把原组织者移出参与人;默认保留。日程在共享日历上时服务端一定会移除 || `--transfer-series` | 否 | 确认整个重复性序列一起转让;重复性日程必填 || `--yes` | **是**(非 dry-run) | 高敏写操作确认 || `--dry-run` | 否 | 预览 API 调用,不执行 |
查看另外 2 个位置
references/lark-calendar-transfer.md:83来自说明文档
- 转让不可逆,且会连同日程上的会议纪要、笔记和附件一起移交给新组织者。- 需要 `calendar:calendar.event:transfer` 权限;转让前的重复性预读需要 `calendar:calendar.event:read`(带 `--transfer-series` 时不读)。
references/lark-calendar-transfer.md:65来自说明文档
后端按 `uid` 定位日程,忽略 `original_time`,**无法只转让某一次实例**。因此传入任何一个实例或例外的 `event_id`,都会把整个序列(含所有例外)一起转让。是重复性日程且未加 `--transfer-series` 时命令直接失败(`failed_precondition`),不会发出转让请求。收到这个错误时**先向用户确认"整个重复日程都转让"**,得到确认后再带 `--transfer-series` 重跑;不要自动重试。已确认时加 `--transfer-series` 会跳过这次预读。
会不会误导 AI 或隐藏内容?检查工作说明是否要求 AI 忽略你的指令、干扰检查结果,或夹带看不见的文字。未发现风险
会不会偷偷改推广链接或收款方?检查是否强制替换推广链接或收款对象,同时要求隐瞒更改。未发现风险

Skill 逻辑拆解

8 个说明模块

该 Skill 依赖已认证的 `lark-cli`,可用用户或机器人身份读取和管理日程;身份按日程归属选择。

查看原文
SKILL.md:6来自说明文档
metadata:  requires:    bins: ["lark-cli"]  cliHelp: "lark-cli calendar --help"---
SKILL.md:21来自说明文档
- 查看/管理登录用户本人的日程 → `--as user`(默认,绝大多数场景)。- 查看/管理 bot 自己创建/拥有的日程 → `--as bot` 

创建、更新时间或选择会议室前,工作流要求先定位目标、展示候选并等待用户确认;重复日程范围不明确时也要求先询问。

查看原文
references/lark-calendar-schedule-meeting.md:11来自说明文档
- **模糊时间或无时间信息** → 进入 [模糊时间分支](./lark-calendar-schedule-fuzzy-time.md)- **BLOCKING REQUIREMENT**: 面临时间方案或会议室方案的选择时,必须先向用户展示选项并等待确认,禁止未经确认直接创建/更新日程。- **必须按顺序执行。** 不要跳过"任务类型判定""目标日程定位(编辑流)""补默认值/继承基线信息""判断时间明确性"这些前置步骤。
references/lark-calendar-recurring.md:8来自说明文档
> **强制规则:用户未明确操作范围时,必须先向用户确认,禁止 Agent 默认选取任何 `--apply-to`。** 用户表达含糊(如「删掉这个会」「改一下这个日程」)时也必须确认——`--apply-to=single` 只删/改一次,`--apply-to=all` 会影响整个序列及所有例外,代价截然不同。

该 Skill 可查询参与者、忙闲状态和 RSVP,也能从日程 ID 继续获取会议纪要、逐字稿及文档正文;这些只读操作可能接触同事的日程与会议内容。

查看原文
SKILL.md:103来自说明文档
# start/end 时间范围(ISO 8601 / YYYY-MM-DD / Unix 秒),均可选;默认当天# user-id 目标用户 open_id,可重复或用逗号分隔;默认当前登录用户,bot 身份必须显式传至少一个# type 视角四选一(默认 busy):#   busy         每个 user 合并后的忙碌区间(找空档、看忙碌时段)#   raw_busy     每个 user 的原始日程块 + rsvp_status(数会议、看每个会的 rsvp)#   free         每个 user 在时间窗内的空闲区间(可带 --min-duration 过滤)#   common_free  所有 user 的共同空闲区间(可带 --min-duration 过滤)# min-duration 仅对 free / common_free 生效;Go duration 格式,例如 30m、1h、90m
references/lark-calendar-meeting.md:35来自说明文档
# 2b. minute_token → 妙记 AI 产物(按需获取,不传不返回任何 AI 内容)lark-cli minutes +detail --minute-tokens <minute_token> --summary --todo --chapter --keyword --transcript# 3. 任意文档 token(meeting_note / note_doc_token / verbatim_doc_token / shared_doc_token)→ 正文lark-cli docs +fetch --api-version v2 --doc <doc_token> --doc-format markdown```

日程分享链接包含可用于加入日程的 token;Skill 会从链接、二维码或消息卡片中提取并使用该 token。

查看原文
references/lark-calendar-join-event.md:23来自说明文档
| token 类型 | 承载来源 | 取值 ||-----------|---------|------|| 链接类 | 分享链接 / 二维码 | 链接 `{{domain}}/calendar/share?token=<token>` 里的 `token` || 卡片类 | 分享卡片 / RSVP 卡片 | 从 IM 日程分享卡片或 RSVP 卡片消息解析出的日程分享 token |- **分享链接**:直接取 URL query 里的 `token` 值传入;无需解析日程字段。例如 `{{domain}}/calendar/share?token=29f762bdmsbd82ce9` → `--token 29f762bdmsbd82ce9`。- **二维码**:先用 OCR/扫码解析成分享链接,再取其中的 `token`——CLI 不承接二维码图像,只承接解析后的链接 token。- **卡片**:token 落在卡片消息 content(分享卡片 `SHARE_CALENDAR_EVENT`、RSVP 卡片 `GENERAL_CALENDER`);RSVP 卡片被转发后退化为分享卡片,同样可加入。
从这里开始 · 工作说明SKILL.md
lark-calendar
连线表示工作说明包含的模块,不是实际运行顺序。点击模块可查看原文。 另有 5 个章节,可在原文件中查看。

文件引用关系图

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

检查范围与遗漏

逐文件查看涉及的内容

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

  • SKILL.md已纳入全文
  • references/lark-calendar-create.md已纳入全文
  • references/lark-calendar-join-event.md已纳入全文
  • references/lark-calendar-list-attendees.md已纳入全文
  • references/lark-calendar-meeting.md已纳入全文
  • references/lark-calendar-recurring.md已纳入全文
  • references/lark-calendar-room-find.md已纳入全文
  • references/lark-calendar-rsvp.md已纳入全文
  • references/lark-calendar-schedule-meeting.md已纳入全文
  • references/lark-calendar-suggestion.md已纳入全文
  • references/lark-calendar-transfer.md已纳入全文
  • references/lark-calendar-update.md已纳入全文
  • references/lark-calendar-schedule-clear-time.md已纳入全文
  • references/lark-calendar-schedule-fuzzy-time.md已纳入全文

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

  • SKILL.md工作说明
  • references/lark-calendar-create.md配套文件
  • references/lark-calendar-join-event.md配套文件
  • references/lark-calendar-list-attendees.md配套文件
  • references/lark-calendar-meeting.md配套文件
  • references/lark-calendar-recurring.md配套文件
  • references/lark-calendar-room-find.md配套文件
  • references/lark-calendar-rsvp.md配套文件
  • references/lark-calendar-schedule-clear-time.md配套文件
  • references/lark-calendar-schedule-fuzzy-time.md配套文件
  • references/lark-calendar-schedule-meeting.md配套文件
  • references/lark-calendar-suggestion.md配套文件
  • references/lark-calendar-transfer.md配套文件
  • references/lark-calendar-update.md配套文件

代码和说明中提到的操作

运行命令
SKILL.md:26来自说明文档
```bash# 用户本人日程 → user
SKILL.md:54来自说明文档
```bash# calendar_id不传,默认primary
SKILL.md:67来自说明文档
```bash# query 按关键词 可选
连接外部网站
SKILL.md:151来自说明文档
- **日程分享链接 vs 会议链接**:两者是不同事物,不可混用。  - 日程分享链接:`https://<domain>/calendar/share?token=<token>`,指向日程本身,用于分享日程详情。  - 会议链接:`https://<domain>/j/<number>`,指向视频会议入口;同一重复性日程序列的所有实例共用同一个会议链接。
SKILL.md:152来自说明文档
  - 日程分享链接:`https://<domain>/calendar/share?token=<token>`,指向日程本身,用于分享日程详情。  - 会议链接:`https://<domain>/j/<number>`,指向视频会议入口;同一重复性日程序列的所有实例共用同一个会议链接。
读取了多少行
1,284
文件校验值(用于核对版本)
a8bf4f59d6250ebea87b3215c77816f53e9df221c607328c7bc144cb8b1e7b45