假錢換真錢,揭秘 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. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读