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

Extension Email Calendar Events Skill 安全审计

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

Support for organising events/meetings and sending invitations by email.

第三方安全检查结论

先别安装或运行

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

发送错误被丢弃,调用方无法判断邀请是否送达

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

邮件组件明确返回 #ok 或带错误文本的 #err,但 sendEventInvitation 使用 ignore 丢弃结果,并以 async () 返回。

为什么需要注意

权限或投递失败时,上层应用仍可能把调用视为成功。用户可能基于并未发出的邀请作出安排,而且错误信息不会用于告警或重试。

邮件接口明确可能返回带错误文本的 `#err`,但示例发送函数使用 `ignore await` 丢弃结果,并以 `async ()` 返回。若邮件服务拒绝或发送失败,调用方无法从此函数获知失败,管理员可能误以为邀请已送达,进而作出错误的会议安排决定。用户可要求作者检查并返回发送结果、记录失败并提供重试或失败通知。

SKILL.md:130来自说明文档打开原文件
    public type SendResult = {    #ok;    #err : Text;  };  public func sendCalendarEvent(fromUsername : Text, event : CalendarEvent) : async SendResult;};
查看另外 2 个位置
SKILL.md:309来自说明文档打开原文件
    ignore await EmailClient.sendCalendarEvent(      "no-reply",      event    );  };
SKILL.md:301来自说明文档打开原文件
  public shared ({ caller }) func sendEventInvitation(uid : Text) : async () {    if (not (AccessControl.hasPermission(accessControlState, caller, #admin))) {
会不会泄露文件和密钥?检查是否发送含密码或密钥的文件,以及代码里是否直接写了密钥。发现 1 项风险
高风险

未经验证的任意邮箱会自动收到所有新事件详情

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

公开注册接口直接接受姓名和邮箱,没有展示邮箱所有权验证。创建事件时,示例把全部已注册资料自动设为必需参与者;管理员发送邀请后,事件摘要、描述、地点和时间会随邀请发送至这些地址。

为什么需要注意

任何调用者都可登记不属于自己的第三方邮箱。若管理员随后创建并发送事件,该第三方可能收到内部会议详情和非自愿邀请;攻击者也可借此向任意地址引流邮件。

该风险由示例实现支持,但不是已执行行为。任何调用者都可提交邮箱注册;管理员创建事件时,代码把全部用户资料自动列为必需参与者,随后邮件函数发送包含摘要、描述、地点和时间的完整事件。因此,只要应用采用此示例且管理员发送邀请,未经验证或被冒用的地址就可能收到所有相关事件信息。用户可要求作者加入邮箱所有权验证、逐事件选择参与者并在发送前确认收件人。

SKILL.md:175来自说明文档打开原文件
  public shared ({ caller }) func registerUser(name : Text, email : Text) : async () {    // Check if the user already exists    if (userProfiles.containsKey(caller)) {      Runtime.trap("User already registered");    };    // Check if the email is already used    if (emails.contains(email)) {      Runtime.trap("Email already taken");    };    // Add a user record    userProfiles.add(      caller,      {        name;        email;      }    );    emails.add(email);  };
查看另外 4 个位置
SKILL.md:220来自说明文档打开原文件
        },        userProfiles.values().map(          func({ name; email }) {            {              who = { name = ?name; email };              role = #required;            };          }        ).toArray()      ).isNull()
SKILL.md:94来自说明文档打开原文件
module {  public type CalendarEvent = {    uid : Text;    sequence : Nat32;    method : CalendarEventMethod;    summary : Text;    description : Text;    location : Text;    startTime : Nat64;    endTime : Nat64;    organizer : Mailbox;    attendees : [Attendee];  };
SKILL.md:306来自说明文档打开原文件
    let event = calendarEvents.get(uid)      ?? Runtime.trap("Calendar event not found");    ignore await EmailClient.sendCalendarEvent(      "no-reply",      event    );  };
SKILL.md:309来自说明文档打开原文件
    ignore await EmailClient.sendCalendarEvent(      "no-reply",      event    );  };
会不会删除文件或一直在后台运行?检查是否大范围删除文件、改写磁盘,或设置自动启动。未发现风险
会不会绕过安全保护?检查是否跳过网站安全验证、开放过多文件权限,或取消操作前的确认。发现 1 项风险
中风险

抢先注册可冒用邮箱并阻止其真实持有人注册

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

邮箱地址由调用者自行提交,代码只检查该文本是否已被占用,然后永久加入唯一性集合;没有展示验证邮件或证明调用者控制该邮箱的步骤。

为什么需要注意

攻击者可先登记他人的邮箱和任意姓名,使系统把攻击者主体与该身份资料关联,并导致真实持有人之后收到“Email already taken”。

示例的公开注册函数接受调用者提供的任意邮箱,仅检查该邮箱文本是否已存在,随后把邮箱绑定到调用者并加入唯一性集合;可见代码没有所有权验证步骤。若应用照此实现,攻击者可先注册他人的地址,使真实持有人之后收到“Email already taken”,同时该地址还可能成为邀请收件人。源代码未展示解除占用的注册接口。用户可要求作者在占用邮箱前完成验证码或确认链接验证,并提供安全的恢复流程。

SKILL.md:175来自说明文档打开原文件
  public shared ({ caller }) func registerUser(name : Text, email : Text) : async () {    // Check if the user already exists    if (userProfiles.containsKey(caller)) {      Runtime.trap("User already registered");    };    // Check if the email is already used    if (emails.contains(email)) {      Runtime.trap("Email already taken");    };
查看另外 2 个位置
SKILL.md:186来自说明文档打开原文件
    // Add a user record    userProfiles.add(      caller,      {        name;        email;      }    );    emails.add(email);  };
SKILL.md:181来自说明文档打开原文件
    // Check if the email is already used    if (emails.contains(email)) {      Runtime.trap("Email already taken");    };    // Add a user record    userProfiles.add(      caller,      {        name;        email;      }    );    emails.add(email);  };
会不会误导 AI 或隐藏内容?检查工作说明是否要求 AI 忽略你的指令、干扰检查结果,或夹带看不见的文字。未发现风险
会不会偷偷改推广链接或收款方?检查是否强制替换推广链接或收款对象,同时要求隐瞒更改。未发现风险

Skill 逻辑拆解

1 个说明模块

该 Skill 声称提供日历事件的增删改查,并通过电子邮件发送 iCalendar 邀请;它明确说明目前不能接收参与者的 RSVP 回复。

查看原文
SKILL.md:17来自说明文档打开原文件
This skill adds support for organising events/meetings and sending iCalendar invitations by email. It provides CRUD operations for calendar events and email-based invitation delivery.
SKILL.md:23来自说明文档打开原文件
- Internally it builds and attaches an iCalendar file to each attendees's email- This component does not yet support receiving RSVPs from attendees

所示示例对事件创建、修改、参与者管理、取消、列出、删除和发送邀请均要求管理员权限。普通用户注册接口则不要求此权限。

查看原文
SKILL.md:175来自说明文档打开原文件
  public shared ({ caller }) func registerUser(name : Text, email : Text) : async () {    // Check if the user already exists
SKILL.md:197来自说明文档打开原文件
  public shared ({ caller }) func addCalendarEvent(summary : Text, description : Text, location : Text, startTimeMs : Nat64, endTimeMs : Nat64) : async () {    if (not (AccessControl.hasPermission(accessControlState, caller, #admin))) {      Runtime.trap("Unauthorized: Only admins can add calendar events");    };
SKILL.md:301来自说明文档打开原文件
  public shared ({ caller }) func sendEventInvitation(uid : Text) : async () {    if (not (AccessControl.hasPermission(accessControlState, caller, #admin))) {      Runtime.trap("Unauthorized: Only admins can send calendar event invitations");    };

实际事件存储和邮件传输由预制依赖模块承担;所给材料仅展示其接口,并称日历模块不可修改,因此无法从这些行验证依赖内部如何处理或保护数据。

查看原文
SKILL.md:28来自说明文档打开原文件
- Use the prefabricated module `mo:caffeineai-email-calendar-events/calendarEvents.mo` which cannot be modified.
SKILL.md:89来自说明文档打开原文件
- This component depends on [extension-email](../extension-email/SKILL.md) for sending calendar event emails.- Use the sendCalendarEvent function. 
从这里开始 · 工作说明SKILL.md
extension-email-calendar-events
连线表示工作说明包含的模块,不是实际运行顺序。点击模块可查看原文。
文件与检查记录1 个文件

检查范围与遗漏

逐文件查看涉及的内容

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

  • SKILL.md已纳入全文

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

  • SKILL.md工作说明

代码和说明中提到的操作

连接外部网站
SKILL.md:13来自说明文档打开原文件
# Email — Calendar EventsCalendar events email extension for [Caffeine AI](https://caffeine.ai?utm_source=caffeine-skill&utm_medium=referral).
读取了多少行
348
文件校验值(用于核对版本)
40cdaf69b046648fd49c35345e94c30cdc38868b1977cbd80867b9a5c3bdd2a6