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

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

1inch связалась с Sayfer для проведения аудита безопасности их смарт-контракта.

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

За период исследования в 15 аудиторских дней мы обнаружили в проверяемом договоре 3 уязвимости и 1 информационную заметку.
Ни один из этих выводов не считается критичным, контракт можно использовать как есть. Все находки были адресованы и зафиксированы командой 1inch.

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

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

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

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

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

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

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

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

Подход

Введение

1inch связалась с Sayfer для проведения аудита безопасности их смарт-контракта.

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

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

Вместе с командой 1inch мы определили следующий контракт как объем проекта. Хэш фиксации: 81e1f5190c391fbb929aa74a67d43245f3f662dc

контракт Ша-256
ДекомпрессорExtension.sol bc852b286a487711699128f1124beb69a37a75658730486ce681b5cef1e5ba11

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

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

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

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

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

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

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

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

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

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

1inch повышает эффективность операций в среде блокчейна второго уровня. Учитывая, что операции с большими данными вызовов, как правило, являются более затратными на уровне 2, основное внимание уделяется уменьшению размера данных вызовов. Для этого используется стратегия сжатия данных вызовов. Эта стратегия в основном включает в себя операции вне цепочки и использует механизм, называемый DecompressorExtension, который позволяет восстанавливать сжатые данные вызовов.

Для сжатия данных вызова используются несколько ключевых методов:

  1. Сжатие последовательных нулевых байтов. Этот метод уменьшает общий размер данных вызова за счет объединения последовательных нулевых байтов в более компактный формат.
  2. Копирование последовательных байтов. В некоторых случаях репликация последовательных байтов используется в качестве стратегии сжатия данных.
  3. Замена на основе словаря. Для замены сегмента данных вызова индексом, взятым из предопределенного словаря, используются два разных метода, что приводит к более эффективному представлению данных.

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

Следующие тестовые случаи были руководством при аудите системы. Этот контрольный список представляет собой модифицированную версию СКСВС 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 Персональные данные и Условия Предоставления Услуг подать заявление.

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

    Риск централизации

    ID САЙ-01
    Статус: Исправлена
    Снижение Medium
    Адрес ДекомпрессорExtension.sol
    Инструменты Ручное тестирование

    Описание

    Если же линия индикатора _setData Функция доступна владельцу контракта, что, по-видимому, является предполагаемым способом использования контракта в соответствии с README. Это создает риск централизации для каждого проекта, использующего DecompressorExtension.

    function _setData(uint256 offset, bytes32 data) internal
    validDictAccess(offset) {
        unchecked {
            _dict[offset] = data;
        }
    }

    Владелец может заранее выполнить вызов от пользователя и изменить соответствующий ключ dict до выполнения вызова, что позволяет ему произвольно изменять данные вызова. Следовательно, для пользователя становится невозможным проверить (распакованные) данные вызова перед вызовом.

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

    риска

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

     

    Нет собственной реализации

    ID САЙ-02
    Статус: Исправлена
    Снижение Medium
    Адрес ДекомпрессорExtension.sol
    Инструменты Ручное тестирование

    Описание

    В README несколько раз говорится о реализации Собственная форма OpenZeppelin. На самом деле контракт не реализует и не расширяет Owneable, что может сбивать с толку и вводить в заблуждение владельцев проектов.

    Из README:

    This contract provides a `DecompressorExtension` abstract
    contract that extends `Ownable` from the OpenZeppelin
    library.

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

    риска

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

     

    Газовая DoS-атака

    ID САЙ-03
    Статус: Исправлена
    Снижение Низкий
    Адрес ДекомпрессорExtension.sol
    Инструменты Ручное тестирование

    Описание

    Очень легко отправить (короткий) ввод в decompress в результате получаются огромные распакованные данные вызова, т.е. эквивалент почтовая бомба.

    Например, многие байты 00111111, за которыми следуют некоторые другие данные, могут быть отправлены с помощью case 0, что приводит к огромным затратам на расширение памяти:

    case 0 {
        let size := add(byte(0, data), 1)
        calldatacopy(outptr, calldatasize(), size)
        inptr := add(inptr, 1)
        outptr := add(outptr, size)
        continue
    }

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

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

    риска

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

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

     

    Несовместимость с ERC-2771/мета-транзакциями.

    ID САЙ-04
    Статус: Исправлена
    Снижение Информационный
    Адрес ДекомпрессорExtension.sol
    Инструменты Ручное тестирование

    Описание

    Расширение несовместимо со стандартом ERC-2771, согласно которому ретранслятор добавляет исходного отправителя к данным вызова (поскольку это может привести к ошибкам сжатия).

    Это не должно быть большой проблемой, поскольку контракты по-прежнему поддерживают обычные (несжатые) вызовы, но это означает, что сжатие нельзя использовать в сочетании с метатранзакциями.

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

    риска

    Если это актуально, внедрите ERC-2771.

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

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

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





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