更新时间:2025-04-19 01:00:12 编辑:丁丁小编
来源:点击查看
简介
背景
昨天下午,我正忙着整理APT攻击相关的资料,山哥(@im23pds)突然一脸兴奋地跑到我桌边:“Thinking,我发现了一个有意思的项目,CZ也在用,我们可能可以0成本和CZ打个招呼。”于是我们立刻开始讨论,列出了几个可能的漏洞点:劫持CZ在ReachMe上的账号、修改CZ在ReachMe上的设置、以及不花钱给CZ发消息,绕过每条消息需要1 BNB的限制。经过大约10分钟的探索,我们发现了一个可以在ReachMe.io上以低成本与任意用户打招呼的漏洞。我们立刻联系了项目团队,并提供了漏洞验证的详细信息。项目团队迅速修复了漏洞,并联系我们进行复测。不得不为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上给我发私信,费用将用于慈善”。
我们注意到,和CZ打招呼的成本是1枚BNB,于是我们开始设想各种方案,尝试如何绕过这个1枚BNB的限制来和CZ打招呼。
经过一番研究,我们发现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)发送给合约。
由于ReachMe在设计之初并没有将KOL预设的发消息成本放在合约中进行检测(或许是为了方便KOL更好地随时调整消息的价格并且节省Gas费?),因此可以通过修改前端代码、修改网络响应包或者直接与合约进行交互来绕过1 BNB的限制。这是由于服务端在检索链上交易时也遗漏了消息价格与链上交易的BNB数量的检查。
于是,我们用了大约10分钟,成功绕过了和CZ对话需要花费1 BNB的规则,只花了0.01 BNB就和CZ打了招呼。
另外,值得注意的是,其实还有更深一步的利用,比如:给CZ发有趣的消息,进行鱼叉钓鱼?考虑到CZ本人影响较大,我们放弃了这部分测试。大家也要多注意安全,谨防钓鱼。
总结
这类结合中心化与去中心化的产品设计,经常会出现链上和链下的安全检查不一致的情况。因此,攻击者可以通过分析链上链下的交互流程,绕过某些检查限制。慢雾安全团队建议项目方尽可能在链上和链下的代码中同步必要的安全检查项,避免被绕过的可能。同时,建议聘请专业的安全团队进行安全审计,以发现潜在的安全风险并加以防范。