Будучи новой высокопроизводительной блокчейн-платформой, Sui обладает рядом инновационных технологий и уникальностью, уделяя при этом особое внимание обеспечению быстрых и безопасных транзакций для различных сценариев применения. Базовые знания о Sui можно найти в книге «Изучение Sui: технологии и безопасность контрактов, лежащие в основе высокой производительности» . В отличие от других широко используемых языков программирования в блокчейнах (таких как Solidity), Sui использует язык Move, который может в определенной степени решить проблемы уязвимостей, распространенные в Solidity, такие как атаки повторного входа, целочисленные переполнения. , двойные траты, DoS-атаки и проблемы с компиляторами, но это не может помешать разработчикам вносить ошибки в код. Поэтому разработчикам необходимо понимать и обращать внимание на некоторые уникальные функции или возможности при их использовании для обеспечения безопасности смарт-контрактов.
Команда безопасности SlowMist интегрировала и вобрала в себя методы разработки безопасности, используемые сообществом Sui, в сочетании с собственным опытом аудита безопасности, накопленным за многие годы, чтобы выпустить введение в аудит контрактов Sui-Move, призванное помочь разработчикам лучше понять риски безопасности, связанные с безопасностью. использовать смарт-контракты и предоставлять практические решения для смягчения потенциальных угроз безопасности.
Из-за ограничений по объему в этой статье приведена только часть введения в аудит контрактов Sui-Move. Вы можете смотреть, разветвлять и отмечать звезды на GitHub: https://github.com/slowmist/Sui-MOVE-Smart-Contract-. Аудит-Primer/blob/main/README_CN.md.
1. Объявление модуля и видимость
1.1 Функция «public(friend)» («public(friend)» заменена на «public(package)» в последней версии Sui)
Определение: используется для объявления функции так, чтобы к ней мог получить доступ только указанный дружественный модуль. Это обеспечивает более детальный контроль доступа между «общедоступным» и «частным».
Пример:
1.2 функция «входа»
Определение: Функция «входа» является точкой входа в модуль и позволяет осуществлять прямые вызовы из блока транзакции. Параметры должны поступать из входных данных блока транзакций и не могут быть результатом предыдущих транзакций в блоке или измененных данных. Более того, функция «entry» может возвращать только типы с возможностью «drop».
Пример:
Определение: Функция «входа» является точкой входа в модуль и позволяет осуществлять прямые вызовы из блока транзакции. Параметры должны поступать из входных данных блока транзакций и не могут быть результатом предыдущих транзакций в блоке или измененных данных. Кроме того, функция «entry» может возвращать только типы с возможностью «drop».
Пример:
1.3 «публичная» функция
Определение: «публичные» функции могут вызываться из блоков транзакций и других модулей, пригодных для внешнего взаимодействия. Он не имеет тех же ограничений на параметры и возвращаемые значения, что и функции «входа», и обычно используется для раскрытия функциональности внешнему миру.
Пример:
2. Управление объектом
2.1 Уникальность объектов
Определение: Каждый объект Sui имеет уникальный «objID», который обеспечивает уникальность объекта в цепочке.
2.2 Упаковка и распаковка
определение:
- Прямая упаковка: используйте объект Sui в качестве поля другого объекта, при этом объект-оболочка должен быть уничтожен при развертывании.
- Упаковка объекта: упакованный объект становится частью другого объекта и больше не существует независимо. Идентификатор объекта после распаковки остается неизменным.
2.3 Пользовательская стратегия передачи
Определение: используйте «sui::transfer::transfer», чтобы определить собственную стратегию передачи. Для объектов с возможностями «сохранения» вы можете создать ее с помощью «sui::transfer::public_transfer».
2.4 Свойства объектов
Определение: Свойства объекта Sui включают «копирование», «удаление», «сохранение» и «ключ», которые определяют поведение объекта.
2.5 Проверка разрешений объекта
- Объекты, принадлежащие адресу
Определение: объекты, принадлежащие определенному адресу (адресу учетной записи или идентификатору объекта). Только владелец объекта может получить доступ к этим объектам и управлять ими.
- Неизменяемые объекты
Определение: Неизменяемые объекты не могут быть изменены или перенесены, и к ним может получить доступ кто угодно. Подходит для данных, которым требуется глобальный доступ, но которые не нужно изменять.
- Общие объекты
Определение: к общим объектам могут обращаться и управлять ими несколько пользователей, и они подходят для таких сценариев, как децентрализованные приложения. Однако из-за необходимости консенсуса стоимость операции высока.
- Завернутые объекты
Определение: Обертывание объекта означает встраивание одного объекта в другой объект. Обернутый объект больше не существует независимо, и доступ к нему должен осуществляться через объект-обертку.
3. Проверка безопасности
3.1 Проверка числового переполнения
Определение: Обертывание объекта означает встраивание одного объекта в другой объект. Обернутый объект больше не существует независимо, и доступ к нему должен осуществляться через объект-обертку.
3. Проверка безопасности
3.1 Проверка числового переполнения
Смарт-контракты Sui по умолчанию выполняют проверку числового переполнения.
3.2 Повторная проверка
Так называемая атака повторного входа — это вставка неожиданного (внешнего) вызова в обычную транзакцию вызова по контракту, тем самым изменяя общий процесс бизнес-вызова и получая незаконную прибыль. Везде, где задействованы вызовы внешних контрактов, могут возникнуть потенциальные риски повторного входа. Мы можем разделить текущие проблемы реентерабельности на три категории: реентерабельность одной функции, реентерабельность между функциями и реентерабельность между контрактами. Некоторые функции языка Move обеспечивают естественную защиту от повторных атак:
- В Move нет динамических вызовов, и все внешние вызовы должны быть сначала импортированы посредством использования, то есть внешние вызовы ожидаются и определяются.
- Никакая передача собственного токена не запускает функцию Fallback.
- В Move модель ресурсов гарантирует, что доступ к ресурсам может быть доступен только одному контексту выполнения одновременно. Это означает, что если выполнение функции не завершится, другие функции не смогут получить доступ к тому же ресурсу до завершения выполнения.
1. Аудит переполнения
Примечание. Move выполнит проверку переполнения при выполнении математических операций. Если операция переполнится, транзакция завершится неудачно. Но следует отметить, что Move не выполняет проверку переполнения для битовых операций.
Поиск: найдите место в коде, где выполняются битовые операции, и проверьте, существует ли риск переполнения.
2. Аудит ошибок арифметической точности.
Примечание. В Move нет типа с плавающей запятой. Поэтому при выполнении арифметических операций, если результаты операции необходимо выразить в числах с плавающей запятой, могут возникнуть ошибки точности. Хотя в некоторых случаях ошибок точности трудно полностью избежать, их влияние можно смягчить за счет оптимизации и рационального проектирования.
Позиционирование. Просмотрите все части кода, которые включают в себя арифметические операции, особенно вычисления, которые могут привести к ошибкам точности, убедитесь, что эти операции не окажут негативного влияния на логику контракта или числовую точность, и дайте рекомендации по оптимизации для уменьшения ошибок точности.
3. Условный конкурентный аудит
Примечание. Валидаторы в Sui также могут сортировать транзакции, отправленные пользователями, поэтому при аудите нам все равно нужно обратить внимание на вопрос получения прибыли от сортировки транзакций в одном блоке.
позиция:
- Ожидается ли какое-либо управление состоянием данных контракта до вызова функции?
- Ожидается ли управление состоянием данных контракта во время выполнения функции.
- Ожидается ли управление состоянием данных контракта после вызова функции?
4. Аудит контроля доступа
Примечание. Некоторые ключевые функции в контракте должны быть ограничены внутренними вызовами, например функции, которые могут напрямую обновлять сумму депозита пользователя. Если эти функции случайно открываются для внешнего мира, контроль разрешений может быть обойден, что приведет к уязвимостям безопасности и даже к потере активов. Поэтому права доступа должны быть строго установлены, чтобы гарантировать, что только авторизованные роли или модули могут вызывать эти функции или что функции могут использоваться только внутри.
Позиционирование: вам необходимо проверить настройки контроля доступа для всех функций, особенно тех функций, которые не должны быть доступны внешнему миру, чтобы гарантировать, что их можно вызывать только внутри. Если обнаружено, что функциональный интерфейс, который не следует раскрывать, был открыт, его необходимо пометить как высокий риск и внести предложения по исправлению.
5. Аудит управления объектом
Примечание. В Sui объекты могут быть преобразованы в общие объекты (Shared Object), что означает, что права доступа к объекту могут измениться с частного на общедоступный. Поэтому все используемые объекты необходимо тщательно проверять, чтобы определить, является ли каждый объект статичным или общим. Обратите особое внимание на то, не были ли какие-либо объекты ошибочно преобразованы из частных объектов в общие объекты, что может привести к несанкционированному доступу пользователей к этим объектам, что представляет собой потенциальную угрозу безопасности.
Позиционирование. Организуйте и проанализируйте все объекты, задействованные в модуле, проверьте тип объекта и настройки разрешений, а также убедитесь, что разрешения объекта соответствуют бизнес-требованиям. Если обнаружено, что частный объект был ошибочно преобразован в общий объект, его необходимо пометить как потенциальный риск и рекомендовать исправление.
6. Аудит потребления токенов
Позиционирование. Организуйте и проанализируйте все объекты, задействованные в модуле, проверьте тип объекта и настройки разрешений, а также убедитесь, что разрешения объекта соответствуют бизнес-требованиям. Если обнаружено, что частный объект был ошибочно преобразован в общий объект, его необходимо пометить как потенциальный риск и рекомендовать исправление.
6. Аудит потребления токенов
Примечание. Модель токенов Sui отличается от моделей других сетей. Sui позволяет объектам хранить токены, а объекты-токены можно вкладывать в другие объекты и разделять. Поэтому в сценариях, связанных с потреблением токенов, необходимо уделять особое внимание управлению и обращению токенов, чтобы избежать проблем с безопасностью или непредвиденных потерь.
позиция:
- Проверьте правильность потребляемой суммы.
- Убедитесь, что объект токена был передан правильно.
- Проверьте, оправдано ли разделение и слияние токенов.
- Проверьте привязку токена к объекту.
7. Аудит мгновенной кредитной атаки
Примечание. В Sui's Move также используется мгновенный кредит (Hot Potato). Пользователи могут занять большую сумму средств за одну транзакцию и использовать ее по своему усмотрению, а вернуть средства нужно только в рамках транзакции. Злоумышленники обычно используют быстрые кредиты для увеличения собственных средств и проведения крупных финансовых атак, таких как манипулирование ценами.
Позиционирование: проанализируйте, является ли разумным алгоритм самого протокола (вознаграждения, процентные ставки и т. д.) и зависимость от машин-оракулов.
8. Аудит уязвимостей разрешений
Примечание. В контракте Sui Move лазейки в разрешениях тесно связаны с бизнес-потребностями и функциональным дизайном. Поэтому, сталкиваясь с более сложным модулем, вам необходимо подтвердить у участника проекта разрешения на вызов каждого метода (здесь разрешения обычно относятся к функциям). разрешения на видимость и вызов функций).
позиция:
- Проверьте и подтвердите видимость и разрешения на вызов всех функциональных методов. На этапе оценки проекта участник проекта должен предоставить проектную документацию. Во время аудита разрешения подтверждаются на основе описания в проектном документе.
- Определите объем разрешений роли проектной группы. Если разрешения роли проектной группы будут влиять на ресурсы пользователя, существует риск избыточных разрешений.
- Проанализируйте тип объекта, переданного во внешнюю функцию. Если это какая-то привилегированная функция, в ней должны участвовать некоторые привилегированные объекты.
9. Аудит безопасности обновления контракта
Примечание. В Move внешние модули импортируются с помощью ключевого слова use. Следует отметить, что контракт Sui можно обновлять, но опубликованный пакет контракта является неизменяемым объектом и не может быть отозван или изменен после публикации. Суть обновления контракта заключается в повторной публикации обновленного контракта по новому адресу и переносе данных контракта старой версии в новый контракт. Поэтому в процессе обновления контракта необходимо уделять особое внимание:
- Функция «init»: функция «init» выполняется только при первом выпуске контракта и не будет запускаться снова при последующих обновлениях контракта.
- Обновление контракта не приводит к автоматическому обновлению зависимостей: если пакет контракта зависит от внешнего пакета, при обновлении внешнего пакета пакет контракта не будет автоматически указывать на адрес обновленного контракта. Поэтому вам необходимо вручную обновить пакет контракта, чтобы указать новые зависимости.
Позиционирование: необходимо провести детальную проверку логики миграции данных в процессе обновления контракта, чтобы гарантировать безопасность и точность операции миграции, а также избежать проблем, связанных с отсутствием важных данных или зависимостью от обновлений.
10. Аудит безопасности внешних звонков
Примечание. То же, что и элементы аудита использования внешнего модуля, поскольку внешние вызовы в Move требуют предварительного импорта внешнего модуля. Теоретически результаты внешних вызовов соответствуют ожиданиям разработчиков, и главное, что требуется, — это стабильность внешнего модуля.
Позиционирование: Необходимо проверять импортированные извне библиотеки.
11. Проверка возвращаемого значения
Примечание. Как и в других языках смарт-контрактов, в контракте Move необходимо проверять возвращаемые значения определенных функций. Если обработка этих возвращаемых значений игнорируется, ключевая логика может выполняться неправильно, что может привести к проблемам с безопасностью.
Позиционирование: вам необходимо проверять возвращаемое значение каждого вызова функции в вашем коде, особенно тех, которые связаны с внешними вызовами или важными обновлениями статуса. Если возвращаемое значение не обрабатывается и не проверяется, это может привести к непредсказуемому поведению и должно быть помечено как потенциальная точка риска.
12. Аудит отказа в обслуживании
Примечание. Атаки типа «отказ в обслуживании» (DoS) могут быть вызваны логическими ошибками кода, проблемами совместимости или другими уязвимостями безопасности, что приводит к сбоям в работе смарт-контрактов. Подобные проблемы могут повлиять на наличие контракта или даже полностью парализовать его.
12. Аудит отказа в обслуживании
Примечание. Атаки типа «отказ в обслуживании» (DoS) могут быть вызваны логическими ошибками кода, проблемами совместимости или другими уязвимостями безопасности, что приводит к сбоям в работе смарт-контрактов. Подобные проблемы могут повлиять на наличие контракта или даже полностью парализовать его.
позиция:
- Сосредоточьтесь на проверке надежности бизнес-логики, чтобы гарантировать, что она может нормально выполняться при различных обстоятельствах и что контракт не будет прерван из-за ошибок или лазеек.
- Обратите внимание на части, которые взаимодействуют с внешними модулями, и обеспечьте их совместимость, чтобы предотвратить перебои в обслуживании из-за проблем с внешними зависимостями.
13. Аудит оптимизации газа
Примечание. Как и Ethereum, Sui также имеет механизм Gas, и любой вызов сценария модуля будет потреблять Gas. Поэтому необходимо оптимизировать некоторые длинные и сложные коды.
позиция:
- Он включает в себя сложные вызовы, чтобы проверить, можно ли их отделить.
- Он включает в себя высокочастотные вызовы, чтобы проверить, можно ли оптимизировать эффективность внутреннего выполнения функции.
14. Аудит логики проектирования
Примечание. Целью аудита логики проектирования является проверка бизнес-процесса и реализации в коде, чтобы подтвердить наличие недостатков проектирования или отклонений от ожиданий. Реализация кода, несовместимая с ожидаемой логикой, может привести к неожиданному поведению или угрозе безопасности.
позиция:
- Основываясь на разрешениях и объеме различных ролей, определите возможные пути вызова в бизнес-процессе.
- Определите объем данных, задействованных в каждом бизнес-процессе, и убедитесь, что операции с данными соответствуют бизнес-плану.
- Сравните фактические пути вызовов с ожидаемыми бизнес-процессами, а также выявите и проанализируйте любые ситуации вызовов, которые могут привести к неожиданным результатам.
15. Другие
Содержание, не отраженное в приведенных выше выражениях.
Для разработчиков следование этим передовым практикам может эффективно повысить безопасность смарт-контрактов и снизить потенциальные риски безопасности. Есть надежда, что эта передовая практика поможет большему количеству разработчиков создавать безопасные и надежные смарт-контракты и способствовать здоровому развитию технологии блокчейна.
обратитесь к:
[1] https://intro.sui-book.com/
[2] https://docs.sui.io/
[3] https://move-dao.github.io/move-book-zh/introduction.html.
Автор | Победа!
Редактор | Лиза, Лиз
Все комментарии