Хакер использовал баг в смарт-контракте проекта, который позволил выпустить 240 442 509 453 545 333 947 284 131 токенов TRU и заплатить за это 0 ETH

Как получить триллионы токенов бесплатно: кейс взлома Truebit

14.01.2026

381

9 мин

8 января 2026 года децентрализованный протокол офчейн-вычислений Truebit Protocol подвергся атаке. Использовав уязвимость в смарт-контракте, злоумышленник получил прибыль примерно 8 535 ETH (около $26,44 млн). GetBlock AML Research публикует детальный обзор инцидента.

Первопричина

Из-за отсутствия защиты от переполнения при операции сложения целых чисел, смарт-контракт Purchase протокола Truebit неправильно рассчитывал количество ETH, необходимое для выпуска (mint) токенов TRU.

В результате ошибка в вычислениях приводила к тому, что итоговая цена оказывалась равной нулю, что позволяло атакующему выпускать огромное количество токенов практически бесплатно и затем выводить ETH из резервов контракта.

Базовая информация

Truebit Protocol — это децентрализованный рынок вычислений вне блокчейна. Он предназначен для выполнения сложных вычислительных задач за пределами основной сети блокчейна, при этом корректность результатов обеспечивается экономическими стимулами.

В протоколе используется собственный токен TRU, который имеет алгоритмическую модель эластичного предложения. Его цена в реальном времени рассчитывается автоматически и зависит от:

  • количества ETH, находящегося в резерве контракта;
  • общего количества TRU в обращении.

Выпуск и сжигание TRU полностью управляются смарт-контрактами:

  • Выпуск (Minting): пользователь вносит ETH в контракт Purchase и получает TRU по алгоритмической цене.
  • Сжигание (Burning): пользователь сжигает принадлежащие ему TRU и получает ETH обратно по той же формуле.

Анализ атаки

Адрес атакующего
0x6C8EC8f14bE7C01672d31CFa5f2CEfeAB2562b50
Контракт атаки
0x764C64b2A09b09Acb100B80d8c505Aa6a0302EF2

Алгоритм атаки

1. Атакующий сначала вызвал функцию getPurchasePrice контракта Purchase, чтобы узнать, сколько ETH требуется для выпуска 240 442 509 453 545 333 947 284 131 TRU.

Из-за специально подобранного значения произошел переполнение целого числа, и функция вернула цену 0 ETH.

2. Затем атакующий вызвал функцию выпуска токенов, передав указанное количество TRU. Так как рассчитанная цена была равна нулю, атакующий не заплатил ETH и успешно выпустил 240 442 509 453 545 333 947 284 131 TRU.

3. Сразу после этого атакующий вызвал функцию 0xc471b10b (функция сжигания), уничтожил все только что выпущенные TRU и получил 5 105,069 ETH из резервов контракта.

4. Далее атакующий многократно повторял цикл «выпуск → сжигание».

По мере роста общего количества TRU (S), для последующих выпусков требовалось небольшое количество ETH, однако стоимость получаемых токенов все равно значительно превышала затраты. Это создавало устойчивую возможность для арбитража. Атакующий продолжал процесс до тех пор, пока все ETH-резервы контракта не были полностью выведены.

Анализ механизма атаки

В результате анализа кода контракта Purchase была выявлена ключевая функция расчета цены. Формула выглядит следующим образом:

Цена = (100 × A² × R + 200 × A × R × S) / ((100 − T) × S²)

Где:

  • A (AmountIn): количество токенов, которое пользователь хочет выпустить
  • R (Reserve): текущий резерв ETH в контракте
  • S (Supply): текущее общее количество токенов
  • T (THETA): параметр контракта, зафиксирован на уровне 75

Причина уязвимости

Контракт был скомпилирован с использованием Solidity версии 0.6.10.

В версиях Solidity ниже 0.8.0 арифметические операции +, -, * не имеют встроенной проверки переполнения. Если результат вычислений превышает максимальное значение uint256 (2²⁵⁶ − 1), происходит «тихое» переполнение, и значение оборачивается в маленькое число, близкое к нулю.

Хотя операции умножения были защищены библиотекой SafeMath, операция сложения в числителе (v12 + v9) использовала обычный оператор + без защиты от переполнения. Именно отсутствие этой проверки и стало ключевой уязвимостью.

Последствия атаки

Подбирая параметр AmountIn, атакующий добился следующего:

  • Все операции умножения проходили проверки SafeMath и не вызывали ошибок;
  • Операция сложения переполнялась, из-за чего числитель превращался в очень маленькое число;
  • Результат деления становился равным нулю.

В итоге атакующий смог выпускать огромные объемы токенов без оплаты ETH.

Анализ перемещения средств в сети

В результате атаки злоумышленник получил около 8 535 ETH (примерно $26,44 млн). Украденные активы сначала были переведены на три новых адреса, а затем полностью отправлены в Tornado Cash.

Адреса, используемые хакером для вывода похищенных активов
0xd841c52b68c5db133078aba039bd9eaf19b0b135
0x273589ca3713e7becf42069f9fb3f0c164ce850a
0xd12f6e0fa7fbf4e3a1c7996e3f0dd26ab9031a60

Транзакции с адресом хакера до атаки на Truebit. Визуализация: MistTrack

Связь адресов хакера с Tornado Cash. Визуализация: MistTrack

История транзакций показывает, что адрес атакующего ранее уже проявлял активность:

  • 20.11.2025: получил средства в сети Avalanche через Drain и перевел их в сеть BNB Chain с помощью Rhino.fi.
  • 06.12.2025: в сети BNB Chain перевел полученные средства в сеть Ethereum через Rhino.fi.
  • 27.12.2025: в сети Ethereum получил 4,98 ETH через RUN (предположительно из предыдущей атаки), после чего в Tornado Cash было отправлено в общей сложности 5 ETH.

Транзакции с адресом хакера до атаки на Truebit. Визуализация: MistTrack]

Транзакции с адресом хакера до атаки на Truebit. Визуализация: MistTrack

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

Что теперь

Причиной атаки стало то, что операция сложения в числителе формулы расчета цены в контракте Purchase не была защищена от переполнения.

Поскольку контракт был скомпилирован с использованием Solidity 0.6.10, оператор + не выполнял проверку переполнения. Подобрав специальное значение для выпуска токенов, атакующий вызвал переполнение uint256, что привело к расчету цены, равной нулю. Это позволило выпускать токены практически бесплатно и извлекать прибыль за счет арбитража.

Для контрактов, использующих версии Solidity ниже 0.8.0, критически важно, чтобы все арифметические операции были защищены библиотеками проверки переполнения. Это позволяет предотвратить логические уязвимости, подобные описанной атаке.

Подписывайтесь на Getblock Magazine и будьте всегда в курсе последних новостей из мира криптовалют и цифровой экономики