Шрифт:
Интервал:
Закладка:
Но грабитель не мог просто забрать деньги и сбежать. Правила The DAO ограничивали и его. Через функцию вывода эфира из The DAO он мог отправлять деньги только в дочернюю DAO (шлюпку). (У контракта вознаграждения нет своих средств, поэтому, когда нападавший запрашивал сумму, на самом деле ему ничего не отправлялось.) И эти токены запирались в дочерней DAO 59 на двадцать восемь дней – или двадцать семь с чем-то, учитывая, что часики уже тикали. (Сплиты создаются как для вывода денег из системы, так и для создания новых DAO, и, если бы целью этого сплита было создать новую DAO с новыми задачами, тогда эти двадцать восемь дней были бы периодом создания, в течение которого в дочерний проект могут вступить и вложить свои средства другие люди.) Через двадцать восемь дней нападавший мог бы сделать другое предложение с семидневным периодом голосования, чтобы сплитнуться во вторую дочернюю DAO – уже внучку The DAO. А уже там мог бы сделать предложение, чтобы участники той DAO проголосовали за нового куратора, или сделать новым куратором себя, таким образом получив контроль для, собственно, перевода средств на биржу. (И если бы биржа разрешила, он смог бы обналичить средства.) Создание дополнительной DAO не понадобилось бы, если бы он создал DAO 59 сам. Так или иначе, в следующие тридцать пять дней хакер ничего не мог поделать с деньгами. Это давало время тем, кто хотел спасти средства, окно, которое должно было закрыться 22 июля.
Поскольку пока было неизвестно, получится ли у Slock.it и других программистов остановить атаку, они решили заспамить сеть Ethereum, чтобы замедлить вывод средств. Это как искусственно создать на шоссе пробку, чтобы остановить машину грабителей.
Но это только временная заплатка – по двум причинам. Во-первых, тогда бы никакие приложения не могли пользоваться Ethereum. Во-вторых, раз атаку смогли воспроизвести программисты Slock.it и Ethereum, смогут и другие. Теперь у The DAO мог красть любой.
Атака готовилась не один день. Во вторник 14 июня, через два дня после поста Стефана об уязвимости контракта вознаграждения и заявления, что все средства защищены, в 13:42 и затем в 23:05 по берлинскому времени хакер обменял биткойны на токены DAO с помощью ShapeShift – сначала 2 BTC за 7 910 токенов (1 321 доллар), далее тем же вечером – другие 2 BTC за 8 307 токенов (1 387 долларов), еще 2 BTC за 8 306 токенов и еще 1,4 BTC за 52,02 ETH (950 долларов). Он перевел все токены и эфиры на адрес, начинавшийся с 0x969.
В среду 15 июня, в 6:26 по берлинскому времени, хакер с двух разных контрактов проголосовал за создание дочерней DAO 59 (принадлежащей китайскому держателю, но пока пустой). Чуть больше часа спустя закончился семидневный период голосования, после чего к ней уже нельзя было присоединиться. Поскольку китайский держатель так и не проголосовал за собственное предложение, хакер остался единственным, кто имел право сплитнуться от DAO 59.
В четверг, в 11:58, хакер попытался обменять биткойны на сумму 500 долларов (0,677 BTC) на ShapeShift, но деньги вернулись. На ShapeShift возможны два типа транзакций: быстрый или точный. Хакер выбрал точный, то есть должен был выслать деньги в течение десяти минут, иначе ордер закрывается. Иногда пользователи не делают это вовремя, особенно если не знакомы с процедурами.
В 12:46, словно не понимая, что произошло, хакер написал в ShapeShift, используя почтовый адрес в Mailinator. (Mailinator – работающая только на прием почтовая система, где можно создать имейл, чтобы указать его в графе, скажем, службы поддержки билетной кассы, а ответ будет публичным, открытым для всех и будет удален спустя несколько часов. Это позволяет отправителям скрывать свою личность.)
Хакер создал адрес [email protected]. Указав номер транзакции, он оставил простую просьбу службе поддержки ShapeShift – и это до сих пор одно из немногих обнаруженных посланий, достоверно поступивших от хакера: «проверьте ордер, пожалуйста».
В службе поддержки объяснили: «Закончился таймер вашего депозита, транзакцию невозможно завершить. Но мы вернули ваши BTC, как указано здесь: http://blockr.io/tx/info/afd6fc9cb2910445b126cbfd8a8dd58b4d5359356688f416635c12b15fcab7bf».
Хакер, несмотря на свои намерения, явно не был знаком с порядками этой криптобиржи, известной тем, что не спрашивает у пользователей личные данные. В 13:11 по берлинскому времени он послал еще один запрос в службу поддержки: «пожалуйста, проверьте ордер».
Когда ему через пять часов ответила «Меган Мемпул» (Мемпул – на блокчейновом жаргоне вымышленное имя, имярек), хакер уже получил средства, переведя 1,236 BTC в 48,88 ETH (919 долларов) и отправив на тот же адрес 0x969.
В 16:24 [email protected] послал третий запрос, по которому, несмотря на лаконичность, видно владение и английским, и криптосокращениями: «токенов dao все еще нет. должна быть эта tx [транзакция]. пожалуйста пошлите хеш tx возмещения или токены dao. спасибо».
Меган Мемпул сказала, что транзакция не прошла, и вернула ему BTC.
В 18:13 хакер, видимо, освоившись с ShapeShift и уже не нуждаясь в службе поддержки, конвертировал 0,667 BTC в 25 ETH (около 4 тысяч долларов), затем обменял небольшую сумму в биткойнах на 15 ETH (2 500 долларов) и купил еще 1 300 токенов DAO на 2 тысячи, отправив все на адрес 0x969. Это произошло в 18:43 по берлинскому времени во вторник 16 июня.
На адресе 0x969 хакер, потратив 10 BTC, собрал 25 805,61 токена DAO (4 563 доллара) и 139 ETH (2 274 доллара). Всего – 7 377 долларов.
Во время транзакции соотношение токенов DAO к ETH составляло 100:1, поэтому контракт давал 25 806 токенов за 258,06 ETH. И, соответственно, благодаря изъяну в программе обновления баланса только эту сумму хакер и мог забирать из The DAO каждый раз, когда выводил деньги. А шлюпка – дочерняя DAO – уже поджидала на воде.
На следующее утро, в 5:34:48 по берлинскому времени, началась атака.
В ту пятницу, к часу дня по берлинскому времени (19:00 в Шанхае), когда транши по 258 ETH уходили из главной DAO до десяти раз в минуту, Виталик написал пост, объяснив, что из-за «уязвимости рекурсивного вызова» эфир из The DAO уходит в дочернюю DAO. Однако, добавил он,