Сегодня с горячих кошельков Binance вывели около $6,28 млрд в 8 сетях. $6,07 млрд ушли за первые 55 минут, а затем атакующий ещё два часа продолжал снова и снова выводить средства с одного Ethereum-кошелька.

С тех пор Tether, Circle, Ripple, Paxos, World Liberty и Binance заморозили около $2,80 млрд. Примерно $3,27 млрд всё ещё можно переместить — в основном это BTC и ETH.

Я проследил всё в блокчейне, в том числе то, как атакующий опередил заморозку средств 🧵

Откуда взялись $6,28 млрд по ценам на 20:24 UTC:

• Ethereum — $3,74 млрд

• Bitcoin — 18 270,2 BTC, $1,47 млрд

• Tron — 612,7 млн USDT + 46,4 млн TRX, $627,5 млн

• XRP: 233.5M XRP, $296.5M

• Solana: 970,522 SOL, $96.1M

• Arbitrum: 8,426 ETH + 74.6M ARB, $31.8M

• Avalanche: 1.81M AVAX + 8.41M USDt, $24.3M

• Optimism: 44.2M OP, $4.8M

Ethereum, $3.74B, вывели пятью частями:

• 20:24:23, один вызов sweep() на Binance 14: 167,464.25 ETH, 1.615B USDT и 61 другой токен. $2.53B

• 20:41 и 20:59, смарт-кошелёк Binance, который доверяет Binance 14: 780M + 43M USDC. $822.6M

• 20:24:47, Binance 16 подписывает 9 переводов напрямую атакующему: 28,005.6 ETH, 55.7M USDT, 25.9M RLUSD, 84.5 WBTC, 820k UNI, 1,199 XAUt, 18.8M ENA, 304.6k LINK, 583.6B PEPE. $174.2M

• 21:04 и 21:44, два повторных вывода с Binance 14: 2,070 ETH и 204.3M USDT. $209.6M

• 22:39, последний вывод на новый кошелёк: 128.5 ETH и 122 небольших токена. ~$0.5M

По активам: USDT $1.87B, USDC $823M, ETH $457M (197,668 ETH), RLUSD $88.5M, wBETH $76.8M, XAUt $50.5M, UNI $49.6M, ENA $44.7M, PEPE $40.1M, LINK $29.6M, USD1 $27.8M и около 50 токенов поменьше.

Подготовка началась за день до этого. 28 октября в 07:39 UTC основной кошелёк атакующего 0x7c8601d4645b93cea45f71e118a729332e6b5ca0 впервые вывел 0.1 ETH из Tornado Cash. Затем последовали ещё два вывода. После этого второй кошелёк вывел 1 ETH из Tornado и передал его дальше 29 октября в 18:20.

29 октября в 02:28 они развернули контракт для вывода средств. С 13:51 до 16:47 они репетировали на собственных кошельках: делегировали полномочия через EIP-7702, выводили тестовые USDT и USDC, проверяли снятие средств. В 15:59 они выпустили v2 с универсальной функцией вызова — именно она позже вывела 823M USDC.

20:04:52 UTC, первая попытка не удалась. XRP-кошелёк Binance отправил атакующему 42,750,000.1 RLUSD, но его XRP-счёта ещё не существовало, поэтому перевод вернулся.

8 секунд спустя прошёл перевод 185,017,485.5 XRP, создавший счёт. К 20:09 были опустошены ещё четыре XRP-кошелька Binance.

Затем началась цепная реакция:

20:10 — Solana, 965,455.1 SOL за одну транзакцию

20:18 — Optimism, 44.2M OP

20:20 — Bitcoin, 18,270.2 BTC за 11 транзакций, разбитых на части по 1,000 BTC в одном блоке

20:20–20:22 — Tron, 612.7M USDT + 46.4M TRX

20:30–20:35 — Arbitrum и Avalanche

На примере Ethereum видно, как это произошло. В 20:20:59 атакующий отправил одну транзакцию с 50 авторизациями EIP-7702, все подписанные ключом Binance 14, с nonce от 18,914,775 до 18,914,824.

Binance 14 сама использовала nonce 18,914,775 в 20:17:47, так что подписи были созданы за несколько минут до использования.

Транзакция с nonce 18,914,809 прошла. Собственная транзакция Binance 14 в том же блоке использовала 18,914,808, и с этого момента Binance 14 выполняла код атакующего.

В 20:24:23 один вызов sweep() вывел оттуда 167,464 ETH и 1.615B USDT. 24 секунды спустя Binance 16 подписала 9 переводов напрямую атакующему. В 20:41 и 20:59 атакующий использовал Binance 14, чтобы вывести 823M USDC из смарт-кошелька Binance, который ей доверяет.