零時科技 || BEGO Token 攻擊事件分析

事件背景

零時科技區塊鏈安全情報平台監控到消息,北京時間2022年10月20日,BSC鏈上EGO 合約受到黑客攻擊,攻擊者一次性mint 10,000,000,000,000,000 BEGO 代幣,攻擊者地址為0xde01f6Ce91E4F4bdB94BB934d30647d72182320F,零時科技安全團隊及時對此安全事件進行分析。

零時科技 || BEGO Token 攻擊事件分析

漏洞核心

BgeoToken.mint函數調用時,會對函數簽名進行判斷。但函數簽名十五r,s,v的值由用戶自行傳入,並且對於傳入需要mint的數量沒有限制。

零時科技 || BEGO Token 攻擊事件分析

在判斷簽名的函數中首先執行判斷簽名的長度,只要三個簽名長度相等即可通過驗證。第二步進入for循環調用預編譯的函數ecrecover返回傳入簽名者的地址,但是當r的長度為0時for循環會被跳過直接執行後續步驟,第三步根據第二步for循環中計算出的地址判斷該地址是否存在,同理,當singers的長度為0時循環被跳過,直接返回true。因此當傳入的r,s,v的值全部為空時可以繞過對於簽名的判斷直接進行鑄幣操作。

零時科技 || BEGO Token 攻擊事件分析
零時科技 || BEGO Token 攻擊事件分析
零時科技 || BEGO Token 攻擊事件分析

從攻擊者傳入的數據可知r,s,v的確傳入的是空值,成功mint 10,000,000,000,000,000 BEGO代幣。

零時科技 || BEGO Token 攻擊事件分析

總結及建議

此次攻擊主要是因為對於函數簽名判斷不當造成的,函數簽名可以由用戶自行傳入並且沒有考慮到簽名值為空時不會執行for循環,使得攻擊者可以通過不傳入r,s,v的值繞過判斷,並且在mint函數中沒有對於鑄幣的數量進行限制,使得攻擊者可以一次鑄造大量代幣。

安全建議

  • 建議添加對於簽名值為空時的判斷,避免通過空的簽名繞過檢驗。
  • 建議項目方上線前進行多次審計,避免出現審計步驟缺失