假錢換真錢,揭秘 Pickle Finance 被黑過程

by :  [email protected]慢霧安全團隊

據慢霧區情報,2020 年 11 月 22 日,以太坊 defi 專案 pickle finance 遭受攻擊,損失約 2000 萬 dai。慢霧安全團隊第一時間跟進相關事件並進行分析,以下為分析簡略過程。

攻擊流程簡析

1、專案的 controller 合約中的 swapexactjarforjar 函式允許傳入兩個任意的 jar 合約地址進行代幣的兌換,其中的 _fromjar, _tojar, _fromjaramount, _tojarminamount 都是使用者可以控制的變數,攻擊者利用這個特性,將 _fromjar 和 _tojar 都填上自己的地址,_fromjaramount 是攻擊者設定的要抽取合約的 dai 的數量,約 2000 萬 dai。

2、使用 swapexactjarforjar 函式進行兌換過程中,合約會透過傳入的 _fromjar 合約和 _tojar 合約的 token() 函式獲取對應的 token 是什麼,用於指定兌換的資產。而由於 _fromjar 合約和 _tojar 合約都是攻擊者傳入的,導致使用 token() 函式獲取的值也是可控的,這裡從 _fromjar 合約和 _tojar 合約獲取到的 token 是 dai。

3. 此時發生兌換,controller 合約使用 transferfrom 函式從 _fromjar 轉入一定量的 ptoken,但是由於 fromjar 合約是攻擊者控制的地址,所以這裡轉入的 ptoken 是攻擊者的假幣。同時,因為合約從 _fromjar 合約中獲取的 token 是 dai,然後合約會判斷合約裡的資金是否足夠用於兌換,如果不夠,會從策略池中贖回一定量的代幣,然後轉到 controller 合約中。在本次的攻擊中,合約中的 dai 不足以用於兌換,此時合約會從策略池中提出不足的份額,湊夠攻擊者設定的 2000 萬 dai。

4. 兌換繼續,controller 合約在從策略池裡提出 dai 湊夠攻擊者設定的 2000 萬 dai 後,會呼叫 _fromjar 的 withdraw 函式,將攻擊者在第三步轉入的假 ptoken burn 掉,然後合約判斷當前合約中 _tojar 合約指定的 token 的餘額是多少,由於 _tojar 合約指定的 token 是 dai,controller 合約會判斷合約中剩餘 dai 的數量,此時由於 第三步 controller 合約已湊齊 2000 萬 dai,所以 dai 的餘額是 2000 萬。這時 controller 合約呼叫 _tojar 合約的 deposit 函式將 2000 萬 dai 轉入攻擊者控制的 _tojar 合約中。到此,攻擊者完成獲利。

總結

此次攻擊中,攻擊者透過呼叫 controller 合約中的 swapexactjarforjar 函式時,偽造 _fromjar 和 _tojar 的合約地址,透過轉入假幣而換取合約中的真 dai,完成了一次攻擊的過程。


免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读