Post
Topic
Board Хайпы
АУДИТ КОНТРАКТА GORGONA.IO
by
yanarod
on 13/09/2018, 14:54:44 UTC
Добрый день, я являюсь разработчиком контрактов на Solidity уже более года.
Ко мне обратился знакомый с просьбой аудита контракта по адресу
0x4a5fc826441a16b86aa850b3ddc4b1bc02f21b6c
На сколько я понял это gorgona.io

Я провел аудит данного контракта и тут постараюсь изложить то, что я нашел.

Объяснение, прочитайте ВНИМАТЕЛЬНО
(код ОБЯЗАТЕЛЬНО смотрите на etherscan.io, на github можно выкладывать измененную версию)

1. На сайте ребята заявляют, что контракт с функцией "отказа от владения".
На деле это не так.

У контракта есть владелец и это есть в коде:
Code:
// 38 строка
owner = msg.sender;  
Это строка обозначает что контракт хранит адрес владельца в переменной owner.

Сама по себе это строчка ничего губительного не делает, пока она только подтверждает что это контракт БЕЗ "отказа от владения" и ребята врут.

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;
}

Упрощенная суть строчки такая: взять значение депозита и посчитать начисленный процент учитывая разницу во времени, она считается вот этим отрывком кода
Code:
(now - investors[addr].date)
Дословно читать ее как "сейчас минус дата последнего вывода средств"

3. А теперь фокус: ВЛАДЕЛЕЦ КОНТРАКТА МОЖЕТ ПОМЕНЯТЬ ДАТУ ВЫВОДА СРЕДСТВ У ЛЮБОГО УЧАСТНИКА

Вот эта часть кода:
Code:
// 167 - 170 строки
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


Результат: вывод всей кассы ВОЗМОЖЕН владельцем контракта


Я крайне не рекомендую вкладыватся в подобные проекты.
На этой неделе у меня есть свободное время, я постараюсь сделать аудиты других контрактов.