Инструмент для обнаружения метаморфических смарт-контрактов PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.

Инструмент для обнаружения метаморфических смарт-контрактов

Критическое предположение безопасности Ethereum заключается в том, что код смарт-контракта неизменен и поэтому не может быть изменен после его развертывания в блокчейне. На практике некоторые смарт-контракты может изменения — даже после того, как они были развернуты. С помощью нескольких хитрых приемов вы можете создавать метаморфические смарт-контракты, которые «Метаморфозаво что-то другое — и, поняв, что делает их возможными, вы сможете их обнаружить.

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

Чтобы проанализировать, содержит ли смарт-контракт метаморфические свойства, Я построил простой Детектор метаморфических контрактов (вдохновленный и основанный на оригинальной работе Джейсон Карвер, 0 возрасти другие исследователи). Любой может использовать этот инструмент, чтобы проверить, есть ли у данного контракта красные флажки, которые могут указывать на возможность метаморфизма. Этот метод не является надежным: то, что смарт-контракт показывает флаг, не означает, что он обязательно метаморфичен; и только потому, что это не так, не означает, что это безопасно. Программа проверки просто предлагает быструю первоначальную оценку того, что контракт может быть быть метаморфическим на основе возможных индикаторов. 

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

Обнаружение метаморфических смарт-контрактов

Ассоциация Детектор метаморфических контрактов Я провел анализ шести свойств, которые могут указать, является ли смарт-контракт метаморфическим.

    1. Был ли использован известный метаморфический код для развертывания контракта? Если известный метаморфический байт-код — низкоуровневый, читаемый виртуальной машиной код, в который смарт-контракты Ethereum, обычно написанные на Solidity, превращаются после компиляции — появляется в транзакции для развертывания данного смарт-контракта, это серьезный красный флаг. В следующих разделах мы обсудим один такой пример метаморфного байт-кода, разработанного 0age. Важное предостережение: существует потенциально бесчисленное количество вариаций метаморфного байт-кода, что затрудняет обнаружение всех разновидностей. Тем не менее, сканируя хорошо известные экземпляры, детектор устраняет легкие препятствия для злоумышленников, которые просто копируют и вставляют существующие примеры.
    2. Может ли код смарт-контракта самоуничтожаться? Чтобы заменить код в контракте — ключевой шаг в создании метаморфического контракта — разработчику сначала необходимо удалить ранее существовавший код. Единственный способ сделать это — использовать Код операции САМОУНИЧТОЖЕНИЕ, команда, которая делает именно то, на что она похожа — она стирает весь код и хранилище по заданному адресу контракта. Наличие самоуничтожающегося кода в контракте не доказывает, что он метаморфичен; тем не менее, это дает ключ к пониманию того, что договор может быть быть метаморфическим, и в любом случае стоит знать, могут ли контракты, на которые вы полагаетесь, уничтожить себя.
    3. Смарт-контракт вызывает код откуда-то еще? Если рассматриваемый смарт-контракт не может самоуничтожиться напрямую, он все равно может стереть себя, используя Код операции DELEGATECALL. Этот код операции позволяет смарт-контракту динамически загружать и выполнять код, который находится внутри другого смарт-контракта. Даже если смарт-контракт не содержит код операции SELFDESTRUCT, он может использовать DELEGATECALL для загрузки кода самоуничтожения откуда-то еще. Хотя функциональность DELEGATECALL не указывает напрямую, является ли смарт-контракт метаморфическим, это возможная подсказка — и потенциальная проблема безопасности — на которую стоит обратить внимание. Имейте в виду, что этот индикатор может вызвать много ложных срабатываний. 
    4. Использовал ли этот контракт другой контракт? Метаморфические контракты могут быть развернуты только другими смарт-контрактами. Это связано с тем, что метаморфические контракты активируются другим кодом операции, который может использоваться только другими смарт-контрактами, который называется CREATE2. (Мы обсудим CREATE2 — как это работает и почему это важно — подробнее в следующем разделе.) Эта черта — один из наименее заметных индикаторов возможного метаморфизма; это необходимое, но недостаточное предварительное условие. Сканирование этой черты, вероятно, вызовет много ложных срабатываний, но это ценная информация, которую необходимо знать, поскольку она может вызвать подозрения и дать повод для дальнейшего изучения контракта, особенно если смарт-контракт содержит опкод, описанный далее.
    5. Содержит ли контракт развертывателя код операции CREATE2? Как упоминалось выше, развертывание с помощью CREATE2 является важным предварительным условием для метаморфизма. Если контракт развертывателя содержит код операции CREATE2, это может указывать на то, что он использовал CREATE2 для развертывания рассматриваемого контракта. Если развертыватель действительно использовал CREATE2 для развертывания указанного контракта, хотя это не означает, что контракт обязательно является метаморфическим, это означает, что он может быть быть метаморфическим, и может быть разумно действовать с осторожностью и исследовать дальше. Опять же, остерегайтесь ложных срабатываний: СОЗДАТЬ2 есть много законное использование, в том числе укрепление Масштабирующие решения «уровня 2» и упростить создание смарт-контрактных кошельков, которые могут улучшить web3 адаптация пользователей и параметры восстановления ключей.
    6. Код изменился? Это самый очевидный теллс, но он появится только после того, как метаморфический контракт уже трансформируется. Если хэш кода смарт-контракта — уникальный криптографический идентификатор — отличается от того, который был при первоначальном развертывании контракта, то, вероятно, код был удален, заменен или изменен. Если хэши больше не совпадают, значит, что-то изменилось в коде, и контракт может измениться. Этот флаг — самый верный индикатор метаморфизма, но он не поможет предсказать или упредить морфинг, поскольку он только проверяет, что он уже произошел.

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

Как злоумышленник может использовать метаморфические контракты для кражи средств людей

Вот как кто-то может использовать метаморфический смарт-контракт как часть мошенничества. 

Во-первых, это этап настройки. Злоумышленник развертывает смарт-контракт по определенному адресу в блокчейне, используя два инструмента: метаморфный байт-код и код операции CREATE2. (Позже мы подробнее остановимся на обеих этих концепциях.) Затем метаморфический байт-код делает то, что предполагает его название, и «преобразовывается». Здесь он превращается в договор о размещении ставок где пользователи могут размещать токены ERC-20. (Опять же, мы обсудим детали этого трюка с морфингом позже. Обещаю!)

Далее идет приманка и переключатель. Ничего не подозревающие пользователи вкладывают свои токены в этот контракт, соблазненные возможностью получения дохода или какой-либо другой привилегии. Затем злоумышленник удаляет весь код стейкинга и «состояние» — хранилище или память блокчейна — по этому адресу смарт-контракта, используя Код операции САМОУНИЧТОЖЕНИЕ обсуждалось в предыдущем разделе. (Следует отметить, что токены, которые существуют как часть отдельного контракта ERC-20, сохраняются, на них не влияет самоуничтожающийся контракт.)

Наконец, коврик-тянуть. Злоумышленник повторно использует тот же метаморфический байт-код, что и на этапе установки, для «повторного развертывания» нового контракта. Этот новый контракт развертывается по тому же адресу, который недавно был освобожден самоуничтожающимся контрактом. Однако на этот раз байт-код «превращается» (опять же, позже мы объясним, как) во вредоносный контракт, который может украсть все токены, размещенные на адресе контракта. Мошенничество завершено. 

Риски, которые представляют собой метаморфические смарт-контракты, уже очевидны. Но вам все еще может быть интересно, как на самом деле работает этот трюк с метаморфизмом? Чтобы понять это, вы должны исследовать глубже, на уровне байт-кода. 

Как CREATE2 открывает возможность метаморфизма 

СОЗДАТЬ2 это обновление кода операции, познакомился с Эфириумом в феврале 2019 года, который предлагает новый способ развертывания смарт-контрактов. 

CREATE2 дает разработчикам больший контроль над развертыванием своих смарт-контрактов, чем раньше. Оригинальный код операции CREATE затрудняет для разработчиков контроль адреса назначения смарт-контракта, который необходимо развернуть. С CREATE2 люди могут заранее контролировать и знать адрес конкретного смарт-контракта, прежде чем фактически развернуть его в блокчейне. Это предвидение — плюс несколько хитрых уловок — позволяет людям создавать метаморфические смарт-контракты. 

Как CREATE2 может предсказывать будущее? Вычисление кода операции является детерминированным: пока входные данные не меняются, адрес, определенный CREATE2, не изменится. (Даже самое маленькое изменение приведет к тому, что развертывание произойдет в другом месте.)

Если говорить более детально, CREATE2 — это функция, которая объединяет и хэширует вместе несколько элементов. Во-первых, он включает адрес исполнителя (или отправителя): инициирующий смарт-контракт, который действует как родитель для создаваемого контракта. Затем он добавляет произвольное число, предоставленное отправителем (или «соль»), что позволяет разработчику развертывать один и тот же код по разным адресам (путем изменения соли) и предотвращает перезапись существующих идентичных контрактов. Наконец, он использует хэш keccak256 некоторого байт-кода инициализации («init») смарт-контракта, который является семенем, превращающимся в новый смарт-контракт. Эта хешированная комбинация определяет адрес Ethereum, а затем развертывает данный байт-код по этому адресу. Так долго как байт-код остается точно таким же, CREATE2 всегда будет развертывать данный байт-код по одному и тому же адресу в блокчейне.

Вот как выглядит формула CREATE2. (Примечание: вы заметите еще один элемент, «0xFF», в приведенном ниже примере. Это просто константа, которую CREATE2 использует для предотвратить столкновения с предыдущим кодом операции CREATE.)

Теперь, когда у нас есть способ развертывания кода по детерминированному адресу, как можно изменение код по тому же адресу? Поначалу это может показаться невозможным. Если вы хотите развернуть новый код с помощью CREATE2, байт-код должен измениться, и поэтому CREATE2 будет развернут по другому адресу. Но что, если разработчик сконструировал байт-код таким образом, чтобы он мог «преобразовываться» в другой код, когда CREATE2 развертывает смарт-контракт?

Как на самом деле работает метаморфический контракт

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

Одним из таких необходимых компонентов является Метаморфическая Контрактная Фабрика, мозг операции. Эта «Фабрика» отвечает за развертывание Метаморфического контракта, а также другого смарт-контракта, называемого Контрактом на реализацию, названного так потому, что его код в конечном итоге внедряется внутри Метаморфического контракта. Тонкая хореография между этими тремя контрактами приводит к метаморфизму, как показано на диаграмме ниже.

Инструмент для обнаружения метаморфических смарт-контрактов PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.

Давайте обсудим каждый шаг, 1-7, подробно, чтобы осветить операции на работе.

Шаг 1: Разработчик приводит все в движение

Кодировщик разрабатывает некоторый код смарт-контракта — байт-код контракта на реализацию — который в конечном итоге окажется в метаморфическом контракте. Разработчик отправляет этот код в фабрику метаморфических контрактов, смарт-контракт, основной целью которого является развертывание других смарт-контрактов. Это действие запускает весь процесс создания Metamorphic Contract.

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

Шаг 2: Фабрика развертывает контракт на реализацию

Первый контракт, развертываемый Фабрикой, — это Контракт на реализацию, который содержит код реализации. (Мы знаем, что это креативно.) Думайте о Контракте на реализацию как о погрузочной доке или путевой точке, которая содержит некоторый код перед отправкой в ​​конечный пункт назначения, который в данном случае будет находиться внутри Контракта Метаморфа. 

Шаг 3: Factory сохраняет адрес контракта на реализацию

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

Шаг 4: Фабрика развертывает Metamorphic Contract

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

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

Инструмент для обнаружения метаморфических смарт-контрактов PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.

Шаг 5: Метаморфический байт-код запрашивает Factory для адреса контракта на внедрение

Метаморфический байт-код запрашивает у Фабрики адрес контракта на реализацию (сохраненный на шаге 3). Неважно, изменится ли адрес контракта на реализацию, пока метаморфический байт-код, который запрашивает адрес, остается прежним. Действительно, если разработчик позже развернет новый контракт на реализацию — например, вредоносный, предназначенный для кражи токенов — он обязательно будет развернут по другому адресу блокчейна на шаге 2. Это не повлияет на создание метаморфического контракта.

Шаг 6: Код контракта реализации копируется в метаморфический контракт.

Используя адрес блокчейна, полученный на шаге 5, метаморфический байт-код находит код в контракте на реализацию и копирует этот код в локальное хранилище метаморфического контракта. Вот как меняется форма Метаморфического контракта: путем копирования кода из Контракта на реализацию. 

Шаг 7: промойте и повторите

Разработчик может повторять шаги с 1 по 6 снова и снова и заменять код в Метаморфическом контракте на любой другой в виде нового контракта на реализацию. Все, что нужно, — это использовать код операции SELFDESTRUCT — или, что более хитро, коды операций DELEGATECALL, которые в конечном итоге приводят к SELFDESTRUCT — для удаления ранее существовавшего кода в Metamorphic Contract. Повторяя цикл с новым байт-кодом Контракта Реализации, Контракт Метаморфа, как по волшебству, превращаться!

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

Все, что развернуто в Контракте на реализацию, в конечном итоге попадет в Контракт Метаморфа. В этом суть трюка. 

Метаморфические смарт-контракты нарушают неявный социальный договор web3 о том, что вы видите то, что получаете. Подобно тому, как в игре с ракушками используются три движущихся чашки, чтобы спрятать мяч, взаимодействие трех контрактов при создании метаморфического контракта затрудняет отслеживание истинной функции контракта. Игра в ракушки является особенно подходящим сравнением, потому что мошенники часто используют ловкость рук и неверное направление, чтобы гарантировать себе победу. В версии для web3 составители метаморфических контрактов могут аналогичным образом заставить «мяч» — то есть код реализации — исчезнуть (читай: самоуничтожиться) и заменить его чем угодно.

Существование метаморфических контрактов означает, что пользователи web3 могут заключать контракты, которые могут изменяться по желанию — вот почему так важно понимать эту угрозу и защищаться от нее. Мой Метаморфический Детектор Контрактов предлагает лишь первый шаг к идентификации метаморфических контрактов по той ловкости рук, которую они используют. Есть несколько способов улучшить детектор в будущем. Например, рекурсивно проверяя Фабрику (или контракт развертывателя), которая создала Метаморфический контракт, можно увидеть, является ли Фабрика сама по себе метаморфической. Эта функция будет полезным дополнением к обновленной версии 2 Детектора.

Стоит повторить еще раз: этот инструмент Detector не является надежным. Флажки, которые он улавливает, не все явные признаки метаморфического потенциала, но они дают подсказки. Идентификация этих флагов — это только начало более тщательного расследования. Вот почему мы расширили Детектор для поиска флагов, которые могут легко генерировать ложные срабатывания, например наличие кодов операций CREATE2 или DELEGATECALL. Если у вас есть предложения по улучшению инструмента или вы хотите развить или дополнить эту первоначальную работу, свяжитесь со мной по адресу .

Анализируйте смарт-контракты на метаморфические черты с помощью инструмента Детектор и посетить Репо GitHub для большего

Редактор: Роберт Хакетт @rhhackett

Благодарности: я хочу выразить ОГРОМНУЮ признательность и поблагодарить Роберта Хакетта, Эдди Лаззарина, Сэма Рэгсдейла, Рияза Файзуллабхоя, Ноа Ситрона, Мейсона Холла и Дэджун Парка за ценные отзывы и советы по созданию этого поста и инструмента. 

Мнения, выраженные здесь, принадлежат отдельным цитируемым сотрудникам AH Capital Management, LLC («a16z») и не являются мнением a16z или ее аффилированных лиц. Определенная информация, содержащаяся здесь, была получена из сторонних источников, в том числе от портфельных компаний фондов, управляемых a16z. Хотя информация взята из источников, считающихся надежными, a16z не проводила независимую проверку такой информации и не делает никаких заявлений о неизменной точности информации или ее уместности в данной ситуации. Кроме того, этот контент может включать стороннюю рекламу; a16z не просматривал такие рекламные объявления и не поддерживает какой-либо рекламный контент, содержащийся в них.

Этот контент предоставляется только в информационных целях и не может рассматриваться как юридическая, деловая, инвестиционная или налоговая консультация. Вы должны проконсультироваться со своими советниками по этим вопросам. Ссылки на любые ценные бумаги или цифровые активы предназначены только для иллюстративных целей и не представляют собой инвестиционную рекомендацию или предложение предоставить консультационные услуги по инвестициям. Кроме того, этот контент не предназначен и не предназначен для использования какими-либо инвесторами или потенциальными инвесторами, и ни при каких обстоятельствах на него нельзя полагаться при принятии решения об инвестировании в какой-либо фонд, управляемый a16z. (Предложение инвестировать в фонд a16z будет сделано только в меморандуме о частном размещении, договоре о подписке и другой соответствующей документации любого такого фонда, и их следует читать полностью.) Любые инвестиции или портфельные компании, упомянутые, упомянутые или описанные не являются репрезентативными для всех инвестиций в транспортные средства, управляемые a16z, и нет никаких гарантий, что инвестиции будут прибыльными или что другие инвестиции, сделанные в будущем, будут иметь аналогичные характеристики или результаты. Список инвестиций, сделанных фондами, управляемыми Andreessen Horowitz (за исключением инвестиций, в отношении которых эмитент не предоставил разрешение на публичное раскрытие информации a16z, а также необъявленных инвестиций в публично торгуемые цифровые активы), доступен по адресу https://a16z.com/investments. /.

Диаграммы и графики, представленные в нем, предназначены исключительно для информационных целей, и на них не следует полагаться при принятии каких-либо инвестиционных решений. Прошлые показатели не свидетельствуют о будущих результатах. Содержание говорит только по состоянию на указанную дату. Любые прогнозы, оценки, прогнозы, цели, перспективы и/или мнения, выраженные в этих материалах, могут быть изменены без предварительного уведомления и могут отличаться или противоречить мнениям, выраженным другими. Пожалуйста, посетите https://a16z.com/disclosures для получения дополнительной важной информации.

Отметка времени:

Больше от Andreessen Horowitz