Отчет об аудите смарт-контрактов для Dimo

Резюме управления

Димо связался с Sayfer, чтобы провести аудит безопасности их смарт-контракта.

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

За период исследования в 40 исследовательских часов мы обнаружили 14 уязвимостей в контракте. Ни один из них не является критическим.

В заключение следует отметить, что после отчета необходимо внести несколько исправлений, но уровень безопасности системы является компетентным.

После проверки командой Sayfer мы подтверждаем, что все проблемы безопасности, упомянутые в этом отчете, были решены командой Dimo.

Методология риска

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

Наша модель оценки рисков основана на двух ключевых факторах: ВЛИЯНИЕ и ВЕРОЯТНОСТЬ. Под воздействием понимается потенциальный вред, который может возникнуть в результате проблемы, например финансовые потери, репутационный ущерб или неработоспособность системы. Вероятность означает вероятность возникновения проблемы с учетом таких факторов, как сложность контракта и количество потенциальных злоумышленников.

Объединив эти два фактора, мы можем получить полное представление о риске, связанном с конкретной проблемой, и предоставить нашим клиентам четкую и действенную оценку серьезности проблемы. Такой подход позволяет нам расставлять приоритеты в наших рекомендациях и гарантировать, что наши клиенты получат наилучшие советы о том, как защитить свои смарт-контракты.

Риск определяется следующим образом:

Уязвимости по рискам

High – Прямая угроза ключевым бизнес-процессам.
Medium – Косвенная угроза ключевым бизнес-процессам или частичная угроза бизнес-процессам.
Низкий – Прямых угроз нет. Уязвимость может быть использована с использованием других уязвимостей.
Информационный - Этот вывод не указывает на уязвимость, но содержит комментарий, который уведомляет о недостатках дизайна и неправильной реализации, которые могут вызвать проблему в долгосрочной перспективе.

Строгость
# выпусков
High
3
Medium
1
Низкий
5
Информационный
5
критический
0

Подход

Введение

Димо связался с Sayfer, чтобы провести аудит безопасности их смарт-контракта.

В этом отчете документально подтверждено исследование, проведенное Sayfer с использованием выбранных ресурсов, определенных в рамках исследования. В частности, в этом отчете представлен обзор состояния безопасности для вышеупомянутых контрактов.

Обзор области применения

Вместе с командой клиента мы определили следующий контракт как объем проекта.
Commit hash: 14ce58aa499e3672fb0b61da13948a6ea51fb879

 

контракт Ша-256
Награда.sol 86cffc0108ebe977ac55650da60cccc5f790013332186a2cb4dab47d7d38ac87

 

Наши испытания проводились в январе 2024 года.

Не позволяйте этому быть слишком поздно!

Начните свой аудит с Sayfer

Проверка области действия

Мы начали с того, что убедились, что объем, определенный нам клиентом, был технически логичен.
Решение о том, какой объем подходит для данной системы, является частью начального обсуждения.

Модель угрозы

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

Не позволяйте этому быть слишком поздно!

Начните свой аудит с Sayfer

Обзор протокола

Введение протокола

DIMO — это компания, занимающаяся Интернетом вещей в формате web3, которая позволяет пользователям и разработчикам использовать богатый поток данных, генерируемых современными транспортными средствами. Его решение представляет собой экосистему, принадлежащую пользователям, которая позволяет водителям извлекать экономическую выгоду из своих данных и создавать возможные приложения, такие как параметрическое страхование, одноранговый обмен автомобилями и рынки транспортных средств. Децентрализованная платформа также дает разработчикам душевное спокойствие, поскольку их доступ к данным не зависит от прихотей централизованного привратника. Это решение построено на Polygon.

Оценка безопасности

Следующие тестовые случаи были руководством при аудите системы. Этот контрольный список представляет собой модифицированную версию СКСВС v1.2, с улучшенной грамматикой, ясностью, краткостью и дополнительными критериями. При наличии пробела в нумерации первоначальный критерий удалялся. Критерии, отмеченные звездочкой, добавлены нами.

Архитектура, дизайн и моделирование угроз

Архитектура, дизайн и моделирование угроз Название теста
G1.2 Каждому вносимому изменению конструкции предшествует моделирование угроз.
G1.3 Документация четко и точно определяет все границы доверия в контракте (доверительные отношения с другими контрактами и значимыми потоками данных).
G1.4 SCSVS, требования безопасности или политика доступны для всех разработчиков и тестировщиков.
G1.5 Определены события для операций (изменение состояния/критические для бизнеса).
G1.6 Проект включает в себя механизм, который может временно остановить важные функции в случае атаки. Этот механизм не должен блокировать доступ пользователей к их активам (например, токенам).
G1.7 Количество неиспользованных криптовалют, хранящихся в контракте, контролируется и находится на минимально допустимом уровне, чтобы не стать потенциальной целью атаки.
G1.8 Если резервную функцию может вызвать кто угодно, она включается в модель угроз.
G1.9 Бизнес-логика последовательна. Важные изменения в логике должны применяться во всех контрактах.
G1.10 Для обнаружения уязвимостей используются инструменты автоматического анализа кода.
G1.11 Используется последняя основная версия Solidity.
G1.12 При использовании внешней реализации контракта используется самая последняя версия.
G1.13 Когда функции переопределяются для расширения функциональности, ключевое слово super используется для сохранения предыдущей функциональности.
G1.14 Порядок наследования тщательно определен.
G1.15 Есть компонент, который отслеживает активность контракта с помощью событий.
G1.16 Модель угроз включает в себя китовые транзакции.
G1.17 Утечка одного приватного ключа не ставит под угрозу безопасность всего проекта.

Политика и процедуры

Политика и процедуры Название теста
G2.2 Безопасность системы находится под постоянным контролем (например, ожидаемый уровень средств).
G2.3 Существует политика отслеживания новых уязвимостей в системе безопасности и обновления библиотек до последней защищенной версии.
G2.4 С отделом безопасности можно связаться публично, и процедура обработки сообщений об ошибках (например, тщательное вознаграждение за обнаружение ошибок) четко определена.
G2.5 Процесс добавления новых компонентов в систему четко определен.
G2.6 Процесс крупных системных изменений включает моделирование угроз сторонней компанией.
G2.7 Процесс добавления и обновления компонентов системы включает в себя аудит безопасности внешней компанией.
G2.8 В случае взлома существует четкая и хорошо известная процедура смягчения последствий.
G2.9 Процедура в случае взлома четко определяет, какие лица должны выполнять требуемые действия.
G2.10 Процедура включает оповещение других проектов о взломе по доверенным каналам.
G2.11 Определена процедура предотвращения утечки закрытого ключа.

Возможность обновления

Возможность обновления Название теста
G3.2 Перед обновлением делается эмуляция в форке основной сети и на локальной копии все работает как положено.
G3.3 Процесс обновления выполняется с помощью мультиподписного контракта, в котором операцию должны одобрить несколько человек.
G3.4 Временные блокировки используются для важных операций, чтобы у пользователей было время наблюдать за предстоящими изменениями (обратите внимание, что устранение потенциальных уязвимостей в этом случае может быть более сложным).
G3.5 инициализировать () можно вызвать только один раз.
G3.6 инициализировать () может вызываться только авторизованной ролью через соответствующие модификаторы (например, инициализатор, только владелец).
G3.7 Процесс обновления выполняется в одной транзакции, поэтому никто не может запустить его заранее.
G3.8 В обновляемых контрактах зарезервированы пробелы в слотах, чтобы предотвратить перезапись.
G3.9 Количество зарезервированных (в качестве промежутка) слотов было уменьшено соответствующим образом, если были добавлены новые переменные.
G3.10 Порядок объявления переменных состояния контракта и их типы не изменились.
G3.11 Новые значения, возвращаемые функциями, такие же, как и в предыдущих версиях контракта (например, владелец (), баланс (адрес)).
G3.12 Реализация инициализирована.
G3.13 Реализация не может быть уничтожена.

 

Бизнес-логика

Бизнес-логика Название теста
G4.2 Реализация логики контракта и параметров протокола соответствует документации.
G4.3 Бизнес-логика выполняется в последовательном порядке шагов, и невозможно пропустить шаги или выполнить их в порядке, отличном от запланированного.
G4.4 В договоре правильно установлены бизнес-лимиты.
G4.5 Бизнес-логика не полагается на значения, полученные из ненадежных контрактов (особенно при наличии нескольких вызовов одного и того же контракта в одном потоке).
G4.6 Бизнес-логика не зависит от баланса контракта (например, баланс == 0).
G4.7 Конфиденциальные операции не зависят от данных блока (например, хэш блока, метка времени).
G4.8 Контракт использует механизмы, которые смягчают атаки упорядочения транзакций (упреждающие) (например, схемы предварительной фиксации).
G4.9 Контракт не отправляет средства автоматически, а вместо этого позволяет пользователям снимать средства отдельными транзакциями.

Контроль доступа

Контроль доступа Название теста
G5.2 Соблюдается принцип наименьших привилегий. Другие контракты должны иметь доступ только к функциям и данным, для которых у них есть специальное разрешение.
G5.3 Новые контракты с доступом к проверенному контракту по умолчанию придерживаются принципа минимальных прав. Контракты должны иметь минимальные разрешения или вообще не иметь их до тех пор, пока доступ к новым функциям не будет предоставлен явным образом.
G5.4 Создатель контракта соблюдает принцип наименьших привилегий, и его права строго следуют изложенным в документации.
G5.5 Контракт применяет правила контроля доступа, указанные в доверенном контракте, особенно если присутствует контроль доступа на стороне клиента dApp, который можно обойти.
G5.6 Вызовы внешних контрактов разрешены только в случае необходимости.
G5.7 Код модификатора понятен и прост. Логика не должна содержать внешних вызовов недоверенных контрактов.
G5.8 Все атрибуты пользователей и данных, используемые элементами управления доступом, хранятся в доверенных контрактах, и другие контракты не могут ими манипулировать, если только это не разрешено специально.
G5.9 Элементы управления доступом дают сбой безопасно, в том числе при возврате.
G5.10 Если входные данные (параметры функции) проверены, по возможности используется метод положительной проверки (внесение в белый список).

Связь

Связь Название теста
G6.2 Выявляются библиотеки, которые не являются частью приложения (но от которых зависит работа смарт-контракта).
G6.3 Вызов делегата не используется с недоверенными контрактами.
G6.4 Контракты с третьими сторонами не затмевают специальные функции (например, возврат).
G6.5 Контракт не проверяет, является ли адрес контрактом, используя код операции extcodesize.
G6.6 Атаки с повторным входом смягчаются путем блокировки рекурсивных вызовов из других контрактов и следования шаблону Check-Effects-Interactions. Не используйте функцию отправки, если это не является обязательным.
G6.7 Результат низкоуровневых вызовов функций (например, отправить, делегировать вызов, позвонить) из других договоров проверяется.
G6.8 Контракт основывается на данных, предоставленных правильным отправителем, и не зависит от значения tx.origin.

Арифметический

Арифметический Название теста
G7.2 Значения и математические операции устойчивы к целочисленным переполнениям. Используйте библиотеку SafeMath для арифметических операций до Solidity 0.8.*.
G7.3 Непроверенные фрагменты кода из Solidity ≥ 0.8.* не вводят целочисленное недополнение/переполнение.
G7.4 Экстремальные значения (например, максимальные и минимальные значения типа переменной) учитываются и не меняют логическую схему контракта.
G7.5 Нестрогое неравенство используется для балансового равенства.
G7.6 В расчетах используются правильные порядки величин.
G7.7 В расчетах умножение выполняется перед делением для точности.
G7.8 Контракт не предполагает точности с фиксированной точкой и использует множитель или сохраняет как числитель, так и знаменатель.

Отказ в обслуживании

Отказ в обслуживании Название теста
G8.2 Контракт не повторяется по несвязанным циклам.
G8.3 Функция самоуничтожения используется только в случае необходимости. Если это включено в контракт, это должно быть четко описано в документации.
G8.4 Бизнес-логика не блокируется, если субъект (например, контракт, учетная запись, оракул) отсутствует.
G8.5 Бизнес-логика не мешает пользователям использовать контракты (например, стоимость транзакции выше, чем прибыль).
G8.6 Выражения функций assert или require имеют проходной вариант.
G8.7 Если резервную функцию никто не вызывает, она не блокирует функции контракта.
G8.8 В цикле нет затратных операций.
G8.9 В цикле нет обращений к недоверенным контрактам.
G8.10 Если есть возможность приостановить действие договора, возможно и его возобновление.
G8.11 Если используются белые и черные списки, они не мешают нормальной работе системы.
G8.12 Отсутствует DoS, вызванный переполнением и недополнением.

Данные блокчейна

Данные блокчейна Название теста
G9.2 Любые сохраненные данные в контрактах не считаются безопасными или частными (даже частные переменные).
G9.3 В блокчейне не хранятся конфиденциальные данные (пароли, персональные данные, токены и т. д.).
G9.4 Контракты не используют строковые литералы в качестве ключей для отображений. Вместо этого используются глобальные константы для предотвращения атаки Homoglyph.
G9.5 Контракт не тривиально генерирует псевдослучайные числа на основе информации из блокчейна (например, заполнение номером блока).

Использование газа и ограничения

Использование газа и ограничения Название теста
G10.1 Использование газа предполагается, определяется и имеет четкие ограничения, которые нельзя превышать. Ни структура кода, ни злонамеренный ввод не должны вызывать газового истощения.
G10.2 Выполнение функций и функциональность не зависят от жестко запрограммированных сборов за газ (они могут меняться).

Ясность и читабельность

Ясность и читабельность Название теста
G11.2 Логика понятна и разделена на несколько простых контрактов и функций.
G11.3 Каждый контракт имеет короткий комментарий из 1-2 предложений, объясняющий его назначение и функциональность.
G11.4 Используются готовые реализации, это поясняется в комментарии. Если эти реализации были изменены, изменения отмечаются по всему контракту.
G11.5 Порядок наследования учитывается в контрактах, использующих множественное наследование и теневые функции.
G11.6 Там, где это возможно, контракты используют существующий проверенный код (например, контракты токенов или такие механизмы, как принадлежащий) вместо реализации своих собственных.
G11.7 Последовательные шаблоны именования соблюдаются на протяжении всего проекта.
G11.8 Переменные имеют отличительные имена.
G11.9 Все переменные хранения инициализируются.
G11.10 Функции с указанным типом возвращаемого значения возвращают значение этого типа.
G11.11 Используются все функции и переменные.
G11.12 требовать используется вместо возвращаться in if заявления.
G11.13 Ассоциация утверждать используется для проверки внутренних ошибок и требовать Функция используется для обеспечения действительного условия ввода от пользователей и внешних контрактов.
G11.14 Ассемблерный код используется только в случае необходимости.

Покрытие тестов

Покрытие тестов Название теста
G12.2 Нарративы злоупотреблений, подробно описанные в модели угроз, покрываются модульными тестами.
G12.3 Чувствительные функции в проверенных контрактах покрываются тестами на этапе разработки.
G12.4 Реализация проверенных контрактов была проверена на наличие уязвимостей безопасности с использованием как статического, так и динамического анализа.
G12.5 Спецификация контракта была официально проверена
G12.6 Спецификация и результаты формальной проверки включены в документацию.

Децентрализованные финансы

Децентрализованные финансы Название теста
G13.1 Договор кредитора не предполагает изменения его баланса (используемого для подтверждения погашения кредита) только со своими собственными функциями.
G13.2 Функции, которые изменяют баланс кредиторов и/или предоставляют криптовалюту, не подлежат повторному входу, если смарт-контракт позволяет заимствовать криптовалюту основной платформы (например, Ethereum). Он блокирует атаки, которые обновляют баланс заемщика во время оформления срочного кредита.
G13.3 Функции быстрой ссуды могут вызывать только предопределенные функции в контракте-получателе. Если возможно, определите доверенное подмножество вызываемых контрактов. Обычно отзывается контракт на отправку (заимствование).
G13.4 Если он включает потенциально опасные операции (например, отправка большего количества ETH/токенов, чем заимствовано), функция получателя, которая обрабатывает заимствованные ETH или токены, может быть вызвана только пулом и в рамках процесса, инициированного владельцем принимающего контракта или другим доверенным источником (например, мультиподпись).
G13.5 Расчеты доли пула ликвидности выполняются с максимально возможной точностью (например, если вклад рассчитывается для ETH, это должно быть сделано с точностью до 18 знаков — для Wei, а не для Ether). Делимое должно быть умножено на 10 в степени количества десятичных цифр (например, делимое * 10^18 / делитель).
G13.6 Вознаграждения не могут быть рассчитаны и распределены в рамках того же вызова функции, который вносит токены (он также должен быть определен как невозвратный). Это защищает от сиюминутных колебаний акций.
G13.7 Контракты на управление защищены от атак мгновенных кредитов. Одним из возможных методов смягчения последствий является требование процесса депонирования токенов управления и предложения изменений для выполнения в разных транзакциях, включенных в разные блоки.
G13.8 При использовании оракулов в сети контракты могут приостанавливать операции на основе результатов оракулов (в случае взлома оракула).
G13.9 Внешние контракты (даже доверенные), которым разрешено изменять атрибуты контракта проекта (например, цену токена), имеют следующие ограничения: пороги для изменения (например, не более/менее 5%) и лимит обновлений (например, одно обновление в день).
G13.10 Атрибуты контракта, которые могут обновляться внешними контрактами (даже доверенными), отслеживаются (например, с помощью событий) и реализуется процедура реагирования на инциденты (например, во время продолжающейся атаки).
G13.11 Сложные математические операции, состоящие из операций умножения и деления, сначала выполняют умножение, а затем деление.
G13.12 При расчете биржевых цен (например, ETH в токен или наоборот) числитель и знаменатель умножаются на резервы (см. получитьInputPrice функции в UniswapExchange договор).

 

Заказать аудит у Sayfer





    Этот сайт защищен reCAPTCHA и Google Персональные данные и Условия Предоставления Услуг подать заявление.

    Выводы аудита

    [H] Изменение времени Бытия может потенциально нарушить распределение наград.

    ID САЙ-01
    Статус: Исправлена
    Снижение High
    Бизнес Влияние rewardsGenesisTime — это критическая переменная, которая отслеживает время запуска вознаграждений и, таким образом, управляет распределением вознаграждений.

    Размер вознаграждения продолжает снижаться с течением времени, постепенно снижаясь до 85% от предыдущего цикла в какой-то момент в будущем. Следовательно, сброс времени генезиса после начала распределения вознаграждений может нарушить всю схему.

    Адрес — Награда.sol; сбросRewardsGenesisTime()
    — Награда.sol; вручнуюSetRewardsGenesisTime(uint256)

    Описание

    Изменение rewardsGenesisTime позже в цикле позже повлияет на важнейшие переменные currentWeek и WeekLimit и потенциально может испортить всю схему распределения вознаграждений и ее прогнозируемый график.

    риска

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

     function resetRewardsGenesisTime() external onlyRole(ADMIN_ROLE) {
            require(dimoTotalSentOutByContract==0,"Reward Distribution already started");
            rewardsGenesisTime = block.timestamp;
      }

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

     

    [H] Непроверенный отказ администратора

    ID САЙ-02
    Статус: Исправлена
    Снижение High
    Влияние на бизнес Хотя учетным записям администраторов по определению предоставляется определенная степень доверия, в случае их компрометации их можно использовать для слива средств с контракта с помощью этой функции.
    Адрес — Награда.sol; adminWithdraw (адрес, uint256)

    Описание

    Функция adminWithdraw(address, uint256) позволяет администраторам отправлять пользователям средства по контракту без ограничений. Согласно документации, это используется, если пользователи отправляют DIMO на контракт без стейкинга. Однако мы считаем, что этой функцией могут злоупотреблять, как описано в разделе «Влияние на бизнес».

    риска

    Один из возможных способов повышения безопасности — отправить запрос от имени пользователя, возможно, используя учетную запись с ролью oracle. Затем администратор должен одобрить транзакцию. Для одобрения таких транзакций требуется как минимум две учетные записи, что обеспечивает еще один уровень безопасности.

     

    [H] Администраторы могут сбросить реестр по своему желанию.

    ID САЙ-03
    Статус: Признанный
    Снижение High
    Влияние на бизнес Реестр — это место, где хранятся пользовательские данные и выполняются проверки. Если реестр будет сброшен, существующие пользователи перестанут получать вознаграждения, если данные не будут перенесены в новый реестр.
    Адрес — Награда.sol; setRegistryContractAddress (адрес)

    Описание

    setRegistryContractAddress(address) позволяет администраторам сбрасывать адрес реестра по своему желанию.

    риска

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

      function setRegistryContractAddress(
        address registryContractAddress
      ) external onlyRole(ADMIN_ROLE) {
        require(
            registryContractAddress != address(0),
            "registryContractAddress is an invalid zero address"
        );
        require(address(registry)==address(0)),"already set, cannot be set again")
        registry = IRegistry(registryContractAddress);
      }

    Другое решение — настроить процедуру миграции данных. Если такая процедура уже существует, то этот вывод можно смело игнорировать.

     

    [I] У Deployer есть роли администратора и Oracle.

    ID САЙ-04
    Статус: Признанный
    Снижение Информационный
    Влияние на бизнес Мы решили оценить этот вывод как информационный, поскольку он главным образом является следствием основных проблем централизации, описанных выше. При нынешнем построении системы необходимо, чтобы кто-то назначал роли Oracle и администратора и управлял ими. Однако не обязательно, чтобы эта учетная запись сама выполняла эти роли.
    Адрес — Награда.сол:108-111; инициализировать(адрес, адрес, адрес)

    Описание

    Во время инициализации развертыватель получает роли администратора, администратора по умолчанию и Oracle:

    _setupRole(DEFAULT_ADMIN_ROLE, msg.sender);
    
    _setupRole(ORACLE_ROLE, msg.sender);
    _setupRole(ADMIN_ROLE, msg.sender);

    риска

    Рассмотрите возможность предоставления только роли администратора по умолчанию, унаследованной от OA. AccessControlUpgradeable, к развертывателю, что позволяет ему управлять ролями других пользователей.

     

    [M] Использовать AccessControlDefaultAdminRulesUpgradeable

    ID САЙ-05
    Статус: Признанный
    Снижение Medium
    Влияние на бизнес Учитывая присущую контракту централизацию и важность ролей администраторов (и, следовательно, их управления), мы решили оценить этот вывод как средний риск.
    Адрес

    Описание

    Reward.sol в настоящее время использует AccessControlUpgradable для предоставления и управления доступом к критическим функциям. В схеме управления доступом OZ учетная запись, имеющая DEFAULT_ADMIN_ROLE, может предоставлять и отзывать все остальные роли. В текущем состоянии контракта он передается развертывателю при инициализации.

    AccessControlDefaultAdminRulesUpgradeable продолжается AccessControlUpgradable с двумя важными функциями безопасности:

    • Только один аккаунт может содержать DEFAULT_ADMIN_ROLE.
    • DEFAULT_ADMIN_ROLE могут быть переданы только с помощью двухэтапного процесса. Настраиваемая задержка между двумя шагами, changeDefaultAdminDelay, соблюдается.

    риска

    Переключиться с AccessControlUpgradable в AccessControlDefaultAdminRulesUpgradeable.

     

    [L] Недостаточная проверка ввода вручнуюSetRewardsGenesisTime(uint256)

    ID САЙ-06
    Статус: Исправлена
    Снижение Низкий
    Влияние на бизнес Мы оцениваем эту проблему как низкую, поскольку администратор может исправить ошибочное значение так же легко, как оно было задано.
    Адрес — Награда.sol; вручнуюSetRewardsGenesisTime(uint256)

    Описание

    Помимо создания риска централизации, как подробно описано выше, manuallySetRewardsGenesisTime(uint256) также не может проверить метку времени, указанную администратором. Оно с радостью приняло бы будущее время, что привело бы к _getNumberOfWeeksSinceGenesis() вернуться:

      function _getNumberOfWeeksSinceGenesis()
        private
        view
        returns (uint256 unixTimeDiff)
      {
        unixTimeDiff = (block.timestamp - rewardsGenesisTime) / 7 days;
      }

    риска

    Убедитесь, что введенное значение равно или меньше текущей метки времени.

     

    [L] Недостаточная проверка ввода в setMinimumTimeForRewards(uint256)

    ID САЙ-07
    Статус: Исправлена
    Снижение Низкий
    Влияние на бизнес Как и в случае с предыдущим выводом, мы решили оценить этот вывод как низкий риск, поскольку его можно легко исправить, вызвав функцию еще раз.
    Адрес — Награда.sol; setMinimumTimeForRewards (uint256)

    Описание

    Эта находка по существу очень похожа на ту, что находится непосредственно над ней. Слишком высокое значение приведет к тому, что пользователи не смогут получить свои награды. Это, в сочетании с тем фактом, что награды уменьшаются еженедельно на _limitForWeek(uint256), нивелирует преимущество, предоставляемое ранним внедрением.

    риска

    Определите приемлемый диапазон значений для minimumTimeForRewards и обеспечить его соблюдение с помощью функции. Поскольку эта ценность оказывает прямое влияние на всю структуру вознаграждений платформы, тщательное управление ею имеет первостепенное значение.

     

    [L] Неиспользованная ошибка

    ID САЙ-08
    Статус: Исправлена
    Снижение Низкий
    Влияние на бизнес Мы решили оценить этот вопрос как низкий, а не информационный, это, казалось бы, случайное упущение действительно имеет некоторое влияние на логику контракта.
    Адрес — Награда.сол:12

    Описание

    Ошибка InvalidArrayLegnth() объявляется в строке 12, но никогда не используется.

    риска

    Мы предполагаем, что эта ошибка должна была быть выброшена batchTransfer(TransferInfo[]) если предоставленный массив не имеет восьми элементов:

    if(transferInfos.length != 8) revert InvalidArrayLength();

     

    [L] Непроверенное возвращаемое значение

    ID САЙ-09
    Статус: Исправлена
    Снижение Низкий
    Влияние на бизнес Функция передачи токенов ERC20 возвращает успех или неудачу передачи в виде логического значения. Считается хорошей практикой проверять это значение и продолжать только в случае успеха. Однако, поскольку документация подразумевает, что batchTransfer(TransferInfo[]) используется только для передачи токенов Dimo, мы оцениваем этот результат как низкий.
    Адрес — Награда.sol:232; пакетный перенос(TransferInfo[])

    Описание

    В указанной строке осуществляется передача dimoToken, но возвращаемое значение остается непроверенным.

    риска

    Откат с ошибкой, если передача не удалась:

    if (!dimoToken.transfer(user, amount)) revert TokenTransferFailed();

     

    [L] Устаревший вызов API

    ID САЙ-10
    Статус: Признанный
    Снижение Низкий
    Влияние на бизнес В отличие от grantRole(bytes32, address), _setupRole(bytes32, address) не выполняет никаких проверок вызывающего счета. Поэтому он устарел.
    Адрес — Награда.сол:108-111; инициализировать(адрес, адрес, адрес)

    Описание

    Функция _setupRole(bytes32, address), используемый в указанном месте, устарел в OpenZepplin 5.0. Вызов grantRole(bytes32, address) вместо этого теперь рекомендуется.

    риска

    Замените звонки на _setupRole(bytes32, address) grantRole(bytes32, address).

     

    [I] Недостаточная эмиссия событий

    ID САЙ-11
    Статус: Исправлена
    Снижение Информационный
    Влияние на бизнес Многие инструменты мониторинга, интерфейсы, автономные инструменты и службы отчетности полагаются на события для отслеживания действий по контрактам в реальном времени. Более того, протоколы могут быстро реагировать на выбросы подозрительных событий.
    Адрес — Награда.sol; setRegistryContractAddress (адрес)
    — Награда.sol; setMinimumTimeForRewards (uint256)
    — Награда.sol; setSyntheticProxyAddress (адрес)
    — Награда.sol; сбросRewardsGenesisTime()
    — Награда.sol; вручнуюSetRewardsGenesisTime()
    — Награда.sol:267-268; пакетный перенос(TransferInfo[])

    Описание

    Вышеупомянутые функции не генерируют события для важных обновлений состояния.

    риска

    Добавьте выбросы событий.

     

    [I] Управление версиями Solidity

    ID САЙ-12
    Статус: Признанный
    Снижение Информационный
    Влияние на бизнес Контракт можно скомпилировать и протестировать с разными версиями компилятора во время разработки и проверки, а также с другой версией компилятора во время развертывания в основной сети. Это может привести к неожиданным результатам.
    Адрес Награда.сол:2

    Описание

    Контракт определяет свою прагму как pragma solidity ^0.8.13;. Это позволяет использовать любую версию Solidity, начиная с 0.8.13. Тем более, что 0.8.13 не самая последняя версия.

    риска

    Решите, какую версию Solidity использовать. Последняя стабильная (и, следовательно, рекомендуемая) версия — 0.8.19.

     

    [I] Индексируйте параметр недели в TokensTransferredForConnectionStreak().

    ID САЙ-13
    Статус: Исправлена
    Снижение Информационный
    Влияние на бизнес Индексирование полезно для фильтрации событий в журналах Ethereum. Каждый индексированный параметр события добавляет тему в журнал событий, что упрощает поиск конкретных событий с использованием этих параметров.
    Адрес — Награда.сол:81

    Описание

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

    риска

    Рассмотрите возможность индексации указанного параметра.

     

    [I] Соблюдение руководства по стилю Solidity

    ID САЙ-14
    Статус: Исправлена
    Снижение Информационный
    Влияние на бизнес Этот вопрос носит чисто информационный характер. Это не влияет на состояние безопасности контракта или иное.
    Адрес — Награда.сол:36

    Описание

    TransferInfo[], структура, определяется в строке 36, сразу после переменных состояния. Руководство по стилю Solidity рекомендует размещать объявления структур заранее.

    риска

    Переместите объявление структуры непосредственно в начало контракта, перед переменными состояния.

    Свяжитесь с нами

    Держите в курсе

    Телефон
    Адрес
    Тель-Авив, Израиль
    Вестники:
    Пожалуйста, не стесняйтесь обращаться к нам, мы будем рады ответить!





      Этот сайт защищен reCAPTCHA и Google Персональные данные и Условия Предоставления Услуг подать заявление.
      перейти к содержанию