Атака по короткому адресу
(Short Address Attack
)существовать Эфириумзначит использовать Эфириум Шестнадцатеричный формат адреса(40персонажи,т.е. 20 байт) и некоторые уязвимости в неправильной обработке параметров адреса некоторыми смарт-контрактами.,Средство атаки для выполнения вредоносных операций. Эта атака в основном происходит, когда смарт-контракт неправильно проверяет длину параметра адреса.,Хотя реальная длина адреса Эфириума фиксирована,Однако злоумышленник может попытаться передать более короткую адресную строку.,Попытайтесь обманом заставить контракт выполнить неожиданную функцию.
В Solidity переменные типа адрес всегда занимают 20 байт, поэтому передача короткого адреса напрямую не вызовет проблем, поскольку Solidity автоматически заполнит его до 20 байт. Однако некоторые контракты могут получать данные из внешних вызовов, и если эти данные неправильно интерпретируются как адрес, а контракт не обрабатывает и не проверяет эти данные правильно, могут возникнуть атаки на короткие адреса.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract VulnerableContract {
address public owner;
constructor() {
owner = msg.sender;
}
// Неправильная попытка преобразовать произвольные данные в адрес
function setAddress(bytes data) public {
// Примечание. Здесь используется неправильный метод преобразования данных в адрес.
// Фактически, если длина данных меньше 20 байт, это приведет к неверному адресу.
assembly {
owner := mload(add(data, 0x14)) // Загрузите 20 байт данных и назначьте их владельцу.
}
}
function getOwner() public view returns (address) {
return owner;
}
}
В этом примере VulnerableContract имеет общедоступную функцию setAddress, которая принимает данные параметра bytes и пытается проанализировать их в адрес в низкоуровневой сборке, а затем устанавливает его в качестве владельца контракта. Если длина данных, переданных злоумышленником, меньше 20 байт, Solidity автоматически заполнит оставшиеся байты 0, что может привести к тому, что в качестве владельца будет установлен неверный адрес.
Предположим, злоумышленник создает данные длиной менее 20 байт (например.,Содержит только 10 байт полезной нагрузки),и позвониsetAddress
функция。ХотяSolidityНедостающая часть будет автоматически заполнена0,Но если контракт не проверяет и не обрабатывает эту ситуацию правильно,Тогда владельцу может быть присвоен неожиданный адрес.,Это может быть неверный адрес или адрес, контролируемый злоумышленником.
Для защиты от атак по коротким адресам разработка смарт-контрактов должна: