有人利用我的开源项目进行网络钓鱼
摘要
一位开源项目维护者报告称,攻击者滥用了其项目的邀请系统,利用未经验证的注册和已验证的邮箱域名,向超过1.4万人发送了钓鱼邮件。这一事件突显了善意设计如何被恶意利用。
暂无内容
查看缓存全文
缓存时间: 2026/05/29 19:20
# 有人用我的开源项目钓鱼了14000人
来源:https://andrej.sh/posts/phishing-through-my-open-source-project
2026年5月·Andrej Acevski·阅读时间4分钟
周四早上,[Resend](https://resend.com/)给我发了邮件。cloud.kaneo.app的发信配额用完了。我好几天没发过任何邮件。我运营着一个叫[Kaneo](https://github.com/usekaneo/kaneo)的开源项目管理工具——简单,该有的都有,不该有的都没有。云端版本的存在是为了让人们不用搭建Postgres就能试用。它和我自托管用户运行的软件一模一样,直到上周末,它几乎只被那些为团队评估此工具的开发者使用。上周末,有人发现了它。
## 我发现了什么
我SSH登录并执行了一个查询。新创建工作区是这样的:
> 🔒BANKING OPERATION的Paul Brown邀请你加入3.4090_BTC receipt ...
这样的工作区有949个。全部在5月28日三小时内创建完成。每个都来自不同的临时邮箱提供商:yomail.info、dropmail.me、spymail.one。每个账号都创建了一个工作区,其名称就是完整的钓鱼邮件主题行,然后从该工作区向一批陌生人发送了大约100份邀请。总共14520份邀请,大部分是在我睡觉时发出的。
邀请邮件从我的已验证Resend域名发出。主题行就是工作区名称。正文是礼貌的“××邀请你加入Kaneo。点击此处接受”。“点击此处”指向我的实际网站,使邮件看起来很真实,而工作区名称携带了诈骗信息——一个带有追踪后缀的craftum.io链接。
做这件事的人很有耐心。他们显然提前测试过。工作区名称不是随机的,而是遵循模板,银行名称、加密金额和署名轮流变化。他们准备好了收件人列表,很可能是购买的。他们把时间定在UTC时间周四凌晨4点。在Resend的速率检测触发并阻止他们之前,他们大约有90分钟干净的发送时间。等我醒来,一切已经结束。叫醒我的Resend配额警报只是巧合——攻击在几小时前就结束了。
## 最让我困扰的部分
困扰我的不是规模——尽管14000人收到来自我域名的钓鱼邮件已经很糟糕——而是这件事的普通程度。没有漏洞利用,没有漏洞披露,没有让我撰写CVE。攻击者填写了我的注册表单942次,创建了942个工作区,每个发送了大约100份邀请,然后停下。他们完全按照设计使用我的工具。只是这个设计刚好差到让工具适合钓鱼。我后来添加的每道防线(验证码、临时邮箱屏蔽、速率限制、工作区名称过滤)都是如果当时有人以钓鱼操作为视角审视我的注册流程,一个有头脑的人会要求的东西。但我没有。我以“尝试Kaneo的人”为视角审视它,并为此人构建。攻击者没有入侵任何东西,他们只是注意到了一个我忽略的事情:我有一个经过验证的发信域名,却附加在开放、未经验证的注册上——如果你不关心发送内容,这便是一个有用的基础工具。
## 清理工作
我首先撤销了Resend密钥,然后将机器人账号、它们的工作区以及所有14520份邀请导出为CSV,以备Resend需要证据。破坏性操作就是一条Postgres事务:942个用户被封禁,947个工作区被删除,14533份邀请通过外键级联删除。我先用`ROLLBACK`结尾检查计数,再用`COMMIT`提交。总共约一小时。后续的加固(验证码、速率限制、临时邮箱屏蔽、工作区名称过滤、禁止访客账号发送邀请)花了一天。容易的工作并没有让我困扰。
## 我一直在想的事
带有托管云端版本的开源项目处在一个奇怪的位置。项目的全部意义在于陌生人可以阅读代码、fork、自己运行。这就是契约。云端版本只是之上的便利,让不想管理基础设施的人也能试用。但云端版本的威胁模型与自托管版本完全不同。自托管下,运营者和用户是同一个人,或者至少互相认识。对抗性的工作区名称不重要,因为没人会创建;速率限制不重要,因为没有动机向自己发垃圾。在多租户SaaS中,运营者是我,用户是所有其他人,运营者为用户对SaaS接触的每个外部系统所做的每件事背书。Resend分不清是我发送的邀请还是陌生人通过我的项目发送的邀请。我的DKIM签名在两个上面。我一直把cloud.kaneo.app视为“相同的软件,替你托管”。它从来都不仅仅是那样。它是“相同的软件,加上我的Resend声誉、我的IP声誉、我的域名与互联网上每个邮件提供商的关系”。14个月里没人关心。上周四有人关心了。
## 我正在改变的
注册时添加验证码。阻止临时邮箱域名。对邀请端点添加速率限制。设置工作区名称过滤。访客账号不能再发送邀请。这些都不会推送给自托管用户,因为他们的威胁模型不同,我也不想用他们不需要的偏执来拖慢真正的用户。更深层的改变是我对云端层的思考方式。它不再是项目的随意沙盒。它是代表陌生人运行的基础设施,附带所有相应责任。那14000名钓鱼收件人不是我的用户,但我的域名出现在了他们的收件箱里,责任在我。我会保留云端版本,但会缩小它的范围。并且我再也不会假设下一个发现它的人会想要我当初构建它的目的。
相似文章
骗子正在滥用一个微软内部账户发送垃圾链接
骗子正在利用一个通常用于账户提醒的微软内部电子邮件地址发送垃圾链接,可能欺骗收件人。微软表示正在调查并采取行动。
微软的开源工具遭黑客攻击,窃取AI开发者密码
微软在GitHub上的开源项目遭黑客攻击,被植入窃取密码的恶意软件,目标指向使用Claude Code和Gemini CLI等工具的AI开发者。该公司暂时移除了数十个代码仓库,并正在调查这一入侵事件。
我的域名在GitHub Pages上被滥用了
一位开发者发现,他的通配符DNS配置允许任何人通过GitHub Pages在他的域名子域名上托管内容,这凸显了GitHub CNAME解析中一个常见的安全疏忽。
Obsidian 插件被滥用于部署远程访问木马
安全研究人员发现了一场针对金融专业人士的社会工程攻击活动,该活动利用 Obsidian 插件部署 PHANTOMPULSE 远程访问木马。该恶意软件利用一种新颖的基于以太坊区块链的机制进行命令与控制通信,以逃避检测。
数周内第二次,微软软件包被植入凭据窃取器
数周内第二次,微软已验证的开源软件包被植入了凭据窃取恶意软件,影响GitHub上的73个软件包。该攻击与威胁行为者TeamPCP有关,利用被盗的OIDC令牌,并通过云基础设施横向传播。