Новая критическая уязвимость в кошельке Parity для Эфириума

После того как июльский взлом кода мультиподписного кошелька Parity привел к краже 153 000 ETH, 20 июля компания Parity (Ethcore) выпустила новую версию контракта Parity Wallet. Однако, в новом коде обнаружилась новая уязвимость: вызов функции initWallet приводит к преобразованию контракта в обычный мультиподписной кошелек и назначению нового владельца контракта. Скорее всего, такой вызов произошел случайно 6 ноября в 02:33:47 PM +UTC. Вслед за вызовом, пользователь уничтожил код контракта, превращенного в кошелек, и его библиотеки, вследствие чего все мультиподписные контракты оказались непригодными к использованию, а все средства на них – заморожены, поскольку логика контракта вместе с функцией изменения состояния находилась в этих библиотеках.

Соответственно, все мультиподписные кошельки Parity (версия 1.8), развернутые после 20 июля теперь выглядят следующим образом:

contract Wallet {
function () payable {
Deposit(…)
}
}

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

В блоге Parity говорится, что специалисты анализируют ситуацию.

Общий объем потерь пока неизвестен, однако в Твиттере Parity
сообщается о том, что средства, собранные на ICO Polkadot также заморожены, а это более $144 миллионов (485 000 ETH).

Комментаторы
сходятся на том, что единственным способом вернуть замороженные средства может стать хардфорк, при этом, новый код контракта может быть включен во вторую часть релиза Metropolis, запланированную на первый квартал 2018 года. Никакой необходимости в спешке нет, ведь кражи не случилось.

Тем не менее, можно сказать, что репутация компании Parity, и ее основателя Гэвина Вуда (Gavin Wood), и без того изрядно подмоченная происшествием 19 июля, практически уничтожена.

Настоящий виновник нашелся сам

Согласно информации портала Trustnodes, невольным виновником происшествия стал пользователь devops199. В чатруме разработчиков Parity он написал:

Я новичок в ETH.. я просто пытался научиться использовать команду kill() destroy() в случайных контрактах, вы можете посмотреть мою историю […] .Когда я вижу в чате шутки о том, что я стал знаменитым… пожалуйста, прекратите… У меня руки трясутся.

По словам devops199, он не кодер, а консультант по графическим интерфейсам.

Спустя несколько минут после того как библиотека самоуничтожилась, devops199 написал сообщение в Github Parity, озаглавленное:»ваш контракт может уничтожить кто угодно», добавив, что он нашел уязвимость, которую может использовать злоумышленник. 

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

Теперь всем разработчикам клиентов для Эфириума, а не только Parity, придется задуматься над «защитой от дурака», чтобы предотвратить подобные случаи в будущем.