【问题标题】:A security issue with require(send()) in SoliditySolidity 中 require(send()) 的安全问题
【发布时间】:2021-05-11 22:12:03
【问题描述】:

我正在开发一个基于区块链的 uni 项目,我必须审核我们的系统,检查已知攻击等。 这是我检查的文件,主要是因为我首先开始处理智能合约问题: Known-attack ethereum smart contract

我无法理解“Dos With (unexpected) revert attack”部分中使用的示例。我分享代码:

    // INSECURE
contract Auction {
    address currentLeader;
    uint highestBid;

    function bid() payable {
        require(msg.value > highestBid);

        require(currentLeader.send(highestBid)); // Refund the old leader, if it fails then revert

        currentLeader = msg.sender;
        highestBid = msg.value;
    }}

他们说,攻击者可以强制每次都恢复投标,因此没有人能够投标,这将使攻击者默认赢得拍卖。 但是..他会怎么做,那是我不明白的部分。我们是否同意至少这份合同是“有效的”,而不是有效载荷?如果有效载荷是合同,任何人都可以提供示例/解释吗?

我要补充一点,如果我在这里引用一个可靠的合同,我们与 Vyper 合作,但从我之前读到的内容来看,这仍然是一个我也会在那里找到的问题。

提前致谢!

【问题讨论】:

    标签: ethereum solidity smartcontracts vyper


    【解决方案1】:

    如果send()目标地址是智能合约,它将执行fallback function

    如果currentLeader 指向具有后备功能的智能合约,该功能有意在发送失败时恢复,则bid() 将不适用于任何参与者,直到currentLeader 被更改。

    More information here.

    这不是“DoS”攻击,而只是 Solidity 编程中的陷阱。

    【讨论】:

    • 我明白了,所以在这种特定情况下,合约应该在将其作为“当前领导者”之前检查 msg.sender 地址是否不是智能合约的地址?另外,您说这是 Solidity 编程中的一个陷阱,但我们不能在 vyper 上也想象一下吗?
    • 无论send() 是否失败或有不同的设计,合约都应该正常工作,这样send() 就不会在bid() 的上下文中被调用。无论您使用的是 Solidity 还是 Vyper,EVM 字节码都是相同的。
    • 好的,我想我得到了我想要的,谢谢你分享你的知识!
    猜你喜欢
    • 1970-01-01
    • 2013-12-26
    • 1970-01-01
    • 2022-08-12
    • 2023-03-12
    • 1970-01-01
    • 2021-11-15
    • 2018-02-20
    • 1970-01-01
    相关资源
    最近更新 更多