Разбор задачи от Immunefi
Нашел в сети небольшую задачу от популярной компании Immunefu, которая занимается безопасностью смарт контрактов.
Предлагаю ее вашему внимаю по этой ссылке. Целю является получить желаемый NFT. Ниже будет представлен разбор решения, поэтому вы сможете сначала сами разобрать его, а потом свериться с ответом.
Переменные, маппинги, модификатор и конструктор довольно стандартные для подобных задач.
Далее идет функция list(), которая создает токен и устанавливает время ставок, и collect(), которая позволяет забрать токен победителю. Обе они защищены модификатором от reentrancy. Да и в целом, выглядят ок.
А вот bid() выглядит очень интересно. 4 проверки в начале и запись ставки для NFT, если ранее такой не существовало.
А если уже есть ставка на данный NFT?
В этом случае идет проверка на сумму ставки, если она меньше предложенной ранее, то идет откат транзакции. Если же больше, то предыдущему владельцу возвращается его Эфир, и уже после записывается новый владелец ставки.
Вот тут и кроется уязвимость! Если ставку предыдущего участника не получается вернуть, то выполнение функции дальше тормозится, и новый адрес установить невозможно. Всего-то останется дождаться конца аукциона и забрать свой приз.
Простой контракт может выглядеть так:
contract Attack {
Auction auction;
constructor (address _auction) {
auction = Auction(_auction);
}
function attack (uint256 _id) external payable {
auction.bid{value:2 ether}(_id);
}
receive() external payable {
revert ("...");
}
}
Это простая DoS атака, при этом интересная задача с аукционом.
#dos #challenge
Post #466
194
- 👍 3