Атака TheDAO и способы её устранения. Краткий FAQ


Эфир, хранящийся в ДАО, был украден. Если сообщество Эфира согласится с неким видом форка (по сути отката), весь Эфир может быть восстановлен. Крайне важно отметить, что ошибка была не в самой платформе Эфириум или в языке программирования смарт-контрактов Solidity. Баг был в конкретном контракте (аналоге приложения), запущенного на верхнем уровне Эфириума (то есть баг в самом ДАО)

Что произошло?

3,641,694 ETH были выведены из TheDAO. Атакующий нашел лазейку в функции сплита ДАО, которая позволяла повторно использовать одни и те же токены ДАО с высокой частотой.

Как произошло?

Атакующий решил скомбинировать два эксплойта:

  1.  рекурсивный вызов функции сплита ДАО 
  2.  сплит без уничтожения токенов в оригинальном ДАО. 


Рекурсивный вызов функции сплита ДАО означает, что первое стандартное обращение активизирует триггер второго (нестандартного) обращения функции, второе обращение активизирует триггер следующего и так далее. Это позволит атакующему производить сплит до 40 раз за транзакцию. Больше атакующий сплитовать не мог, потому что в этом случае транзакция была бы слишком длинной и достигла бы газ лимита. (прим. переводчика gas limit – максимально возможный размер gas, который может принять конкретный блок, и это выступает индикатором принятия решения о дальнейшем поведении системы. Gas –внутренняя «валюта», производная эфира, которой люди платят за запись своей транзакции в блок).

Атака будет болезненной в любом случае; что сделало эту атаку особенно болезненной, так это то, что атакующий повторял атаку с двух одинаковых адресов с одинаковыми токенами раз за разом (примерно 250 раз с каждого из 2х адресов). Это означает, что атакующий нашел второй эксплойт, который позволил делать сплит без уничтожения токенов в основном ДАО. Они убирали токены с атакующего адреса до того, как контракт мог уничтожить их путем отправки на адрес 0x0; после этого токены отсылались обратно на атакующий адрес. Сочетание обоих эксплойтов мультиплицировала эффект. Первый эксплойт сам по мог быть достаточно интенсивным, так как атакующему пришлось бы самому включить в процесс порядка 1/40 объема украденных токенов; второй эксплойт транзакции с той же повторностью токенов также имел бы серьезный эффект. А сочетание двух эксплойтов привело к тому, что произошло в итоге.

Почему атакующий не переместил весь эфир в дочернюю ДАО?

Технических обоснований для этого нет. Любопытно отметить, что опустошение ДАО прекратилось, когда Виталик опубликовал первый пост на блоге (https://blog.ethereum.org/2016/06/17/critical-update-..) на эту тему и и упомянул возможность софт- и хард-форков( далее SF и HF) адреса атакующего. Атакующего скорее всего остановило то, что вероятность консенсуса по поводу хард-форка выросла бы вместе с количеством украденного эфира.

Что случилось с остальным Эфиром?

Весь эфир, остающийся в ДАО, переведен в другие сплиты. Абсолютное большинство оставшегося эфира переведено в ДАО, которую контролируют известные и пользующиеся доверием члены сообщества.

Так как Эфир атакующего является копией ДАО контракта, может ли украденный Эфир быть «украден обратно» тем же способом?

Да. Одна возможность – это сделать ответную атаку. Конечно, это сработает если атакующий не контратакует в свою очередь. Это может быть реализовано с помощью SF, когда майнеры будут принимать только транзакции, относящиеся к ДАО, которые инициированы контрактом, контролируемом кураторами операции. Более подробно механизм предложенной контратаки описан ниже.

Как будет работать предложенный софт-форк?

SF остановит все транзакции, уменьшающие баланс контракта, который использует код ДАО. Это означает, что будет воздействие на само ДАО и все сплиты, включая вредоностные. При этом будут два исключения: курирующий контракт и специально созданный для контратаки контракт.

Доступна ли уже версия клиента Эфириума с этой модификацией?

Да. Geth — клиент,  который использует большинство майнеров, сегодня опубликовал ссылку на апдейт для SF (https://github.com/ethereum/go-ethereum/releases/tag/..)

Что должно случиться, чтобы SF был активирован?

Это зависит от того, будет ли собрана квота при голосовании майнеров за SF. Голосование реализовано через голосование за газ лимит. Если на блоке 1 800 000 газ лимит будет ниже 4 000 000, SF будет активирован. Базовая настройка газ лимита 4 700 000. Каждый майнер, который не сделал апдейт, будет «задействовать» блок, отодвигая газ лимит немного назад в этом направлении. Поэтому должно быть полное большинство майнеров, проголосовавших за газ лимимт, для активации SF на блоке 1 800 000. После этого блока, газ лимит снова может быть увеличен до уровня по умолчанию – 4 700 000.

Если софт-форк будет успешен, что дальше?

Есть две основных возможности. Первая – осуществление контратаки, описанной выше. Если атака будет успешна, это поможет вернуть весь украденный эфир в течение 75 дней. 
Сама атака достаточно сложна, но краткая суть вот (схема прикреплена ниже):

  1. Инвестировать немного Эфира в darkDAO, чтобы получить к нему доступ (Для этого базовый ДАО должен принять предложение,которое потребует голосование держателей токенов)
  2. Сделать сплит предложение, которое займет 7 дней, в darkDAO
  3. Произвести рекурсивную сплит атаку в сплит предложении
  4. Инициировать еще один сплит и подождать 27 дней до завершения периода формирования
  5. Наконец, сделать стандартное предложение, которому понадобится 14 дней, чтобы выслать деньги назад.


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

Если ничего не будет сделано и форк не будет реализован, что произойдет?

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

В чем разница между хард- и софт-форком?

SF означает, что состояние/блок, который до этого являлся «верным» (корректным), в новой версии «верным» быть перестает. В этом случае, операция, результатом которой будет перевод Эфира с любого из контрактов с кодом ДАО, будет воспринята как «некорректная». HF делает «верным» состояние/операцию, которая не была корректной до того. Огромное преимущество SF в том, что только майнерам придется обновлять ПО. В противном случае, это придется сделать каждому — если все будут ждать достаточного количества подтверждений, они воспримут только операции, которые корректны по новым правилам. В HF каждый (держатели, обменники и т.д.) будет должен сделать апдейт ПО, в противном случае они не смогут использовать Эфир и все производные Эфира, так как все после HF будут «игнорировать» их транзакции. Либо они могут получить Эфир, идущий по неверной цепи так, как будто оплата была совершена, хотя уже на корректной цепи  после форка оплаты не произошло. Так как апдейт придется сделать каждому, HF может занять больше времени, чем SF. Но как клянутся разработчики, эффективность качественного HF достаточно высока.


Можем ли мы выяснить личность атакующего?

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

Когда хакер начал планировать атаку?

Два ключевых контракта, содержащих токены и включающих логику, способную рекурсировать сплит, были созданы за 2 дня до атаки. То есть как минимум 2 дня. При этом сам сплит был инициирован за 7 дней до атаки. Мы знаем, что сплит не был инициирован самим хакером. Для хакера это не было проблемой, так как он мог предпринять еще один сплит от сплита, чтобы получить украденные токены и подконтрольный Эфир в рамках ДАО.

Могу ли я дальше торговать токенами ДАО, если софт форк будет реализован?

Да. Каждая транзакция, не относящаяся к балансу Эфира контракта с кодом ДАО, по-прежнему возможна.


Наблюдать за состоянием применения софт форка можно здесь

Реклама

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

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s