Back to Blog

Компромисс между удобством и безопасностью: безлимитное одобрение в ERC20

August 17, 2021
10 min read

Аннотация

В Ethereum стандарт токенов ERC20 широко используется компаниями и пользователями для создания децентрализованных приложений (DApps). Многие токены ERC20 обладают большой ценностью и активно циркулируют на крипторынке. Кроме того, благодаря бурному развитию экосистемы DeFi торговля токенами ERC20 становится всё более частым явлением. Согласно стандарту ERC20, для предоставления DApp или другим пользователям разрешения на снятие токенов вызывается метод approve(). На практике многим DApp требуется неограниченное разрешение от пользователей, и такая архитектура породила серьезную проблему. Ряд инцидентов привел к огромным убыткам как для пользователей, так и для самих DApp.

0xffffff. Предисловие

Будучи темой, обсуждаемой уже долгое время, «неограниченное разрешение» (Unlimited Approval) стало актуальным с момента бурного развития DeFi и ряда инцидентов безопасности. Вдохновившись многими из этих случаев, мы вновь проводим комплексное исследование «неограниченного разрешения» в различных аспектах. В то же время мы получили приглашение выступить на 29-й конференции Blockchain Village и рассказать об этой проблеме.

Рекомендации по чтению:

  • Если вы новичок в Ethereum, мы настоятельно рекомендуем прочитать всю статью целиком.
  • Если вы эксперт в Ethereum и уже сталкивались с неограниченным разрешением, можете начать чтение с раздела 0x2.

0x0. Предпосылки

Прежде чем мы перейдем к обсуждению того, «что такое неограниченное разрешение», я хотел бы напомнить вам, «что такое разрешение (approval) в токене ERC20».

Токены ERC20

В Ethereum, помимо эфира (Ether), на крипторынке циркулируют различные токены, обладающие большой ценностью. ERC20 — самый популярный стандарт токенов. По нашим неполным статистическим данным, на сайтах CoinGecko (агрегатор цен токенов) и Uniswap (одна из самых известных на текущий момент децентрализованных бирж) зарегистрировано более 5 600 и 44 000 токенов ERC20 соответственно.

Механизм разрешения (Approval Mechanism)

Процесс одобрения в основном касается трех сущностей (отправитель, тратящий/spender и контракт токена), а также двух функций (approve, transferFrom) и двух переменных (balanceOf, allowance) в стандарте ERC20 (как показано на рисунке ниже).

Для понимания процесса одобрения мы приводим рисунок ниже и объясняем, как функции approve и transferFrom изменяют состояние контракта токена.

  1. (Шаг 1) В исходном состоянии отправитель владеет 100 токенами в контракте, а тратящий не имеет никаких разрешенных к списанию allowance от отправителя.
  2. (Шаг 2) Отправитель вызывает функцию approve, чтобы предоставить тратящему разрешение на 100 токенов. Таким образом, allowance[sender][spender] увеличивается с 0 до 100, при этом balanceOf отправителя не меняется.
  3. (Шаг 3) Наконец, тратящий вызывает transferFrom, чтобы перевести 80 токенов от отправителя себе. В результате balanceOf как отправителя, так и тратящего обновляется (становится 20 и 80 соответственно), а allowance тратящего уменьшается до 20.

Три типа разрешений в реальности

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

  • Нулевое разрешение: сумма одобрения равна нулю. По сути, это означает, что пользователь/отправитель пытается отозвать свое разрешение у определенной платформы/тратящего.
  • Неограниченное разрешение: сумма одобрения равна максимальному значению uint256 (0xffff...ffff) или общему объему эмиссии токенов. Этот тип одобрения часто используется многими платформами DeFi (например, биржами, платформами кредитования).
  • Другие разрешения: этот тип охватывает остальные случаи. Пользователи обычно запускают такое одобрение на основе функции изменения лимита, поддерживаемой платформами или кошельками.

0x1. Инциденты в реальном мире

Существуют также реальные инциденты, связанные с упомянутой выше проблемой одобрения. В нашем докладе мы подробно разобрали две из этих историй (UniCat, Bancor Finance). Если вы хотите узнать больше об этих инцидентах, вы можете перейти по ссылкам ниже:

0x2. Некоторые показатели

В этом разделе мы представим наше подробное исследование как с внесетевой (off-chain), так и с внутрисетевой (on-chain) стороны. Чтобы лучше понять текущую ситуацию с «неограниченным разрешением», мы выступили в роли фронтенд-пользователя для проведения наших измерений.

Процесс одобрения в реальном мире

На рисунке выше показано, что фронтенд-пользователям может потребоваться шесть шагов для завершения транзакции одобрения. Существует четыре основных участника (фронтенд-пользователи, кошельки, платформы, контракты токенов). Давайте пройдемся по этому потоку шаг за шагом:

Шаг 1, 2: Большинство пользователей фронтенда (на мобильных устройствах, сайтах) подключают свои кошельки к выбранной платформе и отправляют запросы на обслуживание.

Шаг 3: Затем от платформы к кошельку пользователя поступает запрос, платформа формирует транзакцию одобрения с требуемыми данными (самое важное — сумма одобрения) и отправляет ее в кошелек пользователя для подтверждения.

Шаг 4, 5: После получения транзакции одобрения кошелек отображает соответствующую информацию для пользователя и ожидает его подтверждения.

Шаг 6: Как только пользователь подтверждает транзакцию, кошелек отправляет ее в сеть для валидации. После проверки транзакция изменяет состояние контракта токена (Allowance[Пользователь][Платформа]).

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

Внесетевое (Off-chain) исследование

Мотивация

В реальном процессе одобрения легко обнаружить, что пользователи фронтенда напрямую взаимодействуют с интерфейсом кошелька и платформы. Поэтому мы выбрали 15 известных кошельков и 24 платформы DeFi и провели внесетевое исследование.

(Результаты исследования обобщены на двух рисунках ниже.)

Более того, мы в основном учитывали их пояснения и гибкость в отношении одобрения:

  • Пояснения
  • Кошелек: 1) Отображает ли кошелек корректную информацию о транзакции одобрения (включая пользователя, тратящего, токен и сумму одобрения); 2) Выдает ли кошелек специальное предупреждение или уведомляет пользователей о «неограниченном разрешении».
  • Платформа: (Критерий 1) Предоставляет ли платформа четкое объяснение транзакции одобрения в веб-интерфейсе; (Критерий 2) Уведомляет ли платформа пользователей о факте транзакции одобрения; (Критерий 3) Уведомляет ли платформа пользователей о том, что последовательно выполняются две транзакции.
  • Гибкость: Предоставляет ли интерфейс (в кошельках или платформах) функцию изменения суммы одобрения.

(В следующем разделе мы покажем результат того, как вышеуказанные два аспекта реализованы в кошельках и на платформах. Мы выбрали по два примера для каждого.)

0x222. Кошельки: Metamask и Coinbase

Мы представим результаты нашего исследования кошельков Coinbase и Metamask (расширение для Chrome). Согласно информации в Google Play Store (показанной на рисунке ниже), Coinbase и Metamask имеют более 1 млн установок. При этом Coinbase получает больше отзывов от клиентов и имеет более высокий рейтинг.

Для исследования двух кошельков мы использовали их, чтобы протестировать функцию обмена на платформе Compound. Обратите внимание: платформа Compound по умолчанию запрашивает «неограниченное разрешение» для пользователей.

Кошелек 1: Metamask

Как показано на рисунке ниже, когда пользователи проверяют транзакцию одобрения, сформированную Compound, они могут увидеть полную информацию, включая адрес тратящего, подпись одобрения и сумму (Шаг 2). Более того, Metamask даже позволяет пользователям изменять сумму одобрения с помощью кнопки «Редактировать» (Шаги 2, 3, 4).

Кошелек 2: Coinbase

По сравнению с кошельком Metamask, кошелек Coinbase вообще не предоставляет важной информации. Пользователи могут увидеть подробности только после подтверждения транзакции одобрения (рисунок ниже). Обратите внимание, что этапы 2, 3 и 4 отображаются только во время или после того, как транзакция одобрения находится в режиме ожидания или уже завершена. Таким образом, кошелек Coinbase скрывает необходимую информацию о транзакции и не предоставляет никакой функции изменения суммы одобрения.

0x223. Платформы: Bancor и Curve Finance

В этом разделе мы сравним Bancor и Curve Finance. Как показано на рисунке ниже, основываясь на свежей статистике (на 7 августа 2021 года) от defipulse, Curve Finance и Bancor являются первой и пятой DEX (децентрализованной биржей) по объему заблокированных средств (TVL).

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

Платформа 1: Bancor

При тестировании функции обмена на Bancor платформа объясняет необходимость транзакции одобрения (рисунок ниже) и даже предоставляет пользователям две опции (неограниченное/ограниченное одобрение). Помимо неограниченного, ограниченное одобрение в Bancor требует только точную сумму allowance, которую пользователи собираются использовать для обмена.

Платформа 2: Curve Finance

Однако на Curve Finance происходит «интересная» вещь. Как показано на рисунке ниже, когда мы запрашиваем обмен, интерфейс Curve Finance отображает «Пожалуйста, одобрите 10 USDT для обмена» (рисунок ниже), но Metamask получает транзакцию с неограниченным одобрением. Это, безусловно, вводящая в заблуждение информация.

Позже, когда мы попытались выяснить причину у Curve Finance, они признали нашу озабоченность и сказали, что это связано с тем, что «пользователям не нравится одобрять каждый раз» (рисунок ниже).

Так же, как и у Curve Finance, интерфейс Yearn Finance имеет ту же проблему. (Мы также упомянули об этом и показали доказательства в нашем докладе).

0x23. Внутрисетевое (On-chain) исследование

0x231. Мотивация

Чтобы лучше понять ситуацию с «неограниченным разрешением» в блокчейне, мы собрали все транзакции (по 30 апреля 2021 года). Как показано на графике ниже, количество «неограниченных разрешений» в наши дни растет очень быстро. В ходе нашего исследования мы обнаружили, что появление UniswapV2, по-видимому, является основным фактором, стимулирующим этот рост. Мы подробнее объясним этот момент на основе наших результатов измерений.

В то же время, чтобы изучить «неограниченное разрешение» от лица как токена, так и платформы (поскольку они являются наиболее связанными сущностями, а не сами пользователи), мы разделим исследование на два аспекта:

  • Распределение «Неограниченных разрешений»
  • Анализ рисков

0x232. Распределение «Неограниченных разрешений»

Чтобы помочь понять графики ниже, мы сначала объясним каждый термин:

  • Ось Y (Коэффициент макс. одобрения): Большее значение -> выше процент «Неограниченных разрешений» среди всех транзакций одобрения.
  • Ось X (Активность/Liveness): Большее значение -> активнее платформы или токены. Значение активности зависит от количества транзакций одобрения и разницы во времени между первой и последней транзакцией одобрения.
  • Размер точки: Больший размер -> больше транзакций одобрения вовлечено данным токеном или платформой.

(Два графика ниже показывают только 1000 токенов/платформ, наиболее часто вовлеченных в транзакции одобрения).

(Платформа)

(Токен)

Платформа: Глядя на график платформы, UniswapV2 явно доминирует над всеми остальными по трем показателям. Вот почему мы утверждаем, что «появление UniswapV2 является основным фактором, стимулирующим рост неограниченных одобрений».

Токен: Что касается распределения, USDC, USDT и DAI показывают лучшие результаты по трем вышеуказанным критериям. Все эти токены являются стейблкоинами, что логично, так как стейблкоины обычно используются для ведения торговли на крипторынке. Что касается других выделенных токенов (топ-10), они довольно похожи по коэффициенту максимальных одобрений.

0x233. Анализ рисков

Основываясь на полученных результатах, мы выбрали USDC, USDT, DAI (топ-3 токенов) и две платформы (Bancor, UniCat) для проведения анализа рисков. Мы также определили два термина (показаны на рисунке ниже), чтобы помочь раскрыть риски одобренных токенов.

Сумма риска (Risk Amount)

  • Для токена: Сумма риска равна общему количеству токенов, которые могут быть переведены вызовом функции transferFrom.
  • Для платформы: Сумма риска равна общему количеству единичного токена, которое может быть переведено вызовом функции transferFrom.

Уровень риска (Risk Rate)

  • Для фиксированного токена уровень риска представляет собой процент Суммы риска от общего объема эмиссии этого токена.

Токен: Как показано на рисунке ниже, USDC и USDT довольно стабильны (их уровень риска составляет около 10%) в течение полутора лет. У DAI в середине года наблюдается резкий спад, после чего он снова стабилизируется (также около 10%, но с большими колебаниями). Это явление может указывать на некоторые специфические события или рабочий механизм DAI. Таким образом, нам предстоит еще поработать, чтобы изучить причины.

Платформа: Что касается анализа рисков платформ, мы представим график тренда суммы риска (рисунок ниже) для Bancor (с токеном BNT) и UniCat (с токеном UNI).

График тренда Bancor показывает мгновенный рост и падение. Это идеальное объяснение того, как быстро команда перевела свои уязвимые токены из небезопасного контракта в безопасное место.

Что касается графика UniCat, мы подтверждаем, что некоторые очевидные падения на самом деле были вызваны бэкдор-атаками.

0x3. Существующие решения

Как упоминалось ранее, «Неограниченное разрешение» — это тема, существующая в экосистеме долгое время. Благодаря различным обсуждениям были предложены некоторые решения для улучшения процесса одобрения:

  • ERC777
  • EIP2612

Прежде чем переходить к решениям, мы хотели бы напомнить вам об основной мотивации «неограниченного разрешения»:

  • Для approve и transferFrom требуется две транзакции.
  • Настроенные одобрения заставляют пользователей одобрять каждый раз перед торговлей или внесением депозита (что означает оплату дополнительных комиссий за транзакции).
  • Платформы хотят максимизировать удобство пользователя, запрашивая неограниченное разрешение один раз.

0x31. ERC777

Как стандарт токенов, предложенный в 2017 году, ERC777 предлагает следующие пункты для улучшения процесса одобрения токенов ERC20:

  • Пользователи могут «авторизовать» оператора (например, биржу) для перевода своих токенов в желаемом количестве.
  • Пользователям не нужно каждый раз отправлять транзакции для одобрения.
  • Пользователям не нужно беспокоиться о риске «неограниченного одобрения».

В заключение, с помощью ERC777 пользователи могут совершать атомарные покупки с любым авторизованным оператором.

Однако недостатки ERC777 также очевидны:

Высокая комиссия за транзакции из-за хуков (hooks), применяемых в стандарте (подробнее здесь). Пользователи должны выбирать только доверенного оператора (это снова перекладывает вопрос сложности на самих пользователей).

0x32. EIP2612

Что касается EIP2612, в этом предложении автор указывает, что пользователи могут использовать подписанные сообщения для подтверждения транзакции, чтобы им не нужно было платить комиссию за изменение размера allowance. Еще проще говоря, транзакции одобрения становятся бесплатными с EIP2612. К тому же это предложение в настоящее время используется в UniswapV3 для токенов поставщиков кредитования.

0x4. Заключение

Подводя итог, «Неограниченное разрешение» действительно снижает затраты пользователей на выполнение множественных транзакций одобрения. Однако, согласно нашему исследованию, некоторые платформы и кошельки продолжают делать вид, что проблемы нет, в битве за удобство и безопасность. Хуже того, некоторые из них пытаются ввести пользователей в заблуждение, отображая неверную информацию. Поэтому вместо использования «Неограниченного разрешения» мы предлагаем платформам и кошелькам всерьез задуматься о разработке более безопасного интерфейса или протокола, чтобы защитить пользователей с самого начала. Будучи пользователем DeFi, формирование чувства безопасности не должно приходить через опыт эксплуатации уязвимостей, а должно закладываться с самого начала. Мы верим, что создание безопасной и процветающей среды в Ethereum — это ответственность не только сообщества, но и каждого из нас.

О нас

https://www.blocksecteam.com

[email protected]

Twitter: https://twitter.com/BlockSecTeam

Medium: https://blocksecteam.medium.com/