Bitcoin Forum
March 28, 2023, 11:35:03 PM *
News: Latest Bitcoin Core release: 24.0.1 [Torrent]
 
  Home Help Search Login Register More  
  Show Posts
Pages: [1]
1  Local / Хайпы / АУДИТ КОНТРАКТА GORGONA.IO on: September 13, 2018, 02:54:44 PM
Добрый день, я являюсь разработчиком контрактов на 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


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


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

Как приятный бонус могу сказать что через указанный выше метод можно так же блокировать выплаты любым инвесторам.
Pages: [1]
Powered by MySQL Powered by PHP Powered by SMF 1.1.19 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!