- PVSM.RU - https://www.pvsm.ru -

Ошибки в смарт-контрактах или новый Security Alert от Parity

Ошибки в смарт-контрактах или новый Security Alert от Parity - 1
7 8 Ноября Parity [1] объявила [2] о критической ошибке в коде, отвечающим за работу их multi-sig кошелька в основе которого лежит общедоступный смарт-котракт [3]. Это уже второй подобный случай, первый [4] произошел 19/07/2017, когда из-за найденной уязвимости смарт-контракта были выведены 150000 ETH (Подробнее на Хабре [5]).

Попробуем описать в чем заключалась проблема и почему стали недоступны около $300 млн.

Что такое multi-sig кошельки

Multi-sig(nature) кошельки созданы для решения проблемы повышения защиты приватного ключа, так как для совершения транзакции необходимы 1 и более приватных ключей (в общем виде M из N ключей). Пример для случая 2 из 3 ключей: один ключ хранится локально, один в облаке, и еще 1 резервный (в укромном месте). Для совершения транзакции нужны 2 ключа. Чуть подробнее можно почитать здесь [6]

Пользователь GitHub devops199 [7], экспериентируя с публичными методами общедоступных смарт-контрактов вызвал метод kill смарт-контракта (библиотека Parity Wallet). Issue #6995 [8] на GitHub.
В результате этого 584 кошелька на общую сумму около 1 миллиона ETH ($300 миллионов по текущему курсу) стали «заморожены», то есть пропала возможность перевести с них деньги.

Картинка с комментариями devops199

image

Технически говоря, сперва он вызвал метод инициализации контракта initWallet

  function initWallet(address[] _owners, uint _required, uint _daylimit) only_uninitialized {
    initDaylimit(_daylimit);
    initMultiowned(_owners, _required);
  }

Модификатор only_uninitialized описан так

  // throw unless the contract is not yet initialized.
  modifier only_uninitialized { if (m_numOwners > 0) throw; _; }

Однако при размещении контракта список владельцев не был инициализован, и переменная m_numOwners была равна 0. Историю всех операций с контрактом можно посмотреть здесь [9]

В результате вызов initWallet позволил devops199 стать владельцем контракта (при вызове initWallet по адресу смарт-контракта библиотеки, она превратилась в обычный кошелек с владельцем msg.sender, то есть devops199).

Далее можно просто выполнить kill для удаления, что и было сделано:

  // kills the contract sending everything to `_to`.
  function kill(address _to) onlymanyowners(sha3(msg.data)) external {
    suicide(_to);
  }

Операция suicide в EVM используется для уничтожения контракта и переводит весь оставшийся баланс на указанный адрес. При этом suicide эффективнее операции send и стоит отрицательное значение газа так как освобождает место от данных контракта в блокчейне.

Так как вся логика работы multi-sig кошелька была зависима от контракта, все владельцы, создавшие кошелек после 20/07/2017 (а это фактически все их пользователи, так как до 20 июля была другая уязвимость) потеряли доступ к возможности делать переводы своих средств кошельков Parity Wallet. Исправить ошибку можно лишь очередным форком Ethereum-a, но этого конечно не будет [10].

Полагаю, что проблему можно было бы легко избежать, если бы Parity убрала функцию kill при публикации смарт-контракта библиотеки. Она полезна лишь на момент тестирования, но никак не в целевой системе.

Таким вот образом закончилась история кошельков Parity Wallet и $300 млн, которые больше нельзя истратить.

Не забывайте удалять код для тестирования, перед передачей в production!

Автор: АйТи Сфера

Источник [11]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/informatsionnaya-bezopasnost/268229

Ссылки в тексте:

[1] Parity: https://paritytech.io

[2] объявила: https://paritytech.io/blog/security-alert.html

[3] смарт-котракт: https://github.com/paritytech/parity/blob/v1.8.2/js/src/contracts/snippets/enhanced-wallet.sol

[4] первый: https://paritytech.io/blog/security-alert-high-2.html

[5] Подробнее на Хабре: https://habrahabr.ru/post/333754/

[6] здесь: https://99bitcoins.com/what-is-multi%C2%ADsig-bitcoin-wallet-should-you-using-one/

[7] devops199: https://github.com/devops199

[8] #6995: https://github.com/paritytech/parity/issues/6995

[9] здесь: https://etherscan.io/address/0x863df6bfa4469f3ead0be8f9f2aae51c91a907b4

[10] не будет: https://twitter.com/VitalikButerin/status/928172344631115776

[11] Источник: https://habrahabr.ru/post/342324/?utm_source=habrahabr&utm_medium=rss&utm_campaign=sandbox