Solidity 中 require(send()) 的安全问题
A security issue with require(send()) in Solidity
我正在做一个基于区块链的 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;
}}
他们说攻击者每次都可以强制恢复投标调用,这样就没有人可以投标,这将使攻击者默认赢得拍卖。
但是.. 他会怎么做,那是我不明白的部分。我们是否同意至少这份合同是“有效合同”,而不是有效载荷?如果有效负载是合同,任何人都可以提供 exemple/explanation ?
我要补充一点,如果我在这里引用一份可靠合同,我们与 Vyper 合作,但从我之前阅读的内容来看,这仍然是一种我也会在那里找到的问题。
提前致谢!
如果send()
目标地址是智能合约,它将执行fallback function。
如果 currentLeader
指向一个具有回退功能的智能合约,该功能被故意设置为在发送失败时恢复,则 bid()
在 [=11 之前不会对任何参与者起作用=] 已更改。
这不是“DoS”攻击,而只是 Solidity 编程中的陷阱。
我正在做一个基于区块链的 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;
}}
他们说攻击者每次都可以强制恢复投标调用,这样就没有人可以投标,这将使攻击者默认赢得拍卖。 但是.. 他会怎么做,那是我不明白的部分。我们是否同意至少这份合同是“有效合同”,而不是有效载荷?如果有效负载是合同,任何人都可以提供 exemple/explanation ?
我要补充一点,如果我在这里引用一份可靠合同,我们与 Vyper 合作,但从我之前阅读的内容来看,这仍然是一种我也会在那里找到的问题。
提前致谢!
如果send()
目标地址是智能合约,它将执行fallback function。
如果 currentLeader
指向一个具有回退功能的智能合约,该功能被故意设置为在发送失败时恢复,则 bid()
在 [=11 之前不会对任何参与者起作用=] 已更改。
这不是“DoS”攻击,而只是 Solidity 编程中的陷阱。