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

Extension Invite Links Skill 安全审计

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

Requests invite-link / RSVP based access where guests can submit responses without login while admin can view responses with login.

第三方安全检查结论

发现安全风险

已检查文件
2
发现的风险
2
会不会运行危险命令?检查是否下载程序后直接运行、让他人远程控制电脑,或藏起要运行的命令。未发现风险
会不会泄露文件和密钥?检查是否发送含密码或密钥的文件,以及代码里是否直接写了密钥。未发现风险
会不会删除文件或一直在后台运行?检查是否大范围删除文件、改写磁盘,或设置自动启动。未发现风险
会不会绕过安全保护?检查是否跳过网站安全验证、开放过多文件权限,或取消操作前的确认。发现 2 项风险
中风险

邀请码被放入 URL 查询参数,可能从浏览器和请求元数据中泄露

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

示例生成包含 `?code=...` 的链接,并从当前页面 URL 直接读取邀请码。查询参数通常会留在浏览器历史、复制记录、代理或服务器日志中,也可能通过后续请求的 Referer 暴露给其他站点。

为什么需要注意

获得仍有效邀请码的人可以冒充受邀者提交 RSVP,污染出席名单;提交内容还会与该邀请码关联。

示例把邀请码作为 `?code=` 查询参数复制并从页面 URL 读取。若邀请码用于控制 RSVP 提交,链接进入浏览器历史、日志或携带完整来源地址的后续请求时,获得者可能冒用邀请码提交或覆盖响应。材料未说明邀请码是否一次性、是否会被日志脱敏或是否设置限制来源信息;用户可要求改用一次性短期代码、提交后清除 URL,并限制日志和 Referrer。

SKILL.md:152来自说明文档打开原文件
  // Auto-populate invite code from URL  useEffect(() => {    const codeFromUrl = new URLSearchParams(window.location.search).get('code');    if (codeFromUrl) setInviteCode(codeFromUrl);  }, []);
查看另外 2 个位置
SKILL.md:210来自说明文档打开原文件
        <button onClick={() => generateInviteCode.mutate()}>Generate New Code</button>        {unusedCodes.map(code => (          <div key={code.code}>            <code>{code.code}</code>            <button onClick={() => navigator.clipboard.writeText(`${window.location.origin}?code=${code.code}`)}>              Copy Link            </button>          </div>
SKILL.md:213来自说明文档打开原文件
            <code>{code.code}</code>            <button onClick={() => navigator.clipboard.writeText(`${window.location.origin}?code=${code.code}`)}>              Copy Link            </button>          </div>
中风险

关键后台授权完全由未提供源码的依赖 mixin 决定

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

Skill 指示应用删除自己的公开端点并禁止重新声明,然后把生成邀请码、读取全部 RSVP 和读取邀请码等操作交给 MixinInviteLinks。材料声称依赖会执行管理员检查,但没有展示实际检查逻辑。

为什么需要注意

如果下载的版本存在缺陷、版本解析到意外代码或 mixin 未正确验证调用者,未授权人员可能生成邀请码,或读取访客姓名、出席状态和有效邀请码。仅隐藏前端管理员页面不会保护这些后台端点。

这段证据能说明什么

迁移说明确实要求删除手写公开端点并由外部 `MixinInviteLinks` 提供功能,同时仅声称该依赖执行管理员检查。所给材料没有 mixin 源码,无法确认生成邀请码、列出邀请码和读取全部 RSVP 的服务端权限检查是否存在且正确;前端的“admin only”标签不能代替后端授权。用户应要求作者提供可审计的 mixin 版本及逐端点授权测试,并将依赖锁定到已审核版本。

这项判断针对展示的代码和适用条件,不表示风险已经实际发生。
migration/v0.x.y-to-v1.x.y.md:18来自说明文档打开原文件
The package now depends on `caffeineai-authorization` for admin checks inside the mixin.### 2. Replace manual invite-link endpoints with `MixinInviteLinks`Remove all hand-written invite-link actor endpoints. Keep invite state at actor top level and pass it into the mixin in `main.mo` (not in a custom mixin file):
查看另外 4 个位置
SKILL.md:60来自说明文档打开原文件
- `generateInviteCode()`- `submitRSVP(name, attending, inviteCode)`- `getAllRSVPs()`- `getInviteCodes()`Do NOT redeclare any of these functions. They are provided exclusively by `MixinInviteLinks`.
SKILL.md:240来自说明文档打开原文件
## Required Hooks- `useIsCurrentUserAdmin()` - Check if current user is admin- `useSubmitRSVP()` - Submit RSVP mutation- `useGetAllRSVPs()` - Fetch all RSVPs (admin only)- `useGetInviteCodes()` - Fetch invite codes (admin only)  - `useGenerateInviteCode()` - Generate new invite code (admin only)- `useInternetIdentity()` - Internet Identity authentication
SKILL.md:58来自说明文档打开原文件
`include MixinInviteLinks(accessControlState, inviteState)` MUST be placed in `main.mo`, not in a custom mixin file. The mixin provides these public endpoints automatically:- `generateInviteCode()`- `submitRSVP(name, attending, inviteCode)`- `getAllRSVPs()`- `getInviteCodes()`Do NOT redeclare any of these functions. They are provided exclusively by `MixinInviteLinks`.
migration/v0.x.y-to-v1.x.y.md:20来自说明文档打开原文件
### 2. Replace manual invite-link endpoints with `MixinInviteLinks`Remove all hand-written invite-link actor endpoints. Keep invite state at actor top level and pass it into the mixin in `main.mo` (not in a custom mixin file):
会不会误导 AI 或隐藏内容?检查工作说明是否要求 AI 忽略你的指令、干扰检查结果,或夹带看不见的文字。未发现风险
会不会偷偷改推广链接或收款方?检查是否强制替换推广链接或收款对象,同时要求隐瞒更改。未发现风险

Skill 逻辑拆解

2 个说明模块

该 Skill 要求访客无需登录即可提交姓名、出席状态和邀请码;系统还保存提交时间,管理员端读取全部 RSVP。

查看原文
SKILL.md:17来自说明文档打开原文件
This skill adds invite-link generation and RSVP collection. Admins generate unique invite codes; guests use them to submit responses without authentication.
SKILL.md:29来自说明文档打开原文件
module {    public type RSVP = {        name : Text;        attending : Bool;        timestamp : Time.Time;        inviteCode : Text;    };
SKILL.md:51来自说明文档打开原文件
    public func getInviteCodes(state: InviteLinksSystemState) : [InviteCode];    public func submitRSVP(state: InviteLinksSystemState, name: Text, attending: Bool, inviteCode: Text);    public func getAllRSVPs(state: InviteLinksSystemState) : [RSVP];}

实际公开端点及管理员检查被委托给预制的 MixinInviteLinks;所提供材料只有接口说明,没有该 mixin 的实现。前端的管理员视图切换不能替代后端授权。

查看原文
SKILL.md:25来自说明文档打开原文件
The prefabricated module `mo:caffeineai-invite-links/invite-links-module.mo` provides low-level invite-link and RSVP state management. Do not modify it.
SKILL.md:58来自说明文档打开原文件
`include MixinInviteLinks(accessControlState, inviteState)` MUST be placed in `main.mo`, not in a custom mixin file. The mixin provides these public endpoints automatically:
SKILL.md:117来自说明文档打开原文件
export default function App() {  const { data: isAdmin } = useIsCurrentUserAdmin();  return (    <div className="min-h-screen bg-gradient-to-br from-purple-100 to-pink-100">      <header className="p-4 bg-white/80 backdrop-blur-sm shadow-sm">        <div className="max-w-7xl mx-auto flex justify-between items-center">          <h1 className="text-3xl font-bold text-purple-800">RSVP</h1>          <LoginButton />        </div>      </header>      <main className="max-w-7xl mx-auto p-4 mt-8">        {isAdmin ? <AdminDashboard /> : <GuestRSVP />}      </main>

升级流程会安装并构建 caffeineai-invite-links 与 authorization 依赖,同时删除应用自己编写的四个端点实现,改由 mixin 独占提供。

查看原文
migration/v0.x.y-to-v1.x.y.md:60来自说明文档打开原文件
- [ ] Bump `caffeineai-invite-links` to `~1.0.0` in `mops.toml`- [ ] Ensure `caffeineai-authorization ~1.0.0` is installed and `include MixinAuthorization(accessControlState, null)` is present in `main.mo`- [ ] Add `let inviteState = InviteLinksModule.initState()` and `include MixinInviteLinks(accessControlState, inviteState)` in `main.mo`- [ ] Remove the four mixin-provided functions from `main.mo` and any custom mixins (keep top-level `InviteLinksModule.initState()`)- [ ] Run `mops install`, `mops build`, and `mops lint`- [ ] Regenerate frontend bindings if your workflow requires it
SKILL.md:65来自说明文档打开原文件
Do NOT redeclare any of these functions. They are provided exclusively by `MixinInviteLinks`.
从这里开始 · 工作说明SKILL.md
extension-invite-links
连线表示工作说明包含的模块,不是实际运行顺序。点击模块可查看原文。
文件与检查记录2 个文件

检查范围与遗漏

逐文件查看涉及的内容

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

  • SKILL.md已纳入全文
  • migration/v0.x.y-to-v1.x.y.md已纳入全文

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

  • SKILL.md工作说明
  • migration/v0.x.y-to-v1.x.y.md配套文件

代码和说明中提到的操作

连接外部网站
SKILL.md:13来自说明文档打开原文件
# Invite Links & RSVPInvite links & RSVP extension for [Caffeine AI](https://caffeine.ai?utm_source=caffeine-skill&utm_medium=referral).
读取了多少行
320
文件校验值(用于核对版本)
380b37fd13327969cd62f36bc5ca4231ca580a21316eb77b545e991d25ad3596