Звіт про аудит смарт-контрактів для Dimo

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

Дімо звернувся до Sayfer, щоб провести аудит безпеки їх смарт-контракту.

У цьому звіті задокументовано дослідження, проведене Sayfer, спрямоване на вибрані ресурси, визначені в рамках дослідження. Зокрема, у цьому звіті відображається перевірка стану безпеки для смарт-контракту Dimo.

За 40 дослідницьких годин ми виявили 14 уразливостей у контракті. Жоден з них не критичний.

Підсумовуючи, слід зазначити, що після звіту слід внести кілька виправлень, але стан безпеки системи є компетентним.

Після перевірки командою Sayfer ми засвідчуємо, що всі проблеми безпеки, згадані в цьому звіті, були розглянуті командою Dimo.

Методологія ризиків

У Sayfer ми прагнемо надавати нашим клієнтам найвищу якість аудиту розумних контрактів. Ось чому ми запровадили комплексну модель оцінки ризиків, щоб оцінити серйозність наших висновків і надати нашим клієнтам найкращі рекомендації щодо пом’якшення.

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

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

Ризик визначається таким чином:

Уразливості за ризиком

Високий – Пряма загроза ключовим бізнес-процесам.
Medium – Непряма загроза ключовим бізнес-процесам або часткова загроза бізнес-процесам.
низький – Прямої загрози немає. Уразливість може бути використана за допомогою інших уразливостей.
Інформаційний – Цей висновок не вказує на вразливість, але містить коментар, який сповіщає про недоліки дизайну та неправильну реалізацію, які можуть спричинити проблему в довгостроковій перспективі.

Строгість
Кількість випусків
Високий
3
Medium
1
низький
5
Інформаційний
5
Критичний
0

Підхід

Вступ

Дімо звернувся до Sayfer, щоб провести аудит безпеки їх смарт-контракту.

У цьому звіті задокументовано дослідження, проведене Sayfer, спрямоване на вибрані ресурси, визначені в рамках дослідження. Зокрема, у цьому звіті відображається перевірка стану безпеки для вищезгаданих контрактів.

Огляд сфери застосування

Разом із командою клієнта ми визначили наступний контракт як обсяг проекту.
Commit hash: 14ce58aa499e3672fb0b61da13948a6ea51fb879

 

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

 

Наші тести були проведені в січні 2024 року.

Нехай не буде надто пізно!

Почніть свій аудит із Sayfer

Перевірка обсягу

Ми почали з того, що переконалися, що обсяг, визначений нам клієнтом, є технічно логічним.
Частиною початкового обговорення є визначення того, який обсяг підходить для певної системи.

Модель загрози

Ми визначили, що найбільшою поточною загрозою для системи є здатність зловмисників викрадати кошти з контракту.

Нехай не буде надто пізно!

Почніть свій аудит із Sayfer

Огляд протоколу

Вступ до протоколу

DIMO — це компанія web3 IoT, яка дозволяє користувачам і розробникам отримувати доступ до багатого потоку даних, створених сучасними автомобілями. Його рішення — це екосистема, що належить користувачам, яка дозволяє водіям отримувати економічні вигоди від своїх даних і створювати такі додатки, як параметричне страхування, одноранговий обмін автомобілями та ринки транспортних засобів. Децентралізована платформа також дає розробникам спокій, оскільки вони знають, що їхній доступ до даних не залежить від примх централізованого воротаря. Це рішення побудовано на Polygon.

Оцінка безпеки

Наступні тестові приклади були орієнтиром під час аудиту системи. Цей контрольний список є модифікованою версією SCSVS 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 Атаки повторного входу пом’якшуються блокуванням рекурсивних викликів з інших контрактів і дотриманням шаблону перевірки-ефекти-взаємодії. Не використовуйте функцію надсилання, якщо це не обов’язково.
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 У контрактах не використовуються рядкові літерали як ключі для зіставлення. Замість цього використовуються глобальні константи, щоб запобігти атаці гомогліфів.
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 або токени, може бути викликана лише пулом і в рамках процесу, ініційованого власником контракту-одержувача або іншим надійним джерелом (наприклад, multisig).
G13.5 Розрахунок частки пулу ліквідності виконується з максимально можливою точністю (наприклад, якщо внесок розраховується для ETH, це має бути зроблено з точністю до 18 цифр – для Wei, а не для Ether). Ділене потрібно помножити на 10 у степені кількості десяткових цифр (наприклад, ділене * 10^18 / дільник).
G13.6 Винагороди не можна розрахувати та розподілити в межах того самого виклику функції, який депонує токени (його також слід визначити як без повторного входу). Це захищає від миттєвих коливань акцій.
G13.7 Управлінні контракти захищені від атак швидкої позики. Одним із можливих методів пом’якшення є вимога процесу депонування токенів управління та пропозиції змін, які мають бути виконані в різних транзакціях, включених до різних блоків.
G13.8 При використанні on-chain оракул контракти можуть призупиняти операції на основі результату оракула (у разі скомпрометованого оракула).
G13.9 Зовнішні контракти (навіть довірені), яким дозволено змінювати атрибути контракту проекту (наприклад, ціну токена), мають такі обмеження: порогові значення для зміни (наприклад, не більше/менше 5%) та обмеження оновлень (наприклад, одне оновлення на день).
G13.10 Атрибути контракту, які можуть бути оновлені зовнішніми контрактами (навіть надійними), відстежуються (наприклад, за допомогою подій), і реалізується процедура реагування на інцидент (наприклад, під час поточної атаки).
G13.11 Складні математичні операції, які складаються з операцій множення та ділення, спочатку виконують множення, а потім ділення.
G13.12 Під час розрахунку біржових цін (наприклад, ETH на токен або навпаки), чисельник і знаменник множаться на резерви (див. getInputPrice функція в UniswapExchange договір).

 

Замовити аудит у Сайфер





    Цей сайт захищено reCAPTCHA і Google Політика Конфіденційності та Умови обслуговування застосовувати.

    Висновки аудиту

    [H] Зміна часу Genesis потенційно може порушити розподіл винагороди

    ID СКАЖИ-01
    Статус Виправлено
    Risk Високий
    Business Impact rewardsGenesisTime є критичною змінною, яка відстежує час початку винагород і таким чином керує розподілом винагород.

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

    Місце розташування – Reward.sol; resetRewardsGenesisTime()
    – Reward.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
    Статус Виправлено
    Risk Високий
    Вплив на бізнес Хоча облікові записи адміністраторів за визначенням користуються певною мірою довіри, якщо їх зламано, їх можна використовувати для вичерпання коштів контракту за допомогою цієї функції.
    Місце розташування – Reward.sol; adminWithdraw(адреса, uint256)

    Опис

    Функція adminWithdraw(address, uint256) дозволяє адміністраторам надсилати контрактні кошти користувачам без обмежень. Згідно з документацією, це використовується, якщо користувачі надсилають DIMO в контракт без ставки. Однак ми вважаємо, що цією функцією можуть зловживати, як пояснюється в розділі про вплив на бізнес.

    Пом'якшення

    Одним із можливих способів підвищення безпеки є подання запиту від імені користувача, можливо, за допомогою облікового запису з роллю oracle. Потім адміністратор має схвалити транзакцію. Це принаймні вимагає двох облікових записів для схвалення таких транзакцій, забезпечуючи ще один рівень безпеки.

     

    [H] Адміністратори можуть скинути реєстр за бажанням

    ID СКАЖИ-03
    Статус Визнаний
    Risk Високий
    Вплив на бізнес Реєстр – це місце, де зберігаються дані користувача та виконуються перевірки. Якщо реєстр буде скинуто, існуючі користувачі перестануть отримувати винагороди, якщо дані не буде перенесено до нового реєстру.
    Місце розташування – Reward.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
    Статус Визнаний
    Risk Інформаційний
    Вплив на бізнес Ми вирішили оцінити цей висновок як інформаційний, оскільки він головним чином є наслідком основних проблем централізації, описаних вище. За поточного способу побудови системи необхідно, щоб хтось призначав і керував ролями Oracle і Admin. Однак необов’язково, щоб обліковий запис сам мав ці ролі.
    Місце розташування – Reward.sol:108-111; ініціалізувати (адреса, адреса, адреса)

    Опис

    Під час ініціалізації програма розгортання отримує ролі адміністратора, адміністратора за замовчуванням і оракула:

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

    Пом'якшення

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

     

    [M] Використовуйте AccessControlDefaultAdminRulesUpgradeable

    ID СКАЖИ-05
    Статус Визнаний
    Risk Medium
    Вплив на бізнес Враховуючи притаманну централізацію контракту та важливість ролей адміністратора (і, отже, керування ними), ми вирішили оцінити цей результат як середній ризик.
    Місце розташування -

    Опис

    Reward.sol наразі використовується AccessControlUpgradable для надання та керування доступом до критичних функцій. У схемі контролю доступу OZ обліковий запис, який має DEFAULT_ADMIN_ROLE, може надавати та скасовувати всі інші ролі. У поточному стані контракту він надається розгортачу після ініціалізації.

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

    • Може зберігатися лише один обліковий запис DEFAULT_ADMIN_ROLE.
    • DEFAULT_ADMIN_ROLE можна передати лише за допомогою двоетапного процесу. Настроювана затримка між двома кроками, changeDefaultAdminDelay, виконується.

    Пом'якшення

    Переключити з AccessControlUpgradable до AccessControlDefaultAdminRulesUpgradeable.

     

    [L] Недостатня перевірка введених даних у manuallySetRewardsGenesisTime(uint256)

    ID СКАЖИ-06
    Статус Виправлено
    Risk низький
    Вплив на бізнес Ми оцінюємо цю проблему як низьку, оскільки помилкове значення може бути виправлено адміністратором так само легко, як воно було надано.
    Місце розташування – Reward.sol; вручну SetRewardsGenesisTime(uint256)

    Опис

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

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

    Пом'якшення

    Переконайтеся, що введені дані дорівнюють або менші за поточну позначку часу.

     

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

    ID СКАЖИ-07
    Статус Виправлено
    Risk низький
    Вплив на бізнес Так само, як і наведене вище, ми вирішили оцінити це відкриття як низький ризик, оскільки його можна легко виправити повторним викликом функції.
    Місце розташування – Reward.sol; setMinimumTimeForRewards(uint256)

    Опис

    Ця знахідка дуже схожа за змістом на ту, що знаходиться безпосередньо над нею. Занадто високе значення призведе до того, що користувачі не зможуть отримати свої винагороди. Це в поєднанні з тим фактом, що винагороди щотижня зменшуються на _limitForWeek(uint256), каструє перевагу, яку надає раннє прийняття.

    Пом'якшення

    Визначте прийнятний діапазон значень для minimumTimeForRewards і примусово виконувати його за допомогою функції. Через прямий вплив цієї цінності на всю структуру винагород платформи ретельне управління нею має першорядне значення.

     

    [L] Невикористана помилка

    ID СКАЖИ-08
    Статус Виправлено
    Risk низький
    Вплив на бізнес Ми вирішили оцінити цю проблему як низьку, а не як інформаційну, це, здавалося б, випадкове упущення певним чином впливає на логіку контракту.
    Місце розташування – Нагорода.sol:12

    Опис

    Помилка InvalidArrayLegnth() оголошується в рядку 12, але ніколи не використовується.

    Пом'якшення

    Ми припускаємо, що ця помилка мала бути введена batchTransfer(TransferInfo[]) якщо наданий масив не має восьми елементів:

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

     

    [L] Неперевірене значення, що повертається

    ID СКАЖИ-09
    Статус Виправлено
    Risk низький
    Вплив на бізнес Функція передачі токенів ERC20 повертає успіх або невдачу передачі як логічне значення. Вважається доброю практикою перевірити це значення та продовжувати лише в разі успіху. Однак тому, що документація це передбачає batchTransfer(TransferInfo[]) використовується лише для передачі токенів Dimo, ми оцінюємо цей висновок як низький.
    Місце розташування – Reward.sol:232; batchTransfer(TransferInfo[])

    Опис

    У зазначеному рядку виконується передача dimoToken, але повертається значення не позначається.

    Пом'якшення

    Повернути з помилкою, якщо передача не вдається:

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

     

    [L] Застарілий виклик API

    ID СКАЖИ-10
    Статус Визнаний
    Risk низький
    Вплив на бізнес на відміну від grantRole(bytes32, address), _setupRole(bytes32, address) не виконує жодних перевірок облікового запису, що телефонує. Тому його визнано застарілим.
    Місце розташування – Reward.sol:108-111; ініціалізувати (адреса, адреса, адреса)

    Опис

    Функція _setupRole(bytes32, address), що використовується у вказаному розташуванні, у OpenZepplin 5.0 визнано застарілим. Дзвінок grantRole(bytes32, address) замість цього зараз рекомендується.

    Пом'якшення

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

     

    [I] Недостатня емісія події

    ID СКАЖИ-11
    Статус Виправлено
    Risk Інформаційний
    Вплив на бізнес Багато інструментів моніторингу, зовнішніх інтерфейсів, інструментів поза мережею та служб звітності покладаються на події, щоб фіксувати дії контрактів у реальному часі. Крім того, протоколи можуть швидко реагувати на викиди підозрілих подій.
    Місце розташування – Reward.sol; setRegistryContractAddress(адреса)
    – Reward.sol; setMinimumTimeForRewards(uint256)
    – Reward.sol; setSyntheticProxyAddress(адреса)
    – Reward.sol; resetRewardsGenesisTime()
    – Reward.sol; manuallySetRewardsGenesisTime()
    – Reward.sol:267-268; batchTransfer(TransferInfo[])

    Опис

    Вищезазначені функції не видають події для важливих оновлень стану.

    Пом'якшення

    Додайте викиди події.

     

    [I] Версії Solidity

    ID СКАЖИ-12
    Статус Визнаний
    Risk Інформаційний
    Вплив на бізнес Контракт можна скомпільувати та протестувати з різними версіями компілятора під час розробки та перевірки та іншою іншою версією компілятора під час розгортання в основній мережі. Це може призвести до неочікуваних результатів.
    Місце розташування Reward.sol:2

    Опис

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

    Пом'якшення

    Визначтеся з єдиною версією solidity для використання. Останнім стабільним (і тому рекомендованим) випуском є ​​0.8.19.

     

    [I] Індексує параметр тижня в TokensTransferredForConnectionStreak()

    ID СКАЖИ-13
    Статус Виправлено
    Risk Інформаційний
    Вплив на бізнес Індексація корисна для фільтрації подій у журналах Ethereum. Кожен проіндексований параметр у події додає тему до журналу подій, що полегшує пошук певних подій за допомогою цих параметрів.
    Місце розташування – Нагорода.sol:81

    Опис

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

    Пом'якшення

    Розгляньте індексацію зазначеного параметра.

     

    [I] Дотримання посібника зі стилю Solidity

    ID СКАЖИ-14
    Статус Виправлено
    Risk Інформаційний
    Вплив на бізнес Це питання суто інформаційне. Немає жодного впливу на безпеку контракту чи інше.
    Місце розташування – Нагорода.sol:36

    Опис

    TransferInfo[], структура, визначена в рядку 36, безпосередньо після змінних стану. Керівництво по стилю Solidity рекомендує розміщувати оголошення структур раніше.

    Пом'якшення

    Перемістіть оголошення структури безпосередньо на початок контракту, перед змінними стану.

    Зв'яжіться з нами

    Підтримувати зв'язок

    Телефони
    Місце розташування
    Тель-Авів, Ізраїль
    Електронна адреса
    Месенджери:
    Будь ласка, не соромтеся звертатися до нас, ми будемо раді відповісти!





      Цей сайт захищено reCAPTCHA і Google Політика Конфіденційності та Умови обслуговування застосовувати.
      Перейти до вмісту