Emirate Coin — это токен стандарта ERC20, построенный на базе Ethereum. Более подробную информацию можно найти на домашней странице проекта по адресу emiratecoin.io. Команде Trustless Design было предложено провести аудит безопасности смарт-контрактов.

Аудиторы

Аудит провели Логан Саэтер и Даниэль Кмак из Trustless Design.

Введение

Кодовая база состоит из двух смарт-контрактов: EmcoToken.sol и EmcoVoucher.sol. Контракты написаны на языке смарт-контрактов Solidity и используют библиотеку стандартов OpenZeppelin.

В дополнение к смарт-контрактам нас также попросили проверить файлы JavaScript, связанные с сервером, который будет генерировать ваучеры.

Мы обнаружили, что кодовая база содержит набор автоматизированных тестов с использованием фреймворка Truffle, который был полезен при проверке бизнес-логики смарт-контрактов. Мы добавили и написали свои собственные автоматизированные тестовые примеры, участвуя в процессе аудита.

ЭмкоТокен

EmcoToken — это стандартный токен ERC20, который содержит некоторую пользовательскую логику, реализованную поверх основной функциональности. Пользовательская логика обрабатывает специальный вариант использования EmcoToken, чтобы фактически увеличить количество токенов на mine. Хотя пользователи всегда сохраняют контроль над всеми своими токенами, на практике существует 2 баланса: стандартный баланс ERC20 и настраиваемый баланс майнинга. Пользователи могут переключать токены между этими двумя балансами в определенных глобальных пределах. Чем выше баланс майнинга пользователя, тем большую прибыль он получает.

Проблемы

Уязвимостей КРИТИЧЕСКОГО уровня не обнаружено.

[СРЕДНЯЯ] Стандартная функция ERC20 balanceOf была перезаписана, чтобы возвращать баланс как стандартного баланса пользователя, так и баланса майнинга. Сумма токенов, возвращаемая этой функцией, может представлять собой токены, которые нельзя передать (из-за того, что они заблокированы в балансе майнинга, который необходимо сначала вывести). Рекомендуется, чтобы функция balanceOf вернулась к стандартной логике и либо была добавлена ​​новая функция totalTokensOwned, которая будет возвращать значение обоих отдельных балансов пользователя, либо расчет просто выполнялся на клиенте. боковое приложение, сложив вместе общие значения, возвращенные из двух вызовов.

Ниже приводится дополнительная информация о том, почему мы считаем, что это проблема средней серьезности.

В таких интерфейсах, как MetaMask, MyCrypto, MyEtherWallet или других, предполагается, что функция ERC20 balanceOf возвращает токены, которые могут быть немедленно переданы. Пользователи увидят, что у них есть токены, и подумают, что могут их передать, но на самом деле смарт-контракты не позволят им это сделать, потому что некоторые токены могут находиться на балансе майнинга.

Это может сделать токен проблематичным для использования с децентрализованными биржами (в некоторых случаях, когда пользователи держат некоторое количество токенов на балансе майнинга) и популярными кошельками, такими как MetaMask. Даже если эта логика учитывается в пользовательском приложении, пользователи все равно могут попытаться использовать общие интерфейсы, найденные в кошельках, и запутаться.

[LOW] Параметры currentDay и currentDayDeposited перезаписываются для каждого нового дня, это делает определенные вещи проблематичными, что приводит к коду, подобному найденному в функции getCurrentDayDeposited(), которая явно проверяет, что currentDay был обновлен. Обновление происходит только тогда, когда кто-то вызывает функцию depositToMiningBalance. Это может привести к устареванию переменной currentDay.

Более элегантным решением было бы преобразовать параметр currentDayDeposited в mapping(uint256 => uin256), в котором currentDay стало бы key, а внесенная сумма была бы значением. Логика в контракте может быть изменена, чтобы воспользоваться этим преимуществом, что улучшит вспомогательные функции, такие как getDepositsForDay(uint256 _day), которые также будут отображать историю депозитов.

EmcoВаучер

Контракт EmcoVoucher отвечает за активацию ваучеров. Ваучеры похожи на доказательства токенов, которые отправляются в этот смарт-контракт, чтобы обменять их на настоящие токены.

Проблемы

[CRITICAL] setSignerAddress позволяет любому установить адрес, который сверяется с подписью, открывая возможность для кого-либо украсть все токены, содержащиеся в контракте ваучера, за 2 транзакции. Злоумышленник сначала установит адрес, для которого он владеет закрытым ключом, как signerAddress, используя функцию public setSignerAddress, а затем отправит поддельный ваучер, который они подписали своим собственным ключом, в контракт, который имеет полный контроль над всеми средствами токенов. в контракте.

Примечание. Нам известно, что об этой проблеме уже сообщалось внутри команды разработчиков Emirate Coin, но она присутствовала в проверенной нами версии кодовой базы, поэтому мы все же включили ее сюда.

[LOW] Средства для оплаты ваучера никак не защищены. Ваучер может быть сгенерирован для пользователя, но в контракте может быть ноль токенов.

Решение

Пользователь или приложение может проверить, является ли ваучер «выполнимым» (если на данный момент в контракте ваучера достаточно средств для выполнения ваучера).

[LOW] Используйте фиксированные версии зависимостей, чтобы избежать нарушения контрактов в будущем из-за обновлений. Это простое решение, которое в некоторых случаях может привести к проблемам средней и высокой степени серьезности. Если, например, выпущена новая версия openzeppelin, которая изменяет используемые базовые контракты, новая развернутая версия может иметь совершенно другую логику выполнения.

Мы рекомендуем использовать 1.12 версию OpenZeppelin. Это связано с тем, что скоро выйдет версия 2, в которой многое изменится, включая удаление StandardToken, от которого зависит контракт токена.

[LOW]В разделе технического документа «Автоматическая продажа токена» упоминаются функции: CreateTradeBundle и BuyTradeBundle, которых нет в смарт-контракте.

Решение

Обновите технический документ.

Сервер ваучеров

Сервер ваучеров — это небольшой сервис, который занимается генерацией ваучеров. Он был написан на JavaScript.

Проблемы

Уязвимостей КРИТИЧЕСКОГО уровня не обнаружено.

[СРЕДНЯЯ]Контракт ваучера требует, чтобы одноразовый номер отличался от 0 при активации ваучера, но для первого сгенерированного ваучера одноразовый номер фактически равен 0. Это делает первый ваучер непригодным для использования.

Решение

Заставить сервер генерировать одноразовые номера, начиная с 1.

Замечание по развертыванию Voucher Server:

Система ваучеров должна быть защищена и использоваться внутри закрытого сервера (размещенного на закрытом порту, недоступного за пределами машины, на которой она запущена). Еще лучше было бы поместить его за другим сервером, который мог бы передавать ему некоторые вызовы.

Эта рекомендация связана с тем, что сервер имеет скрытый доступ к закрытому ключу подписывающей стороны и не имеет других ограничений в создании новых ваучеров.

Резюме

Обнаружена только одна высокоприоритетная проблема или уязвимость, которая в настоящее время исправляется. Аудиторская группа Trustless Design подтверждает безопасность смарт-контрактов Emirate Coin и рекомендует любопытным читателям ознакомиться с проектом.

Если вы хотите, чтобы мы провели аудит ВАШЕГО проекта, напишите нам в Telegram (Даниил или Логан). Кроме того, вы можете отправить электронное письмо на адрес [email protected].

Мы живем и дышим блокчейном и очень серьезно относимся к безопасности этих систем. Не стесняйтесь — мы отвечаем на все письма.