Один из самых страшных взломов блокчейна Solana произошел в среду, когда хакеру удалось перевести 80 000 эфиров (ETH), более 214 миллионов долларов на момент написания статьи, из системы Solana в блокчейн Ethereum через мост червоточины. предоставление возможности переводить средства между различными блокчейнами.

Как объяснил в ветке твита псевдоним смарт-контрактов профиля в Твиттере, хакер завершил эксплойт, переведя 80 000 ETH из смарт-контракта Wormhole на Ethereum за одну транзакцию. Как оказалось, это был лишь последний шаг в серии взломов, позволивших хакеру украсть средства.

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

Опекуны подписали ложный перевод

Червоточина — это так называемый мост, в данном случае смарт-контракт на Ethereum, который обеспечивает способ перемещения криптоактивов между разными блокчейнами. Согласно смарт-контрактам, с точки зрения высокого уровня, у Wormhole есть набор так называемых опекунов, которые подписывают транзакции между блокчейнами.

Стражи червоточины каким-то образом подписали этот перевод 80 000 ETH, как будто он был на 100% законным.

«Транзакция, которая вывела 80 000 ETH, на самом деле была тем, что злоумышленник перевел 80 000 ETH из Solana в Ethereum. Первоначально я думал, что контракт мог неправильно проверять подписи при переводе, но подписи [были] полностью проверены».

Согласно смарт-контрактам, первый прорыв и частичное объяснение произошло из транзакции на Солане, которая каким-то образом из ниоткуда отчеканила 120 000 «червоточин ETH», обернутых эфиром на Солане. Так как хакер смог добыть эфир червоточины на Солане, он смог корректно вывести его обратно в Эфириум.

"Солана какая-то странная"

Изучая историю транзакций хакера, мы обнаружили транзакцию, которая произошла прямо перед чеканкой 120 000 червоточин ETH. В этой транзакции хакер чеканит только 0,1 червоточины ETH, как если бы хакер тестировал функцию с небольшой суммой.

Дальнейшее изучение истории транзакций хакера показывает, что хакер действительно внес 0,1 ETH из Ethereum в Solana. Хотя злоумышленник не вносил депозит в размере 120 000 ETH в смарт-контракт Wormhole на Ethereum, в этом депозите есть кое-что интересное.

Как смартконтракт объясняет в своем твите, транзакции, которые чеканили Эфириум червоточины на Солане, запускали функцию смарт-контракта червоточины под названием «complete_wrapped». Одним из параметров, которые принимает эта функция, является «сообщение о передаче», в основном сообщение, подписанное хранителями моста, в котором говорится, какой токен чеканить и в каком количестве.

«Солана немного странная, поэтому эти параметры на самом деле сами по себе являются смарт-контрактами. Но важно то, как создаются эти контракты «сообщения о передаче». Вот транзакция, которая сделала сообщение о передаче 0,1 ETH», — говорится в твиттере смартконтрактов.

Кто проверяет шашки?

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

Функция post_vaa на самом деле не проверяет подписи. Вместо этого, в типичной для Соланы манере, есть еще один смарт-контракт, который создается путем вызова функции «verify_signatures». Одним из входов функции «verify_signatures» является встроенная «системная» программа Solana, которая содержит различные утилиты, которые может использовать контракт.

В «verify_signatures» программа червоточины пытается проверить, что выполнение, которое произошло непосредственно перед запуском этой функции, было выполнением функции проверки подписи Secp256k1.

«Эта функция проверки является встроенным инструментом, который должен проверять правильность данных подписей. Таким образом, проверка подписи была передана этой программе на аутсорсинг.

Контракты Wormhole использовали функцию load_instruction_at для проверки того, что функция Secp256k1 была вызвана первой, но функция load_instruction_at устарела сравнительно недавно, поскольку она не проверяет, выполняется ли она по фактическому системному адресу!

Игра закончена

Согласно смарт-контрактам, вызывающий должен предоставить в качестве входных данных системный адрес для выполняемой программы, но хакер предоставил другой системный адрес.

Вот этот системный адрес используется в качестве ввода для «verify_signatures» для законного депозита 0,1 ETH:

Правильный ввод системного адреса
Правильный ввод системного адреса

Но вот транзакция «verify_signatures» для фальшивого депозита в 120 тыс. ETH:

Ввод ложного системного адреса
Ввод ложного системного адреса

Это не системный адрес!

«Используя эту «фальшивую» системную программу, злоумышленник мог фактически лгать о том, что программа проверки подписи выполнялась. Подписи вообще не проверялись!», — говорится в твиттере смартконтрактов.

«После этого игра была окончена. Злоумышленник сделал вид, что стражи подписали депозит в 120 тысяч в Червоточине на Солане, хотя они этого не сделали. «Реальные деньги, выведя их обратно в Ethereum. И один вывод 80 000 ETH + 10 000 ETH позже (все в бридже на Ethereum), все пропало».

Источник