ReachMe.io 漏洞分析:低成本和 CZ Say Hi
昨天,当我还在整理 APT 攻击相关的素材时,山哥(@im23pds) 突然激动地来到我的工位旁边:“Thinking,我发现了一个有趣的项目,CZ 在高频使用,我们或许可以 0 成本和 CZ Say Hi。“于是我们迅速拟定了几个可能的漏洞点:
- 劫持 CZ 在 ReachMe 的账号;
- 更改 CZ 在 ReachMe 的设置;
- 不花钱给 CZ 发消息,绕过给他发消息要花费 1 BNB 的限制。
大约在 10 分钟后,我们发现可以在 ReachMe.io 低成本和任意用户 Say Hi 的漏洞,于是我们第一时间联系了项目方团队,并提供漏洞验证的详情。项目团队也在第一时间就迅速修复了该漏洞,同时联系我们进行复测。为 ReachMe 团队认真严谨对待安全问题的态度点赞!

此外,慢雾安全团队很荣幸获得了 CZ 和 ReachMe 项目方团队的致谢。

发现过程
ReachMe.io 是一个基于 BNB Chain 的付费聊天平台,旨在通过加密货币支付机制连接 KOL(关键意见领袖)与粉丝。用户向 KOL 发送私信需支付 BNB,KOL 可获得 90% 费用(平台抽成 10%);若 KOL 5 天内未回复,用户可获 50% 退款。
2025 年 3 月 27 日,币安创始人 CZ 将其 X 账号简介改为:“DM: https://reachme.io/@cz_binance (fees go to charity)",即"在 ReachMe 上 DM 我,费用将用于慈善”。
我们可以看到,和 CZ Say Hi 的成本是 1 枚 BNB,于是我们设想了一些方案,并进行尝试,看如何绕过 1 枚 BNB 的限制来和 CZ Say Hi。

和山哥一阵研究后,我们发现 ReachMe 在给任意 KOL 发送消息的时候会通过 /api/kol/message 接口生成消息的概要信息,其中包含 _id 字段,这个字段是在发消息的时候附带到链上合约 Function: deposit(string _identifier, address _kolAddress) 使用,对应的是 _identifier 字段。

并且给 KOL 发送消息附带的 BNB 其实就是调用合约 Function: deposit 附带的 BNB 数量,于是我们构造了一笔交易,将 “Hi CZ” 的消息对应的 _identifier 以及 CZ 的地址,并附带 0.01 BNB(最低仅需 0.001 BNB)发送给合约。


于是我们用了大约 10 分钟,成功绕过了和 CZ 对话要花费 1 BNB 的规则,仅花费了 0.01 BNB 就可以和 CZ Say Hi。

总结
这类结合中心化与去中心化的产品设计,经常会出现链上和链下的安全检查不一致的情况。因此,攻击者可以通过分析链上链下的交互流程,绕过某些检查限制。
这个漏洞的本质是"一致性缝隙”:前端和后端认为 KOL 的消息价格由应用层控制,合约只需要处理转账记录;但服务端在检索链上交易时,默认信任了合约记录的合法性,而没有附加校验 BNB 数量是否与价格匹配。于是链上的"任何金额都可以存"与链下的"必须付够钱才发消息"之间形成了可以被利用的缝隙。
慢雾安全团队建议项目方尽可能在链上和链下的代码中同步必要的安全检查项,避免被绕过的可能。同时,建议聘请专业的安全团队进行安全审计,以发现潜在的安全风险并加以防范。