Skip to content
Report library
Purpose / Other

Lark Calendar Skill Security Audit

What the author says it does (original text)

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

Independent security check

Security risks found

Files checked
14
Risks found
6
Could it run dangerous commands?Looks for programs run straight after downloading, remote control of your computer, and hidden commands.No risks found
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

Local images in event descriptions are automatically uploaded to cloud storage

Source references: 2
What we found

When creating or updating a description, a relative Markdown image path is automatically uploaded. Descriptions can also be read from `@file-path` or standard input, so a request that appears to set text may read and upload a workspace file.

Why this matters

A screenshot or image that should remain local could enter Lark cloud storage and may become visible to event participants.

When creating or updating a description, a relative local image path inside the current working directory triggers an automatic cloud-drive upload; descriptions can also be read from `@file-path` or stdin. If the agent places a supplied or generated path into the description, workspace file contents could be read and uploaded. The path is confined to the working directory, but no per-file confirmation is required. Users can ask that every local path be shown and separately approved before reading or upload.

references/lark-calendar-create.md:35In the instructions
| `--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 可作为合法参会人,无需剔除 |
Show 1 other places
references/lark-calendar-update.md:46In the instructions
| `--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` |
Medium risk

Attendee choices and time preferences are directed into long-term memory

Source references: 2
What we found

After the user resolves an attendee or ambiguous time expression, the workflow directs the agent to record the result as long-term memory or a lasting preference. This exceeds the immediate calendar task, and the shown instructions do not require consent for persistent storage.

Why this matters

Coworker relationships, working-hour habits, or other personal preferences may remain after the task and influence later decisions.

These are active workflow instructions requiring ambiguous attendee selections and clarified time meanings to be stored as long-term memory or preferences. The source does not state where this is stored, how long it is retained, or require consent before saving, so a one-time calendar conversation could create a persistent profile. Users can require long-term memory to be disabled or demand disclosure and confirmation before each saved item.

references/lark-calendar-schedule-meeting.md:71In the instructions
搜索参与人出现多个结果无法唯一确定时,必须询问用户并记录长期记忆。
Show 1 other places
references/lark-calendar-schedule-fuzzy-time.md:58In the instructions
处理规则:- 主动澄清真实意图,不自行猜测- 用户澄清后,将个性化定义沉淀为长期偏好
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: 4
Medium risk

Event creation grants every attendee edit permission by default

Source references: 3
What we found

`+create` does more than invite attendees: it automatically sets `attendee_ability: can_modify_event`, allowing attendees to see one another and edit the event. It also adds a video meeting by default without requiring a separate choice.

Why this matters

Invitees may gain the ability to alter the title, time, or other event content, expanding control beyond simple attendance. An unexpected video-meeting entry may also be created.

The `+create` documentation says it automatically lets attendees see one another and edit the event, and also adds a Lark video meeting by default. These are default command effects, not merely examples; a user asking only to create an event and invite people may grant broader editing rights than expected. Users can ask for explicit controls to restrict attendee permissions and disable video meetings, with final settings shown before creation.

references/lark-calendar-create.md:44In the instructions
> `--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 会自动删除刚创建的空日程(回滚,不通知参会人)。
Show 2 other places
references/lark-calendar-create.md:79In the instructions
> [!CAUTION]> 这是**写入操作** -- 执行前必须确认用户意图。
references/lark-calendar-create.md:47In the instructions
> 自动设置 `reminders: [{"minutes": 5}]`,默认日程开始前 5 分钟提醒。> 自动设置 `vchat: {"vc_type": "vc"}`,默认日程包含飞书视频会议。如需其他视频会议类型或不含视频会议,请使用完整 API 命令。> 失败保护:若添加参会人失败(如 open_id 错误),CLI 会自动删除刚创建的空日程(回滚,不通知参会人)。
Medium risk

Selecting a limited-availability room automatically shortens a recurring series

Source references: 2
What we found

If a room cannot be reserved through the original recurrence, the instructions require automatically shortening the recurrence end after the user agrees to keep that room. A room choice therefore also modifies the entire future series.

Why this matters

Future occurrences beyond the room’s reservation limit may be removed, causing participants to lose planned meetings.

For recurring events, the instructions require checking the room’s reservation limit and automatically shortening the recurrence end date if the user confirms continued use of a room whose limit is too short. The limit must first be disclosed, so this is not entirely silent, but confirming a room also authorizes truncating the event series. Users can require separate confirmations for room selection and recurrence changes, including a list of dates that would be removed.

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

Combined updates can partially succeed and are not verified by default

Source references: 2
What we found

A single update can change fields, remove attendees, and then add attendees. If a later step fails, earlier steps are not rolled back. The top-level instructions also normally avoid a follow-up query after writes, so the intermediate state may only be apparent from error output.

Why this matters

For example, the time may be changed and the old room removed while adding the new room fails, leaving the event in a state the user did not choose.

Combined updates write fields, removals, and additions sequentially, and a later failure does not undo earlier successful steps, so an event can remain partially updated. The error reports completed steps, reducing silent-failure risk, and the top-level rule permits rechecking when output is insufficient. However, no follow-up query is performed by default, so final-state knowledge usually relies on CLI output. Users can require previews and, after partial failure, a report of completed changes before any repair or rollback.

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

Organizer transfer irreversibly hands over notes and attachments

Source references: 3
What we found

The transfer command uses `--yes` for a high-sensitivity operation. Once successful, organizer ownership changes irreversibly and associated meeting notes, notes, and attachments move to the recipient. A recurring event may be transferred as an entire series.

Why this matters

Misidentifying the recipient or acting identity could give event control and meeting materials to the wrong user or bot, without a guaranteed way for the original organizer to restore the prior state.

Transfer is a high-sensitivity write requiring `--yes` and is explicitly described as irreversible; associated meeting notes, notes, and attachments are transferred as well. For recurring events, the backend transfers the whole series rather than one instance, but `--transfer-series` is required and omission causes failure pending confirmation, which is a meaningful safeguard. Users should still verify the recipient, series scope, and attached materials before approval and can request `--dry-run` first.

references/lark-calendar-transfer.md:29In the instructions
| `--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 调用,不执行 |
Show 2 other places
references/lark-calendar-transfer.md:83In the instructions
- 转让不可逆,且会连同日程上的会议纪要、笔记和附件一起移交给新组织者。- 需要 `calendar:calendar.event:transfer` 权限;转让前的重复性预读需要 `calendar:calendar.event:read`(带 `--transfer-series` 时不读)。
references/lark-calendar-transfer.md:65In the instructions
后端按 `uid` 定位日程,忽略 `original_time`,**无法只转让某一次实例**。因此传入任何一个实例或例外的 `event_id`,都会把整个序列(含所有例外)一起转让。是重复性日程且未加 `--transfer-series` 时命令直接失败(`failed_precondition`),不会发出转让请求。收到这个错误时**先向用户确认"整个重复日程都转让"**,得到确认后再带 `--transfer-series` 重跑;不要自动重试。已确认时加 `--transfer-series` 会跳过这次预读。
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

8 instruction sections

The Skill relies on an authenticated `lark-cli` and can read or manage calendar events as either the signed-in user or a bot, chosen according to event ownership.

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

Before creating, changing time, or selecting a room, the workflow requires locating the target, presenting choices, and waiting for confirmation. Ambiguous recurring-event scope must also be confirmed.

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

The Skill can query attendees, availability, and RSVP status, and can follow an event ID to meeting notes, transcripts, and document bodies. These read operations may expose coworkers’ scheduling and meeting content to the agent.

View source
SKILL.md:103In the instructions
# 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:35In the instructions
# 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```

Calendar sharing links contain a token that can be used to join an event. The Skill extracts and uses such tokens from links, QR codes, or message cards.

View source
references/lark-calendar-join-event.md:23In the instructions
| 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 卡片被转发后退化为分享卡片,同样可加入。
Start here · InstructionsSKILL.md
lark-calendar
Lines connect the instruction file to its sections, not an observed execution order. Select a section to read the source. 5 more sections are available in the original file.

File reference map

References: 40
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 records14 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/lark-calendar-create.mdFull text included
  • references/lark-calendar-join-event.mdFull text included
  • references/lark-calendar-list-attendees.mdFull text included
  • references/lark-calendar-meeting.mdFull text included
  • references/lark-calendar-recurring.mdFull text included
  • references/lark-calendar-room-find.mdFull text included
  • references/lark-calendar-rsvp.mdFull text included
  • references/lark-calendar-schedule-meeting.mdFull text included
  • references/lark-calendar-suggestion.mdFull text included
  • references/lark-calendar-transfer.mdFull text included
  • references/lark-calendar-update.mdFull text included
  • references/lark-calendar-schedule-clear-time.mdFull text included
  • references/lark-calendar-schedule-fuzzy-time.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/lark-calendar-create.mdSupporting file
  • references/lark-calendar-join-event.mdSupporting file
  • references/lark-calendar-list-attendees.mdSupporting file
  • references/lark-calendar-meeting.mdSupporting file
  • references/lark-calendar-recurring.mdSupporting file
  • references/lark-calendar-room-find.mdSupporting file
  • references/lark-calendar-rsvp.mdSupporting file
  • references/lark-calendar-schedule-clear-time.mdSupporting file
  • references/lark-calendar-schedule-fuzzy-time.mdSupporting file
  • references/lark-calendar-schedule-meeting.mdSupporting file
  • references/lark-calendar-suggestion.mdSupporting file
  • references/lark-calendar-transfer.mdSupporting file
  • references/lark-calendar-update.mdSupporting file

Operations mentioned in code and instructions

Run commands
SKILL.md:26In the instructions
```bash# 用户本人日程 → user
SKILL.md:54In the instructions
```bash# calendar_id不传,默认primary
SKILL.md:67In the instructions
```bash# query 按关键词 可选
Connect to websites
SKILL.md:151In the instructions
- **日程分享链接 vs 会议链接**:两者是不同事物,不可混用。  - 日程分享链接:`https://<domain>/calendar/share?token=<token>`,指向日程本身,用于分享日程详情。  - 会议链接:`https://<domain>/j/<number>`,指向视频会议入口;同一重复性日程序列的所有实例共用同一个会议链接。
SKILL.md:152In the instructions
  - 日程分享链接:`https://<domain>/calendar/share?token=<token>`,指向日程本身,用于分享日程详情。  - 会议链接:`https://<domain>/j/<number>`,指向视频会议入口;同一重复性日程序列的所有实例共用同一个会议链接。
Lines read
1,284
File checksum (to compare versions)
a8bf4f59d6250ebea87b3215c77816f53e9df221c607328c7bc144cb8b1e7b45