📝 Предотвращение незапланированного потребления RAM (Daniel Larimer)

in #blockchain6 years ago

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

Кратко о ситуации

  1. Никакие токены украдены не были
  2. Правильно реализованные контракты неуязвимы
  3. Процессы управления способны исправить код, поведение которого идет вразрез с намерениями сторон
  4. Для производителей блоков доступны специальные опции защиты
  5. В перспективе обновление может сделать поведение по умолчанию более безопасным

Ничьи токены не пострадали

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

Методики предотвращения злоупотребления

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

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

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

Высвобождение потребленной RAM с помощью процесса управления

Я считаю, что нужно придерживаться намерения кода, понятного пользователям и разработчикам. Если злонамеренный контракт явно эксплуатирует несоответствие между намерением пользователей и фактическим эффектом кода, тогда производители блоков имеют возможность внести такой вредоносный контракт в черный список, пока решается спор между автором контракта и теми, кто с ним взаимодействовал.

Если арбитраж счёл, что поведение кода противоречит намерению сторон, которые взаимодействуют с этим кодом, тогда избранные производители могут обновить код таким образом, чтобы результат соответствовал первоначальному намерению сторон, насколько это возможно. В данном случае код будет обновлен для высвобождения непреднамеренно потребленной RAM и предотвращения подобного потребления в будущем.

Зачем EOSIO нужна эта функция?

Существует множество допустимых вариантов использования функции, которая была применена для потребления RAM. Самый простой вариант использования – это игровой контракт, который способен принимать депозиты пользовательских средств. Биржа может применять код для обработки уведомлений о передаче от контракта токена, а затем зачислять средства на баланс отправителя на бирже. В этом случае биржа и пользователь, делающий депозит, осознанно намереваются разрешить биржевому контракту потреблять RAM пользователя для хранения его баланса. Для биржи может быть нежелательно хранить баланс пользователя в своей собственной RAM, потому что это делает возможным такой вид атаки, когда множество аккаунтов одновременно отправляют на нее мелкие транзакции (т.н. “пыль”).

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

Пресечение незапланированного поведения

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

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

После внедрения предлагаемых изменений существующим контрактам нужно будет получать прямое разрешение на потребление некоторого объема доступной RAM пользователя. Биржевой контракт должен будет попросить пользователя “открыть счет для резервирования места для хранения своего баланса”, прежде чем принять от пользователя депозит. Тогда уведомление о входящем депозите просто увеличит предварительно распределенную RAM, а не выделит новую RAM.

Предлагаемый метод обновления

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

К счастью, процесс обновления контрактов для принятия новой рекомендованной практики должен быть относительно прост.

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

Заключение

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


Переведено @blockchained

Оригинал поста: ЗДЕСЬ


Если вам нравится то, что мы делаем - поддержите witness blockchained в сети EOS


Телеграм чат: https://t.me/EOS_RU


Вы можете торговать токенами EOS на RuDEX с 0% торговой комиссией

Coin Marketplace

STEEM 0.24
TRX 0.11
JST 0.031
BTC 61388.48
ETH 2984.48
USDT 1.00
SBD 3.65