Часто задаваемые вопросы о взломе TheDAO: как произошла атака 17 июня 2016 года?

Кто-нибудь может объяснить, как произошла атака DAO? Виталик Бутерин объяснил здесь , что это было выполнено путем отделения DAO от основного DAO, но с splitрекурсивным вызовом функции.

Мы знаем, что рекурсивная функция — это своего рода функция, которая вызывает сама себя, но я не уверен, что это тот же случай, что и при атаке DAO.

Кто-нибудь может объяснить, что означает рекурсивный вызов функции и как именно это произошло в недавней атаке на DAO?

Немного сложно понять это полностью, не зная солидности, базового языка контрактов высокого уровня и того, как лежащий в основе EVM обрабатывает реентерабельные вызовы (метод A вызывает B, а затем B вызывает A).

Ответы (3)

Любой, кто читал эту статью о векторе атаки и этот пост на форуме , мог обнаружить, что Ursium ошибочно уверен, потому что функция split вызывает функцию вознаграждения. web3.jsТогда посредственному разработчику было бы легко провести атаку .

Я не знаю, почему это принятый ответ. Это ничего не объясняет, это всего лишь две ссылки, которые также не объясняют, что происходит.
это вики сообщества, идите вперед и редактируйте ее
Ссылка на форум не работает @Roland Kofler

Что случилось? 3 641 694 ETH были выделены из DAO. Злоумышленник нашел лазейку в обычной функции splitDAO, чтобы они могли многократно использовать одни и те же токены DAO.

Как именно сработала атака?Злоумышленнику удалось совместить 2 эксплойта. Первый эксплойт заключался в рекурсивном вызове функции разделения DAO. Это означает, что первый обычный вызов вызовет второй (нерегулярный) вызов функции, а второй вызов вызовет другой вызов и так далее. Следующие вызовы выполняются в состоянии до того, как баланс злоумышленника будет установлен обратно на 0. Это позволило злоумышленнику разделить 20 раз (должен искать точное число) за транзакцию. Он не мог сделать больше, иначе транзакции стали бы слишком большими и в конечном итоге достигли бы лимита блока. Эта атака уже была бы болезненной. Однако, что сделало это действительно болезненным, так это то, что атакованному удалось воспроизвести эту атаку с одних и тех же двух адресов с одними и теми же токенами снова и снова (примерно 250 раз с 2 адресов каждый). Так злоумышленник нашел второй эксплойт, который позволил провести сплит без уничтожения токенов в основном DAO. Им удалось перевести токены до того, как они были отправлены на адрес 0x0, и только после этого они были отправлены обратно) Комбинация обеих атак усилила эффект. Атака один на его одного была бы очень капиталоемкой (нужно внести вперед 1/20 от украденной суммы) - атака два заняла бы много времени.

Безопасен ли оставшийся эфир в DAO? Нет — скорее всего, этот эксплойт мог быть использован для слива всего эфира из DAO. Злоумышленник прекратил сливать ETH, когда Виталик написал свой первый ответ в блоге, в котором упоминался план софт-форка и хард-форка. Мы можем предположить, что хакер остановился по стратегическим причинам, чтобы сделать решение сообщества о форке менее вероятным. Однако атакованные проголосовали и за другие предложения форка - подробнее здесь

Поскольку эфир злоумышленника находится в копии контракта DAO, можно ли таким же образом украсть ETH? Это было бы возможно, если бы за этот раскол проголосовал хотя бы один честный актер. Поскольку атакующий, скорее всего, является единственным акционером и куратором этого DAO, такую ​​же атаку провести невозможно.

Как будет работать предлагаемый софтфорк? Мягкая вилка станет немедленным действием, главным образом, для того, чтобы выиграть время. Майнеры могли модифицировать клиент Ethereum, чтобы он игнорировал все транзакции, где в результате транзакции ETH списывается с адреса, имеющего код DAO. Майнеры также будут игнорировать блоки других майнеров, которые включают такую ​​транзакцию. Если большинство майнеров решат поступить так, всем будет невозможно переместить ETH из каждой версии «theDAO». Таким образом, это повлияет на основной «TheDAO» и все сплиты — включая обычный и злонамеренный.

Доступна ли уже программная версия ETH с этой модификацией? Да, Parity и GETH выпустили соответствующие версии.

Что должно произойти, чтобы активировать софтфорк? Для этого потребуются скоординированные усилия большинства горняков. Координация важна, иначе майнер, скорее всего, потеряет свой ETH. Если вы, например, майните в одиночку, вам НЕ следует переключаться на исправленную версию, если вы не уверены, что это сделали большинство майнеров, потому что в противном случае ваше программное обеспечение будет игнорировать самую длинную цепочку, поскольку оно сочтет ее недействительной.

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

Если софт-форк увенчается успехом, каков дальнейший путь? Софтфорк, скорее всего, будет лишь временным решением. Если бы это было окончательным решением, это означало бы, что практически все ETH по всем контрактам DAO заморожены навсегда. Есть еще два вероятных пути вперед. Сначала хард-форк — с хард-форком возможно буквально все — вероятные пути мы обсудим позже. Второй путь от софтфорка Freez — разрешить только определенные виды транзакций. При условии, что из DAO больше не будет сливаться ETH, более конкретный софтфорк 2 может позволить каждому DTH получить свою долю оставшегося ETH.

Если софтфорк не удастся — что будет?Очень большая мешанина из атак и контратак. Белый и черный хакер начнет использовать эту ошибку. Однако, поскольку каждый сплит будет общедоступным, каждый может присоединиться к каждому сплиту. Правильной стратегией было бы разделить ваши токены, чтобы иметь очень небольшое количество токенов в каждом разделении. Таким образом, если кто-то выполняет атаку, у других также будут доли в разделенном DAO, что позволит им позже снова выполнить эту атаку в новом DAO после окончания периода создания. Это может привести к бесконечному расщеплению. Это создаст стимулы для спама в сети или подкупа майнеров для цензуры транзакций. Кроме того, весьма вероятно, что будут обнаружены и использованы другие ошибки. Если бы мы оказались на этом этапе, очень вероятно, что все нетехнические DTH потеряли бы все.

Каковы аргументы за и против софтфорка? Самым большим аргументом в пользу софт-форка является предотвращение огромного беспорядка, который произошел бы без него. Есть философские аргументы против — по сути, софтфорк будет формой цензуры. Тем не менее, большинство пострадавших от этой цензуры очень приветствовали бы ее (все держатели токенов DAO), ожидая злоумышленника. Однако - есть небольшая группа людей, которые также пострадали от этого, которые, возможно, не захотят этого - все, кто регулярно плевался и уверен, что никто из других акционеров в этом разделенном DAO не нападет на них (например, потому что они единственные один).

Когда и как возможен хардфорк?Хард-форк потребует более длительного обсуждения и поиска консенсуса. Для выполнения хардфорка майнеры менее важны. Более важными являются биржи и ключевой игрок в экосистеме. (Фонд Ethereum, основные разработчики, ведущие компании экосистемы). Если все эти игроки согласятся на хард-форк, даже небольшого меньшинства майнеров будет достаточно, но что более важно, майнеры присоединятся при таких условиях почти наверняка. При хард-форке в принципе возможны ВСЕ изменения правил. Можно создать новый эфир, законный эфир можно уничтожить и так далее. Однако шансы на то, что сообщество согласится на такой форк, равны нулю. Таким образом, мы можем сузить ожидаемый диапазон. В верхней части (по шкале стоимости ETH за токен DAO) будет полный возврат всех незаконных расщеплений. Это будет означать, что токены DAO снова можно будет обменять на 0,01 ETH каждый. Нижняя граница — это соотношение ETH, оставшегося в контракте DAO — в настоящее время 0,006857 ETH (без дополнительного баланса). Однако для такого решения не потребуется хардфорк, это можно сделать с помощью софтфорка. Таким образом, консенсусное решение также может заключаться в том, что восстанавливаются только части. Другие могут быть либо уничтожены, либо использованы для какого-либо общего блага (например, фонд Ethereum, децентрализованный фонд, который будет субсидировать будущие аудиты безопасности и т. д.).

Дополнительная информация:

Чем отличается хардфорк от софтфорка.Мягкая вилка означает, что состояние/блок, которые раньше были действительными, больше не действительны в новой версии. В этом случае состояние, которое приведет к трате ETH из любого контракта с кодом DAO, будет считаться недействительным. Хард-форк делает действительным состояние, которое раньше было недействительным. Большим преимуществом софтфорка является то, что только майнеры должны обновлять свое программное обеспечение. Хотя в конечном итоге все должны — если все дождутся достаточного количества подтверждений, они будут принимать только те состояния, которые действительны в соответствии с новыми правилами. Однако в случае хард-форка всем (потребителям, биржам и т. д.) необходимо обновить свое программное обеспечение. В противном случае они рискуют потерять свои ETH и другие активы в Ethereum. По этой причине период между соглашением о форке и выполнением форка должен быть намного больше, чем это может быть при софтфорке.

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

Когда хакер начал планировать эту атаку? Два ключевых контракта, которые содержали токены и имели логику, допускающую рекурсивное разделение, были созданы за 2 дня до атаки. Так минимум два дня. Однако за 7 дней до теракта был начат раскол. Однако еще не на 100% ясно, является ли злоумышленник и инициатор этого разделения одним и тем же. Это вероятно, но не обязательно. Злоумышленник мог использовать любое предложение разделения. Но даже если инициатором раскола был нападавший, это не значит, что они готовили нападение уже тогда. При условии, что в DAO не было ошибок, существовала арбитражная возможность купить токены DAO менее чем за 0,01 ETH и конвертировать их в 0,01 ETH с разделением.

Если софт-форк будет реализован, могу ли я по-прежнему передавать токены DAO? Да — любая транзакция, не влияющая на баланс ETH контракта с кодом DAO, по-прежнему возможна. Более подробную информацию о различных решениях для вилки можно найти здесь.

Эта вики была начата с https://www.reddit.com/r/ethereum/comments/4os7l5/the_big_thedao_heist_faq автором koeppelmann. Дальнейшие обновления вносятся сообществом.

@Roland Kofler Я понимаю эту вещь с повторным входом, но могу ли я получить более подробную информацию о том, как злоумышленник смог выполнить более 1 транзакции, потому что одна транзакция успешно сделала бы баланс злоумышленника равным 0 в основном DAO, но как следующие транзакции были успешными.

Очень высокий уровень, очень упрощенный ответ.

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

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

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

Откуда берутся дополнительные эфиры?