Игры с Ethereum Classic могут плохо закончиться

Это письмо я отправил своим клиентам по безопасности/аудиту. Я публикую его, так как оно содержит информацию, важную для многих участников Ethereum.

Игры с Ethereum Classic могут плохо закончиться

К сожалению, похоже, что Ethereum Classic продолжит действовать еще какое-то время.

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

Я описал некоторые направления атаки здесь, а д-р Эмин Ган Сайрер изложил свои соображения по этому вопросу здесь; рекомендую сначала ознакомиться с этими материалами.

И все же здесь мы обсудим не теоретические проблемы, а практические.

Цитата из @LilButerin:

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

Предметы беспокойства

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

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

Простейший пример: продажа монет на бирже Poloniex

Пусть вы хотите получить немного биткоинов в обмен на свои классические монеты, которые представляются вам бесполезными. Вы отправляете их на Poloniex на адрес депозита ETC.

Вы продаете монеты, выводите биткоины, и вроде бы все нормально. Но однажды... Вы заходите в свой клиент, отслеживающий неклассическую цепочку, и обнаруживаете, что монеты пропали. Куда они делись?

Некий сторонник Ethereum Classic отправил их на тот же адрес, что и адрес депозита ETH Classic, но на этот раз в основной цепочке, просто воспроизведя транзакцию в основной цепочке.

При большом везении Poloniex сможет отследить для вас эти монеты в основной цепочке. Но скорее всего вы потеряете их, если только кто-нибудь не заметит, что произошло, и не поможет вам по своей инициативе.

Худший случай: авторизация вызовов и нарушение состояния

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

Представьте контракт, который делает ходы в игре «крестики-нолики» и реализует следующие правила: ответные ходы делают пользователи и действуют обычные условия выигрыша.

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

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

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

Если у вас в голове крутятся вопросы о ваших собственных кошельках с несколькими ключами MultiSig или DAO, в которых вы контролируете средства или входите в группу авторизации, — вы беспокоитесь не зря. Ответы не очень приятны.

Так как контракты могут полагаться на все что угодно — имеющиеся балансы, результаты исполнения других контрактов за рамками их контроля, хэши блоков, — вас могут ожидать серьезные проблемы.

Уязвимости DAO

Пусть у вас есть список адресов для выплат в цепочке Classic и список в основной цепочке. Также предположим, что контракт в основной цепочке активно работает, а в классической нет, так как ваша DAO решила использовать основную цепочку.

Теперь представим, что был выполнен и одобрен крупный платеж, возможно, в связи с «обновлением» — для перевода всех средств в новую версию контракта — с использованием следующей процедуры:

  1. Адрес добавляется в список предложений выплаты.
  2. Предложение выплаты ставится на голосование и принимается.
  3. Производится выплата.

Если кому-либо разрешено добавлять предложение выплаты, атака выглядит следующим образом:

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

Вот вы и получили контроль над деньгами!

Эта ситуация подобна уязвимости типа «крестики-нолики», рассмотренной выше; мы заменяем один «ход» новым, оставляя прочие вызовы без изменений.

Существует много возможностей, подобных этой, начиная от атак на казино и заканчивая атаками на биржи. Это может стать настоящим безумием.

Снижение риска

В своей первой статье по данному вопросу я рекомендовал одновременно перевести свой эфир в другие контракты, по одному в каждой цепочке.

Для всех контрактов, которые допускают это, данная процедура должна быть выполнена немедленно.

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

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

При поступлении денег контракт проверяет хеш последнего блока и использует его для выбора слота, передавая все деньги на данный слот.

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

Обратите внимание, что данный подход не защищает от атак, основанных на авторизации или вызовах функций.

Сколько нужно слотов?

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

Это вариант задачи о днях рождения. Если вам требуется вероятность совпадения 1 %, то необходимо приблизительно 200 слотов. Это может потребовать большого объема работы.

В качестве альтернативы я рекомендовал бы создать контракт с 10 слотами и разрешить повторную передачу через него эфира в случае коллизии — 10 слотов дают шанс коллизии приблизительно 18 %; при небольшом количестве повторных передач можно будет обнаружить ту, которая разделяет средства между двумя вселенными.

Заключение

Не передавайте эфир по цепочке Classic, независимо от причины, если не хотите подставиться под атаку с воспроизведением; сначала разделите свой эфир между новыми адресами, по одному на каждую цепочку. Затем можно будет успешно работать дальше.

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

Я и моя команда предлагаем консультационные услуги по подобным вопросам: вы можете связаться со мной по адресу consulting@vessenes.com.

Категория: 
Безопасность
10
Средняя: 10 (2 оценок)
0
Ваша оценка: Нет
2329 / 0
Аватар пользователя admin
Публикацию добавил: admin
Дата публикации: вт, 07/26/2016 - 14:18

Что еще почитать:

Комментарии:

Аватар пользователя Флинт!

Флинт!

Глори ту зэ Эфир Классик! Победа будет за нами!

вт, 07/26/2016 - 16:23

Аватар пользователя Оптимист

Оптимист

Победы не будет. Утонут оба

вт, 07/26/2016 - 20:50

Аватар пользователя Петя

Петя

ребята,настоящий эфир- это классик. а форкнутый эфир-это скам.

вт, 08/02/2016 - 18:03

Добавить комментарий