12月21日,鏈必應-區塊鏈安全態勢感知平台輿情監測顯示,Uniswap V3流動性管理協議Visor Finance於北京時間12月21日晚上10點18分遭受攻擊,總損失約為820萬美元。關於本次攻擊,成都鏈安技術團隊第一時間進行了事件分析。

#1 事件概覽

2021 年12 月21 日晚Visor Finance 官方Twiiter 發布通告稱vVISR 質押合約存在漏洞,發文前已有攻擊交易上鍊。

經過成都鏈安技術團隊分析,攻擊者通過惡意合約利用Visor Finance項目的漏洞,偽造了向Visor Finance的抵押挖礦合約(0xc9f27a50f82571c1c8423a42970613b8dbda14ef)存入2億代幣的交易,從而獲取了195,249,950 vVISR抵押憑證代幣。然後再利用抵押憑證,從抵押挖礦合約中取出了8,812,958 VISR。

#2 事件具體分析

攻擊交易為:

etherscan.io/tx/0x69272

攻擊手法大致如下:

1. 部署攻擊合約

0x10c509aa9ab291c76c45414e7cdbd375e1d5ace8;

2. 通過攻擊合約調用Visor Finance項目的抵押挖礦合約deposit函數,並指定存入代幣數量visrDeposit為1億枚,from為攻擊合約,to為攻擊者地址

0x8efab89b497b887cdaa2fb08ff71e4b3827774b2;

3. 在第53行,計算出抵押憑證shares的數量為97,624,975 vVISR.

4. 由於from是攻擊合約,deposit函數執行第56-59行的if分支,並調用攻擊合約的指定函數;

(1)第57行,調用攻擊合約的owner函數,攻擊合約只要設置返回值為攻擊合約地址,就能夠通過第57行的檢查;

(2)第58行,調用攻擊合約的delegatedTransferERC20函數,這裡攻擊合約進行了重入,再次調用抵押挖礦合約的deposit函數,參數不變,因此抵押挖礦合約再次執行第3步的過程;

(3)第二次執行到第58行時,攻擊合約直接不做任何操作;

5. 由於重入,抵押挖礦合約向攻擊者發放了兩次數量為97,624,975 vVISR的抵押憑證,總共的抵押憑據數量為195,249,950 vVISR。

6. 提現

攻擊者通過一筆withdraw交易

(0x6eabef1bf310a1361041d97897c192581cd9870f6a39040cd24d7de2335b4546),將195,249,950 vVISR兌換為8,812,958 VISR,當時抵押挖礦合約中共有9,219,200 VISR。

7. 通過UniswapV2,攻擊者將5,200,000 VISR兌換為了WETH,兌換操作將UniswapV2中ETH/VISR交易對的ETH流動性幾乎全部兌空,隨後攻擊者將獲得的133 ETH發送到Tornado。

#3 事件复盤

本次攻擊利用了Visor Finance項目抵押挖礦合約RewardsHypervisor的兩個漏洞:

1. call調用未對目標合約進行限制,攻擊者可以調用任意合約,並接管了抵押挖礦合約的執行流程;<- 主要漏洞,造成本次攻擊的根本原因。

2. 函數未做防重入攻擊;<- 次要漏洞,導致了抵押憑證數量計算錯誤,不是本次攻擊的主要利用點,不過也可憑此漏洞單獨發起攻擊。

針對這兩個問題,成都鏈安在此建議開發者應做好下面兩方面防護措施:

1. 進行外部合約調用時,建議增加白名單,禁止任意的合約調用,特別是能夠控制合約執行流程的關鍵合約調用;

2. 函數做好防重入,推薦使用openzeppelin的ReentrancyGuard合約。