Pull to refresh

Comments 9

Не через эту ли уязвимость уже успели ломануть одну из крупных криптовалютных бирж: www.cryptopia.co.nz

— 4 дня назад они «обновились» готовясь к форку эфира.
— 3 дня назад биржа вдруг ушла на «внеплановые срочные технические работы».
— вчера признались (в твиттере) что «тех работами» на самом деле был экстренный шатдаун биржи из-за обнаруженного взлома и кражи крупных средств в криптовалюте.
— сегодня судя по прочитанным обсуждениям в твиттере и на форумах выясняется, что украли как раз Эфир и некоторые токены на его базе (ERC-20) — народ провел мониторинг кошельков биржи через блокчейн, официально это никак не комментируется из-за начатого расследования полицией Новой Зеландии (место юридической регистрации компании-оператора биржи)

Общая сумма ущерба — как минимум несколько миллионов долларов.
Форк не успел активироваться, так что точно не через эту уязвимость. До оговоренного блока, даже в обновлённом клиенте, стоимость инструкций остаётся прежней.
Не, не понятно как атака работает.
PaymentSharer.splitFunds(uint id) инициирует transfer. При этом вызывается fallback-метод атакующего с 2300 газа.
Этого газ не хватит атакующему, чтобы снова вызвать updateSplit
С новыми ценами на опкоды в Constantinople — хватит, потому и отменили апдейт.

Долгое запутанное объяснение, из которого совершенно не понятно почему же это уязвимость. Вот описание в один абзац:


Снижение стоимости опкода SSTORE привела к возможности провести атаку повторного исполнения (reentrancy attack) из fallback-функции. Так как раньше это считалось невозможным (fallback-функция может использовать строго ограниченное количество газа, которого недостаточно для модификации хранилища при текущей стоимости SSTORE), то разработчики контрактов не учитывали такой сценарий и не защищались от него.

Чем больше «Виталик» говорит в микрофон, тем меньше времени на код…
ИМХО: Ethereum страдает от быдлокодинга на быдлоязыке.

Ethereum: Ребята, смотрите, возможны reentrancy-атаки, вы должны учитывать это при написании контракта. Сначала внесите все изменения в storage, затем подготовьте в memory данные для callов, а уже затем делайте callы.
Solidity: это сложно. Наш язык будет безопасным по умолчанию. Давайте мы лучше запилим send и transfer, которые будут давать на транзакцию очень мало газа. Ну чтобы ни на что не хватило, ну или почти ни на что. Ну плюс-минус в общем.
Sign up to leave a comment.

Articles