Ко мне обратился знакомый с просьбой аудита контракта по адресу
0x4a5fc826441a16b86aa850b3ddc4b1bc02f21b6c
На сколько я понял это gorgona.io
Я провел аудит данного контракта и тут постараюсь изложить то, что я нашел.
Объяснение, прочитайте ВНИМАТЕЛЬНО
(код ОБЯЗАТЕЛЬНО смотрите на etherscan.io, на github можно выкладывать измененную версию)
1. На сайте ребята заявляют, что контракт с функцией "отказа от владения".
На деле это не так.
У контракта есть владелец и это есть в коде:
Code:
// 38 строка
owner = msg.sender;
Это строка обозначает что контракт хранит адрес владельца в переменной owner.owner = msg.sender;
Сама по себе это строчка ничего губительного не делает, пока она только подтверждает что это контракт БЕЗ "отказа от владения" и ребята врут.
2. Как контракт расчитывает прибыль?
Code:
// 177 - 180 строки
function getInvestorUnPaidAmount(address addr) public view returns (uint)
{
return (((investors[addr].deposit / 100) * INTEREST) / 100) * ((now - investors[addr].date) * 100) / 1 days;
}
function getInvestorUnPaidAmount(address addr) public view returns (uint)
{
return (((investors[addr].deposit / 100) * INTEREST) / 100) * ((now - investors[addr].date) * 100) / 1 days;
}
Упрощенная суть строчки такая: взять значение депозита и посчитать начисленный процент учитывая разницу во времени, она считается вот этим отрывком кода
Code:
(now - investors[addr].date)
Дословно читать ее как "сейчас минус дата последнего вывода средств"3. А теперь фокус: ВЛАДЕЛЕЦ КОНТРАКТА МОЖЕТ ПОМЕНЯТЬ ДАТУ ВЫВОДА СРЕДСТВ У ЛЮБОГО УЧАСТНИКА
Вот эта часть кода:
Code:
// 167 - 170 строки
function setDatePayout(address addr, uint date) onlyOwner public
{
investors[addr].date = date;
}
function setDatePayout(address addr, uint date) onlyOwner public
{
investors[addr].date = date;
}
Дословно читать как:
Назначить ПРОИЗВОЛЬНУЮ дату вывода средсв (uint date) для любого инвестора (addr) и сделать это может только ВЛАДЕЛЕЦ (onlyOwner)
Из этого схема вывода:
Владалец контракта может с любого адреса закинуть, например 10 ETH
Далее вызывать setDatePayout и назначить дату вывода открученную на 1 ГОД назад, контракт это примет за правду, т.к. в коде нет защиты от такого сценария.
Теперь выплаты на этот адрес составят 365 дней * 3 процента = 1095%, т.е. более чем 100 ETH
Результат: вывод всей кассы ВОЗМОЖЕН владельцем контракта
Я крайне не рекомендую вкладыватся в подобные проекты.
На этой неделе у меня есть свободное время, я постараюсь сделать аудиты других контрактов.
Как приятный бонус могу сказать что через указанный выше метод можно так же блокировать выплаты любым инвесторам.