国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Defi安全--Orion Protocol攻擊事件分析

這篇具有很好參考價(jià)值的文章主要介紹了Defi安全--Orion Protocol攻擊事件分析。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

其它相關(guān)文章可見(jiàn)個(gè)人主頁(yè)

1. Orion Protocol攻擊事件相關(guān)信息

2023年2月2日,在ETH和BSC上的Orion Protocol項(xiàng)目被攻擊,這里以ETH上攻擊為例:

  • 攻擊合約地址:Attacker Contract Address | Etherscan
  • 攻擊者地址:Orion Protocol Exploiter 2 | Address
  • 攻擊交易:Ethereum Transaction Hash (Txhash) Details | Etherscan
  • Phalcon調(diào)用序列分析:0xa6f63fcb6bec881886 | Phalcon Explorer (blocksec.com)

2. Orion Protocol攻擊事件分析

攻擊流程詳解

Eth上的攻擊交易Ethereum Transaction Hash (Txhash) Details | Etherscan

從中我們可以看出,input data為單純的函數(shù)簽名,沒(méi)有參數(shù),只是調(diào)用了一個(gè)攻擊函數(shù)

Defi安全--Orion Protocol攻擊事件分析,區(qū)塊鏈安全,安全事件分析,Defi學(xué)習(xí),安全,區(qū)塊鏈,智能合約

查看對(duì)應(yīng)的phalcon調(diào)用序列:

Defi安全--Orion Protocol攻擊事件分析,區(qū)塊鏈安全,安全事件分析,Defi學(xué)習(xí),安全,區(qū)塊鏈,智能合約

  1. 先進(jìn)行了一系列基礎(chǔ)操作,對(duì)Orion Protocol項(xiàng)目合約進(jìn)行一系列的代幣授權(quán)approve()操作,如USDT和USDC等。

Defi安全--Orion Protocol攻擊事件分析,區(qū)塊鏈安全,安全事件分析,Defi學(xué)習(xí),安全,區(qū)塊鏈,智能合約

  1. 隨后我們可以看到攻擊者調(diào)用了Orion Protocol的depositAsset函數(shù),看一下該函數(shù)的源碼:
    function depositAsset(address assetAddress, uint112 amount) external {
        uint256 actualAmount = IERC20(assetAddress).balanceOf(address(this));
        IERC20(assetAddress).safeTransferFrom(
            msg.sender,
            address(this),
            uint256(amount)
        );
        actualAmount = IERC20(assetAddress).balanceOf(address(this)) - actualAmount;
        generalDeposit(assetAddress, uint112(actualAmount));
    }
  1. 攻擊者向orion Protocol合約轉(zhuǎn)入對(duì)應(yīng)數(shù)量的USDC,將該合約轉(zhuǎn)賬前后的代幣余額,作為用戶存款的數(shù)量,并調(diào)用generateDeposit函數(shù),這一步USDC的存款是為后續(xù)的攻擊做準(zhǔn)備。
  2. 攻擊者調(diào)用Uniswap V2: USDT的閃電貸函數(shù),借出200多萬(wàn)個(gè)USDT

Defi安全--Orion Protocol攻擊事件分析,區(qū)塊鏈安全,安全事件分析,Defi學(xué)習(xí),安全,區(qū)塊鏈,智能合約

  1. 調(diào)用uniswapv2的閃電貸函數(shù),借貸對(duì)應(yīng)的USDT,樂(lè)觀轉(zhuǎn)賬,先將對(duì)應(yīng)的USDT轉(zhuǎn)賬給了攻擊者,后回調(diào)攻擊者的uniswapV2Call函數(shù)
  2. 回調(diào)函數(shù)中,因?yàn)楣粽呦惹按嫒肓薝SDC,現(xiàn)在攻擊者調(diào)用了orion Protocol項(xiàng)目ExchangeWithAtomic合約中的一個(gè)函數(shù)swapThroughOrionPool,orion Protocol提供的代幣交換函數(shù),代幣兌換路徑為[USDC, ATK, USDT],其中ATK為攻擊者提前創(chuàng)建的惡意代幣,將USDC兌換成USDT
  3. 隨后調(diào)用LibPool的doSwapThroughOrionPool的函數(shù),再調(diào)用PoolFunctionality 合約中的doSwapThroughOrionPool函數(shù)
    function swapThroughOrionPool(
        uint112     amount_spend,
        uint112     amount_receive,
        address[]   calldata path,
        bool        is_exact_spend
    ) public payable nonReentrant {
        bool isCheckPosition = LibPool.doSwapThroughOrionPool(
            IPoolFunctionality.SwapData({
                amount_spend: amount_spend,
                amount_receive: amount_receive,
                is_exact_spend: is_exact_spend,
                supportingFee: false,
                path: path,
                orionpool_router: _orionpoolRouter,
                isInContractTrade: false,
                isSentETHEnough: false,
                isFromWallet: false,
                asset_spend: address(0)
            }),
            assetBalances, liabilities);
  1. 進(jìn)一步調(diào)用PoolFunctionality 合約中的 doSwapThroughOrionPool 函數(shù),仔細(xì)看一下函數(shù)源碼,該函數(shù)進(jìn)一步調(diào)用了_doSwapTokens()函數(shù)

  2. 上述代碼中_doSwapTokens()函數(shù)時(shí)進(jìn)行相應(yīng)的輸入,輸出代幣數(shù)量的計(jì)算,跟進(jìn)該函數(shù)的實(shí)現(xiàn)

    function _doSwapTokens(InternalSwapData memory swapData) internal returns (uint256 amountIn, uint256 amountOut) {
        bool isLastWETH = swapData.path[swapData.path.length - 1] == WETH;
        address toAuto = isLastWETH || swapData.curFactoryType == FactoryType.CURVE ? address(this) : swapData.to;
        uint256[] memory amounts;
        if (!swapData.supportingFee) {
            if (swapData.isExactIn) {
                amounts = OrionMultiPoolLibrary.getAmountsOut(
                    swapData.curFactory,
                    swapData.curFactoryType,
                    swapData.amountIn,
                    swapData.path
                );
                require(amounts[amounts.length - 1] >= swapData.amountOut, "PoolFunctionality: IOA");
            } else {
                amounts = OrionMultiPoolLibrary.getAmountsIn(
                    swapData.curFactory,
                    swapData.curFactoryType,
                    swapData.amountOut,
                    swapData.path
                );
                require(amounts[0] <= swapData.amountIn, "PoolFunctionality: EIA");
            }
        } else {
            amounts = new uint256[](1);
            amounts[0] = swapData.amountIn;
        }
        amountIn = amounts[0];

        {
            uint256 curBalance;
            address initialTransferSource = swapData.curFactoryType == FactoryType.CURVE ? address(this)
                : OrionMultiPoolLibrary.pairFor(swapData.curFactory, swapData.path[0], swapData.path[1]);

            if (swapData.supportingFee) curBalance = IERC20(swapData.path[0]).balanceOf(initialTransferSource);

            IPoolSwapCallback(msg.sender).safeAutoTransferFrom(
                swapData.asset_spend,
                swapData.user,
                initialTransferSource,
                amountIn
            );
            if (swapData.supportingFee) amounts[0] = IERC20(swapData.path[0]).balanceOf(initialTransferSource) - curBalance;
        }

        {
            uint256 curBalance = IERC20(swapData.path[swapData.path.length - 1]).balanceOf(toAuto);
            //計(jì)算轉(zhuǎn)賬前的余額
            if (swapData.curFactoryType == FactoryType.CURVE) {
                _swapCurve(swapData.curFactory, amounts, swapData.path, swapData.supportingFee);
            } else if (swapData.curFactoryType == FactoryType.UNISWAPLIKE) {
            //這里的swap函數(shù)完成相應(yīng)的代幣兌換
                _swap(swapData.curFactory, amounts, swapData.path, toAuto, swapData.supportingFee);
            }
            //將賬戶余額與轉(zhuǎn)賬前余額相減,得到新增的金額
            amountOut = IERC20(swapData.path[swapData.path.length - 1]).balanceOf(toAuto) - curBalance;
        }

        require(
            swapData.amountIn == 0 || swapData.amountOut == 0 ||
            amountIn * 1e18 / swapData.amountIn <= amountOut * 1e18 / swapData.amountOut,
            "PoolFunctionality: OOS"
        );

        if (isLastWETH) {
            SafeTransferHelper.safeAutoTransferTo(
                WETH,
                address(0),
                swapData.to,
                amountOut
            );
        } else if (swapData.curFactoryType == FactoryType.CURVE) {
            IERC20(swapData.path[swapData.path.length - 1]).safeTransfer(swapData.to, amountOut);
        }

        emit OrionPoolSwap(
            tx.origin,
            convertFromWETH(swapData.path[0]),
            convertFromWETH(swapData.path[swapData.path.length - 1]),
            swapData.amountIn,
            amountIn,
            swapData.amountOut,
            amountOut,
            swapData.curFactory
        );
    }
  1. 這里進(jìn)行相應(yīng)的代幣兌換,之前的兌換path為[USDC, ATK, USDT],這里通過(guò)PoolFunctionality合約中的_swap()完成相應(yīng)的兌換,跟進(jìn) _swap()函數(shù)的源碼
    function _swap(
        address curFactory,
        uint256[] memory amounts,
        address[] memory path,
        address _to,
        bool supportingFee
    ) internal {
        for (uint256 i; i < path.length - 1; ++i) {
            (address input, address output) = (path[i], path[i + 1]);
            IOrionPoolV2Pair pair = IOrionPoolV2Pair(OrionMultiPoolLibrary.pairFor(curFactory, input, output));
            (address token0, ) = OrionMultiPoolLibrary.sortTokens(input, output);
            uint256 amountOut;

            if (supportingFee) {
                (uint reserve0, uint reserve1,) = pair.getReserves();
                (uint reserveInput, uint reserveOutput) = input == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
                uint256 amountIn = IERC20(input).balanceOf(address(pair)).sub(reserveInput);
                amountOut = OrionMultiPoolLibrary.getAmountOutUv2(amountIn, reserveInput, reserveOutput);
            } else {
                amountOut = amounts[i + 1];
            }

            (uint256 amount0Out, uint256 amount1Out) = input == token0 ? (uint256(0), amountOut) : (amountOut, uint256(0));
            address to = i < path.length - 2 ? OrionMultiPoolLibrary.pairFor(curFactory, output, path[i + 2]) : _to;

            pair.swap(amount0Out, amount1Out, to, new bytes(0));
        }
    }

Defi安全--Orion Protocol攻擊事件分析,區(qū)塊鏈安全,安全事件分析,Defi學(xué)習(xí),安全,區(qū)塊鏈,智能合約

  1. path序列中的[USDC, ATK, USDT],每?jī)蓚€(gè)代幣對(duì)之間存在一個(gè)pair合約,即USDC轉(zhuǎn)到ATK,ATK轉(zhuǎn)到對(duì)應(yīng)的USDT,實(shí)現(xiàn)對(duì)應(yīng)的代幣兌換,攻擊者創(chuàng)建的pair對(duì)合約,這里通過(guò)相應(yīng)的計(jì)算金融模型,得到對(duì)應(yīng)的轉(zhuǎn)賬金額,調(diào)用pair合約中的swap函數(shù),實(shí)現(xiàn)相應(yīng)的代幣轉(zhuǎn)移。

    Defi安全--Orion Protocol攻擊事件分析,區(qū)塊鏈安全,安全事件分析,Defi學(xué)習(xí),安全,區(qū)塊鏈,智能合約

    Defi安全--Orion Protocol攻擊事件分析,區(qū)塊鏈安全,安全事件分析,Defi學(xué)習(xí),安全,區(qū)塊鏈,智能合約

  2. 由于pair對(duì)中的swap函數(shù),進(jìn)行相應(yīng)的轉(zhuǎn)賬,需要調(diào)用ATK代幣的轉(zhuǎn)賬函數(shù),ATK是攻擊者部署的惡意代幣,攻擊者可控,攻擊者這里調(diào)用自身的deposit()函數(shù),調(diào)用ExchangeWithAtomic合約的depositAsset函數(shù),并將閃電貸得到的200多萬(wàn)USDT全部轉(zhuǎn)進(jìn)Orion Protocol的depositAsset()函數(shù)中

  3. 這時(shí)攻擊者在ExchangeWithAtomic 合約中USDT的存款被記賬為了200多萬(wàn),原來(lái)ExchangeWithAtomic 合約的余額為200多萬(wàn),兩者數(shù)值相近(攻擊者設(shè)計(jì)的)

  4. 而通過(guò)swapThroughOrionPool函數(shù)中攻擊者USDC兌換出多少的USDT最終是通過(guò)ExchangeWithAtomic 合約兌換前后的USDT余額計(jì)算的,相當(dāng)于存入的200萬(wàn)USDT被認(rèn)為是USDC兌換出來(lái)的,最后通過(guò)creditUserAssets 函數(shù)來(lái)更新ExchangeWithAtomic 維護(hù)的adress-balance的賬本,攻擊者被認(rèn)為是存入了200+200萬(wàn)

Defi安全--Orion Protocol攻擊事件分析,區(qū)塊鏈安全,安全事件分析,Defi學(xué)習(xí),安全,區(qū)塊鏈,智能合約

  1. 攻擊者進(jìn)行相應(yīng)的閃電貸還款,歸還借出的200多萬(wàn),獲利200多萬(wàn)

Defi安全--Orion Protocol攻擊事件分析,區(qū)塊鏈安全,安全事件分析,Defi學(xué)習(xí),安全,區(qū)塊鏈,智能合約文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-813128.html

  1. 調(diào)用閃電貸,借出WETH,歸還USDT,實(shí)現(xiàn)對(duì)應(yīng)的套利離場(chǎng)

攻擊事件發(fā)生的主要原因

  • doswapThroughOrionPool 函數(shù),兌換路徑攻擊者可控,代幣類型攻擊者可控(惡意代幣)
  • 兌換后更新賬本的記賬方式不正確,利用前后余額計(jì)算(×)
  • 合約兌換功能的函數(shù)沒(méi)有做重入保護(hù)

3. 分析Orion Protocol攻擊事件所需信息

  1. 最關(guān)鍵的一點(diǎn),重入的發(fā)生回調(diào)不在這個(gè)攻擊合約之中,在攻擊者創(chuàng)建的惡意代幣合約之中(可能是這個(gè)案例的特殊情況)
  2. 普適的一點(diǎn):觸發(fā)惡意合約回調(diào)的功能,是在經(jīng)過(guò)5次外部函數(shù)調(diào)用后,才最終調(diào)用到攻擊者的惡意代幣合約中的函數(shù),在我們的工具中是無(wú)法獲得這樣的調(diào)用過(guò)程,全路徑覆蓋不太現(xiàn)實(shí)。

到了這里,關(guān)于Defi安全--Orion Protocol攻擊事件分析的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 2月區(qū)塊鏈安全事件暴漲,因黑客攻擊等損失金額達(dá)4億美元

    2月區(qū)塊鏈安全事件暴漲,因黑客攻擊等損失金額達(dá)4億美元

    2024年2月,各類安全事件損失金額較2023年1月大幅增加。2024年2月發(fā)生較典型安全事件超22起,因黑客攻擊、釣魚(yú)詐騙和Rug Pull造成的總損失金額達(dá)4.22億美元,較1月上漲約103 %。其中攻擊事件約3.47億美元,增長(zhǎng)約110%;釣魚(yú)詐騙事件約1608萬(wàn)美元,下降約52%;Rug Pull事件約5938萬(wàn)美

    2024年03月17日
    瀏覽(30)
  • 【安全月報(bào)】| 3月區(qū)塊鏈安全事件下降,因黑客攻擊等損失金額達(dá)1.58億美元

    【安全月報(bào)】| 3月區(qū)塊鏈安全事件下降,因黑客攻擊等損失金額達(dá)1.58億美元

    零時(shí)科技每月安全事件看點(diǎn)開(kāi)始了!據(jù)一些區(qū)塊鏈安全風(fēng)險(xiǎn)監(jiān)測(cè)平臺(tái)統(tǒng)計(jì)顯示,2024年3月,各類安全事件損失金額較2023年2月大幅下降。3月發(fā)生較典型安全事件超 30 起,因黑客攻擊、釣魚(yú)詐騙和Rug Pull造成的總損失金額達(dá) 1.58 億 美元,較2月下降約 62.5% 。其中攻擊事件約 1.1

    2024年04月09日
    瀏覽(30)
  • [區(qū)塊鏈安全-Damn_Vulnerable_DeFi]區(qū)塊鏈DeFi智能合約安全實(shí)戰(zhàn)(V3.0.0)(已完結(jié))

    很抱歉,很久沒(méi)有更新了。這段時(shí)間,經(jīng)歷了孩子出生、出國(guó)執(zhí)行項(xiàng)目等諸多事情,心里也比較亂,也沒(méi)有思緒去完成挑戰(zhàn)。最近總算閑下來(lái)了,不過(guò)打開(kāi)一看,發(fā)現(xiàn)[Damn-Vulnerable-DeFi]已經(jīng)執(zhí)行到v3.0.0了,很多東西都發(fā)生了變化,為什么不重頭做一下呢?不過(guò)這次我可能會(huì)比較

    2024年02月07日
    瀏覽(17)
  • 創(chuàng)宇區(qū)塊鏈|Inverse Finance 安全事件分析

    北京時(shí)間 2022 年 4 月 2 日晚,Inverse Finance 借貸協(xié)議遭到攻擊,損失約 1560 萬(wàn)美元。知道創(chuàng)宇區(qū)塊鏈安全實(shí)驗(yàn)室第一時(shí)間跟蹤本次事件并分析。 基礎(chǔ)信息 攻擊tx1:0x20a6dcff06a791a7f8be9f423053ce8caee3f9eecc31df32445fc98d4ccd8365 攻擊tx2:0x600373f67521324c8068cfd025f121a0843d57ec813411661b07edc5ff781842 攻

    2023年04月08日
    瀏覽(23)
  • 第67篇:美國(guó)安全公司溯源分析Solarwinds供應(yīng)鏈攻擊事件全過(guò)程

    第67篇:美國(guó)安全公司溯源分析Solarwinds供應(yīng)鏈攻擊事件全過(guò)程

    大家好,我是ABC_123 。本期繼續(xù)分享Solarwinds供應(yīng)鏈攻擊事件的第4篇文章,就是美國(guó)FireEye火眼安全公司在遭受攻擊者入侵之后,是如何一步步地將史上最嚴(yán)重的Solarwinds供應(yīng)鏈攻擊事件溯源出來(lái)的。 注: Mandiant安全公司已被FireEye收購(gòu),但是仍然可以獨(dú)立運(yùn)營(yíng),嚴(yán)格地說(shuō)的,這

    2024年02月03日
    瀏覽(20)
  • 某60區(qū)塊鏈安全之51%攻擊實(shí)戰(zhàn)學(xué)習(xí)記錄

    某60區(qū)塊鏈安全之51%攻擊實(shí)戰(zhàn)學(xué)習(xí)記錄

    1.理解并掌握區(qū)塊鏈基本概念及區(qū)塊鏈原理 2.理解區(qū)塊鏈分又問(wèn)題 3.理解掌握區(qū)塊鏈51%算力攻擊原理與利用 4.找到題目漏洞進(jìn)行分析并形成利用 1.Ubuntu18.04操作機(jī) python2 1.在比特幣網(wǎng)絡(luò)里,你有多少錢,不是你說(shuō)了算,而是大家說(shuō)了算,每個(gè)人都是公證人。 2基于算力證明進(jìn)行

    2024年02月02日
    瀏覽(19)
  • 某60區(qū)塊鏈安全之薅羊毛攻擊實(shí)戰(zhàn)二學(xué)習(xí)記錄

    某60區(qū)塊鏈安全之薅羊毛攻擊實(shí)戰(zhàn)二學(xué)習(xí)記錄

    ` 學(xué)會(huì)使用python3的web3模塊 學(xué)會(huì)分析以太坊智能合約復(fù)雜場(chǎng)景下薅羊毛攻擊漏洞及其利用 找到合約漏洞進(jìn)行分析并形成利用 Ubuntu18.04操作機(jī) python3 薅羊毛攻擊指使用多個(gè)不同的新賬戶來(lái)調(diào)用空投函數(shù)獲得空投幣并轉(zhuǎn)賬至攻擊者賬戶以達(dá)到財(cái)富累計(jì)的一種攻擊方式。這類攻擊方

    2024年02月04日
    瀏覽(20)
  • 某60區(qū)塊鏈安全之薅羊毛攻擊實(shí)戰(zhàn)一學(xué)習(xí)記錄

    某60區(qū)塊鏈安全之薅羊毛攻擊實(shí)戰(zhàn)一學(xué)習(xí)記錄

    學(xué)會(huì)使用python3的web3模塊 學(xué)會(huì)分析以太坊智能合約薅羊毛攻擊漏洞 找到合約漏洞進(jìn)行分析并形成利用 Ubuntu18.04操作機(jī) python3 薅羊毛攻擊指使用多個(gè)不同的新賬戶來(lái)調(diào)用空投函數(shù)獲得空投幣并轉(zhuǎn)賬至攻擊者賬戶以達(dá)到財(cái)富累計(jì)的一種攻擊方式。這類攻擊方式較為普通且常見(jiàn),只

    2024年02月04日
    瀏覽(16)
  • [區(qū)塊鏈安全-CTF Protocol]區(qū)塊鏈智能合約安全實(shí)戰(zhàn)(已完結(jié))

    這次是嘗試CTF-PROTOCOL的題目,望與諸君共勉。后面應(yīng)該會(huì)參考DeFiHackLabs推出對(duì)一些列攻擊的POC手寫和解析,同時(shí)還要參加Hackathon。大家一起努力! 題目分析: HiddenKittyCat 合約中,核心部分為: 可以知道kitty存儲(chǔ)的位置是由 keccak256(abi.encodePacked(block.timestamp, blockhash(block.number

    2024年02月15日
    瀏覽(22)
  • 【信息安全案例】——網(wǎng)絡(luò)攻擊分析(學(xué)習(xí)筆記)

    【信息安全案例】——網(wǎng)絡(luò)攻擊分析(學(xué)習(xí)筆記)

    ?? 前言:隨著信息技術(shù)的發(fā)展,網(wǎng)絡(luò)空間的斗爭(zhēng)可謂是兵家必爭(zhēng)之地,網(wǎng)絡(luò)攻擊的事件層出不窮。道高一尺魔高一丈,了解常見(jiàn)的網(wǎng)絡(luò)攻擊類型有利于我們?nèi)蘸蠊ぷ魃畹陌踩€(wěn)定。 ?? 記一次Vulnstack靶場(chǎng)內(nèi)網(wǎng)滲透(二) ?? 1.2.1 欺騙攻擊 利用TCP/IP協(xié)議本身的一些缺陷對(duì)

    2024年02月08日
    瀏覽(26)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包