Читаем На шифре. Инсайдерская история криптовалютного бума полностью

Может, ему и было плохо, но дальше было только хуже. В 16:54 по центральноевропейскому летнему времени (CEST) в понедельник 6 ноября, пока бóльшая часть команды Parity отсыпалась после вчерашней церемонии, разработчик под ником ghost создал на GitHub пост «Любой может убить ваш контракт № 6995». В самом тексте говорилось: «Я его случайно убил». Затем ghost выложил ссылку на адрес в Etherscan. В 17:33 CEST devops199 выложил в Gitter Parity ссылку на проблему 6995 с вопросом: «Это серьезная проблема?» Никто не отвечал до 7:27 CEST следующего утра, когда кто-то написал:


Эй, ребят

А вы знаете, что ваш мультисиг хакнули?

Почему никто не реагирует?

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

То есть контракты мультисига не работают и эфир нельзя снять


До людей не сразу дошло, что на 587 кошельках заперто – заблокировано навсегда – полмиллиона эфира (на тот момент 150 миллионов долларов), а виновник, ghost/devops199, говорит, что сделал это случайно. Проблема оказалась в том самом коде, который команда Parity наспех написала в последнюю ночь гулянок на Ибице, когда выкладывала патч после первого хака кошельков. И в этом коде нашлась даже не одна, а две смертельные уязвимости. Если вкратце, Parity создали банк и сказали, что в его хранилище можно спокойно сдавать деньги, и люди принесли туда эфир на сотни миллионов долларов. Но оказалось, что владельца у банка нет, и тогда devops199 назначил владельцем себя – а потом закрыл двери и уничтожил ключ, навсегда заперев деньги внутри. Кое-кто подозревал злой умысел, но другие видели в этом оплошность: «Тот, кто убил библиотеку, совершил понятную ошибку. Могу легко представить, что сам сделал бы так же. Мне бы и в голову не пришло, что можно убить контракт, который создал не я». Эти люди считали, что devops199 убил контракт, просто пытаясь отменить свой статус «владельца банка».

В 14:29 CEST devops199 вошел в чат и написал просто:


:(


Немного погодя он добавил: «Меня за это посадят?:(»

«Ты убил tx [транзакцию]?» – спросил Tienus.

Devops199 ответил:


да

я eth-новичок… просто учусь


«Теперь ты знаменитость хаха», – ответил qx133.

Сам Гэвин узнал об этом в Цюрихе, сходя по трапу самолета. В тот момент у него уже начался жар.

Две ошибки Parity состояли в следующем: во-первых, они разрешили назначать владельца для общественной инфраструктуры, а во-вторых, разрешили владельцу убивать контракт, что devops199 и сделал для целой кучи Parity-кошельков. Среди 587 пострадавших кошельков несколько принадлежали тем, кто провел ICO и набил кошельки эфиром с краудфандинга, в том числе Iconomi, потерявшей 34 миллиона долларов, а также Musiconomi с ICO поменьше, лишившейся 4,8 миллиона.

Но в основном замороженные средства принадлежали самой Parity. В ее кошельке лежали 306 276 ETH (95 миллионов долларов) – 60 % всего заблокированного эфира; 586 кошельков составляли остальные 40 %. Parity будто создали банк для собственных денег, но кто-то, проходя мимо, случайно запер дверь и выбросил ключ.

На Reddit не могли поверить, что Parity-мультисиг взломали – опять – и что баг находился в «исправленном» коде после прошлого взлома. Один пользователь сказал: «Как Parity могут так безалаберно относиться к мультисиг-кошелькам?.. В такой ситуации я не поддерживаю полный возврат средств для Parity».

Еще обиднее то, что команду Parity об этом уже предупреждали в августе, когда кто-то с GitHub посоветовал «инициализировать» кошелек (то есть, условно, назначить владельца банка). В последующем анализе Parity упоминали об этой рекомендации, но сказали: «На тот момент это считалось всего лишь способом повысить удобство использования… и откладывалось на будущее, до следующего штатного обновления». Хотя один из пользователей Reddit указал, что это бы решило только первую проблему, а не вторую: «Даже после инициализации у кого-нибудь осталась бы возможность убить библиотеку. Если бы какой-нибудь обиженный работник решил после увольнения все спалить, у нас был бы очень похожий сценарий». Программисты, просмотрев код, в шоке обнаружили, что функции по назначению себя владельцем и убийству контракта шли одна за другой.

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

Перейти на страницу:

Похожие книги