Cointime

Download App
iOS & Android

SlowMist: Введение в аудит контракта Sui-Move

Validated Project

Будучи новой высокопроизводительной блокчейн-платформой, 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.

Автор | Победа!

Редактор | Лиза, Лиз

Комментарий

Все комментарии

Рекомендуем к прочтению

  • Starknet: первая фаза ставок STRK официально запущена в сети

    Starknet сообщил, что в сети официально запущен первый этап стейкинга STRK.

  • Чехия: Не пытаюсь положить конец увлечению мемами, просто поощряю больше строителей

    CZ опубликовал сообщение на странице «Также сторонник мем-монет, очень сложно положить конец этому увлечению», на что CZ ответил: «Не пытаясь ничего положить, каждый имеет право выбирать, что инвестировать или держать. Просто поощряйте больше строителей. .»

  • Марокко официально снимет запрет на криптовалюту в 2017 году и повторно его легализует

    Марокко планирует повторно легализовать криптовалюты после полного запрета на торговлю криптовалютами в стране с 2017 года.

  • Talus Network завершает стратегический раунд финансирования на сумму 6 миллионов долларов США при оценке в 150 миллионов долларов США

    Децентрализованный протокол искусственного интеллекта Talus Network привлекла 6 миллионов долларов США в рамках раунда стратегического финансирования под руководством Polychain Capital при оценке в 150 миллионов долларов США. Финансирование поможет дальнейшему развитию экосистемы Talus, включая Protochain, платформу Nexus и приложение AI Dating Experience.

  • AXIOS: Трамп рассматривает возможность назначения секретаря по искусственному интеллекту

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

  • Schhuman Financial завершила начальный раунд финансирования на сумму 7,36 млн долларов США под руководством RockawayX

    Schuman Financial закрыла посевной раунд стоимостью 7,36 миллиона долларов под руководством RockawayX при участии Lightspeed Faction, Kraken Ventures, Nexo Ventures, Gnosis VC, Delta Blockchain Fund и Bankless Ventures. Кроме того, Schuman Financial запустила EURØP, стейблкоин евро, соответствующий требованиям MiCA. Schuman Financial, ставшая первой европейской компанией, получившей лицензию эмитента стейблкоинов во Франции, строит экосистему вокруг EURØP, которая включает в себя интеграцию SEPA, банковские каналы и кастодиальное партнерство с глобальными банками первого уровня, такими как Societe Generale.

  • QCP: путь BTC к уровню $100 000 останавливается, подразумеваемая волатильность ETH превращается в пут-опционы

    QCP Capital опубликовала анализ и отметила, что недавнее снижение цен на биткойны привело к долгосрочной ликвидации на сумму более 430 миллионов долларов. Это снижение совпало с окончанием пяти последовательных дней чистого притока в спотовые ETF, в результате которых был зафиксирован отток в размере 438 миллионов долларов. в понедельник, а акции MicroStrategy упали еще на 4,4%. Путь BTC к уровню в 100 000 долларов застопорился по мере приближения праздников в США, и немедленных катализаторов для повышения цен нет. Кроме того, подразумеваемая волатильность ETH сместилась в сторону опционов «пут», а не «колл», и опасения рынка по поводу рисков снижения могут усилиться, особенно с предстоящим выпуском протокола Федеральной резервной системы FOMC и данных PCE. Однако в долгосрочной перспективе это падение рынка не является чрезмерной коррекцией. Биткойн просто вернулся к уровням, наблюдавшимся в начале прошлой недели. После победы Трампа рынки стали чрезвычайно перекуплены и перегружены заемными средствами, что сделало паузу неизбежной.

  • Binance исключит из листинга GFT, IRIS, KEY, OAX и REN

    10 декабря 2024 года Binance исключит из листинга торговые пары GFT/USDT, IRIS/BTC, IRIS/USDT, KEY/USDT, OAX/BTC, OAX/USDT, REN/BTC, REN/USDT. Кроме того, Binance Futures закроет все позиции и проведет автоматический расчет по бессрочным контрактам KEYUSDT и RENUSDT USDⓈ-M в 09:00 3 декабря 2024 г., 09:00 (UTC). После завершения урегулирования контракт будет исключен из листинга.

  • Аналитик: 100 000 долларов США могли стать высоким порогом или даже препятствием для инвесторов BTC для получения дальнейшей прибыли

    Дэвид Моррисон, старший рыночный аналитик Trade Nation, сказал, что, хотя «100 000 долларов» — это хорошая цена в виде круглого числа, кажется, что эта цифра стала высоким порогом или даже препятствием для инвесторов в биткойны для получения дальнейшей прибыли, если биткойн запустится. с этого момента он начнет снижаться, и этого может быть все, что нужно для появления рынка, особенно если долгосрочные держатели решат досрочно обналичить деньги. Однако Дэвид Моррисон также отметил, что восходящий импульс Биткойна, вероятно, накопит достаточно энергии, чтобы подтолкнуть цену выше отметки в 100 000 долларов. Как только этот уровень сопротивления будет пробит, это может стать спусковым крючком для нового подталкивания Биткойна вверх.

  • Кандидат в президенты Суринама Майя Парбхо: В случае избрания президентом биткойн станет законным платежным средством

    Майя Парбхо, кандидат в президенты южноамериканской страны Суринам, имеет амбициозное видение создания биткойн-нации, более глубоко укорененной в криптовалютах, чем Сальвадор. Парбхо, которая также является генеральным директором Daedalus Labs, сервисной компании, основанной на биткойнах и NOSTR, изложила смелый план по борьбе с коррупцией и предоставлению реальных выгод гражданам путем принятия стандартов биткойнов – при условии, что она выиграет предстоящие выборы в 2025 году. Ее первоочередной задачей является сделать Биткойн (BTC) законным платежным средством после того, как она вступит в должность. В течение первого года она планирует постепенно заменить суринамский доллар сатоши, наименьшей единицей биткойнов, и обеспечить выплату всей зарплаты в BTC.