作者:23pds & Thinking
編輯:Sherry
背景
昨天,當我還在整理APT 攻擊相關的素材時,山哥(@im23pds) 突然激動地來到我的工位旁邊:「Thinking,我發現了一個有趣的項目,CZ 在高頻使用,我們或許可以0 成本和CZ Say Hi。」於是我們迅速擬定了幾個可能的漏洞點:
- 劫持CZ 在ReachMe 的帳號;
- 更改CZ 在ReachMe 的設定;
- 不花錢給CZ 發訊息,繞過給他發訊息要花費1 BNB 的限制。
大約在10 分鐘後,我們發現可以在ReachMe.io 低成本和任何用戶Say Hi 的漏洞,於是我們第一時間聯繫了專案方團隊,並提供漏洞驗證的詳情。專案團隊也在第一時間迅速修復了漏洞,同時聯絡我們進行複測。為ReachMe 團隊認真嚴謹對待安全問題的態度點讚!
(https://x.com/SlowMist_Team/status/1905212712956665896)
此外,慢霧安全團隊很榮幸獲得了CZ 和ReachMe 專案方團隊的致謝。
(https://x.com/cz_binance/status/1905240886986039437)
發現過程
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 的對應詞字段。
並且給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 Say Hi。
另外,值得注意的是,其實還有更深一步的利用,如:給CZ 有趣的消息,進行魚叉釣魚?鑑於CZ 本人影響較大,後面就放棄了這部分測試,大家也多注意安全,謹防釣魚。
總結
這類結合中心化與去中心化的產品設計,常會出現鏈上和鏈下的安全檢查不一致的情況。因此,攻擊者可以透過分析鏈上鏈下的互動流程,繞過某些檢查限制。慢霧安全團隊建議專案方盡可能在鏈上和鏈下的程式碼中同步必要的安全檢查項,避免被繞過的可能。同時,建議聘請專業的安全團隊進行安全審計,以發現潛在的安全風險並加以防範。