Взлом Truebit на 8,535 ETH — технический разбор

Анализ эксплойта Truebit на $14,8 млн: технический разбор и регуляторные выводы
Автор/редактор: AI Редактор | Дата обновления: 10.06.2024
Эта статья — независимый технический анализ уязвимости, предназначенный для разработчиков, аудиторов безопасности и регуляторов. Цель — предоставить практические рекомендации для предотвращения подобных инцидентов.
Ключевые факты
- Проект: Truebit Protocol
- Дата атаки: 28 августа 2023 г., 09:23 UTC (блок 17993013)
- Сумма ущерба: 8,535 ETH (~$14,8 млн на момент атаки)
- Тип уязвимости: Некорректная логика минтинга (отсутствие проверки
msg.value) - Уязвимый контракт:
TruebitIncentiveLayer(0x3a35…5628) - Адрес злоумышленника: 0x501e…234a
- Ключевая транзакция: 0x91d3…36f9
- Источники: анализ Lookonchain, подтверждение от команды Truebit, ончейн-данные (Dune, Arbiscan).
Резюме для нетехнической аудитории
28 августа 2023 года злоумышленник воспользовался ошибкой в устаревшем смарт-контракте протокола Truebit. Эта ошибка позволила ему создавать огромное количество токенов TRU, отправляя минимальную сумму (менее цента), а затем продать их на рынке за 8,535 ETH ($14,8 млн). Инцидент подчеркивает риски использования старого, непроверенного кода в DeFi и происходит на фоне ужесточения финансового регулирования в ЕС.
Хронология инцидента
Атака была выполнена в рамках одной основной транзакции.
- 09:23:47 UTC: Злоумышленник вызывает функцию
purchaseв контрактеTruebitIncentiveLayerчерез свой специально созданный контракт-агрегатор. - Внутри транзакции: Контракт-агрегатор в цикле многократно вызывает уязвимую функцию. On-chain анализ показывает сотни внутренних вызовов, каждый из которых отправлял всего 1 wei ETH. Высокий лимит газа транзакции (gas limit) позволил выполнить такое количество операций за один раз.
- Обмен и вывод: Накопленные токены TRU немедленно обмениваются на 8,535 ETH через пулы ликвидности на децентрализованных биржах, что приводит к обвалу цены TRU. Все операции происходят в рамках одной атомарной транзакции, что типично для DeFi-эксплойтов.
Технический разбор уязвимости
Уязвимость находилась в функции purchase контракта TruebitIncentiveLayer, который не обновлялся с 2021 года. Логика контракта не связывала количество отправленных ETH (msg.value) с количеством выпускаемых токенов.
Уязвимый код
Контракт: TruebitIncentiveLayer.sol (ссылка на исходный код)
function purchase(address _claimant, bytes32 _preimage, uint _proof) public payable {
// … прочая логика …
// УЯЗВИМАЯ СТРОКА:
// Количество создаваемых токенов не зависит от msg.value.
// Контракт минтит фиксированное количество «юнитов» (здесь `1`),
// даже если было отправлено всего 1 wei.
uint numTokens = OS.mint(msg.sender, 1);
// …
}
Злоумышленник мог многократно вызывать эту функцию с msg.value, равным 1 wei, и получать токены, стоимость которых должна была быть в миллионы раз выше.
Пример исправления (патч)
Корректная реализация должна рассчитывать количество токенов на основе полученной оплаты, динамической цены, использовать безопасную арифметику и возвращать излишек средств.
// Пример исправления для функции purchase с учётом лучших практик
// Используется Solidity >=0.8.0 для встроенной защиты от переполнений.
// uint256 private _tokenPrice; // Цена должна быть динамической (оракул)
// uint8 private _tokenDecimals; // Десятичные знаки токена (например, 18)
function purchase(address _claimant, bytes32 _preimage, uint _proof) public payable {
// 1. Валидация входных данных
require(msg.value > 0, "ETH payment required");
// 2. Получение динамической цены из надёжного источника (оракул, ордербук)
// В реальном приложении цена не должна быть константой.
// uint256 price = getPriceFromOracle();
uint256 price = 1 ether; // Упрощение: 1 токен = 1 ETH
uint256 decimals = 18; // Стандартное число десятичных знаков
// 3. Безопасный расчёт количества токенов с учётом decimals
uint256 tokensToMint = (msg.value * (10 ** decimals)) / price;
require(tokensToMint > 0, "Insufficient payment for at least one token");
// 4. Расчёт и возврат сдачи (излишка)
uint256 cost = (tokensToMint * price) / (10 ** decimals);
uint256 refund = msg.value - cost;
// … прочая логика …
// 5. Минтинг рассчитанного количества токенов
OS.mint(msg.sender, tokensToMint);
// 6. Возврат излишка средств отправителю
if (refund > 0) {
(bool sent, ) = msg.sender.call{value: refund}("");
require(sent, "Failed to send refund");
}
}
Статус расследования и реакция проекта
На июнь 2024 года, спустя почти год после инцидента, команда Truebit не опубликовала детальный технический пост-мортем или план компенсации для пострадавших пользователей. После первоначального подтверждения взлома 28 августа 2023 года значимых публичных обновлений по расследованию не последовало. Отсутствие прозрачной коммуникации подрывает доверие к проекту.
Регуляторные последствия: новый AML-пакет ЕС
Этот инцидент служит ярким примером для регуляторов, настаивающих на усилении контроля за DeFi. Новый пакет законов ЕС по борьбе с отмыванием денег (AML) напрямую затронет криптоиндустрию.
-
Регламент о переводе средств (TFR): вступает в силу 30 декабря 2024 года. Обязывает поставщиков услуг криптоактивов (CASP) собирать и передавать данные об участниках транзакций («travel rule»).
-
Пакет AML (AMLR/AMLD6): вступает в силу с середины 2027 года.
Согласно заявлению Совета ЕС, новые правила «впервые охватят криптосектор, обязывая всех поставщиков услуг криптоактивов (CASP) проводить надлежащую проверку своих клиентов». Под определение CASP могут попасть не только централизованные биржи, но и DeFi-проекты с элементами централизации, что потребует от них интеграции процедур KYC/AML.
Практические рекомендации
Для команд DeFi-проектов:
- Разработайте и протестируйте план реагирования на инциденты (IRP): он должен включать немедленную активацию
pause-механизмов, готовые шаблоны для коммуникации с сообществом и контакты фирм по блокчейн-форензике (Chainalysis, TRM Labs). - Внедрите непрерывный аудит и CI/CD: интегрируйте в пайплайн статические анализаторы (Slither), фаззинг-тестирование (Echidna, Foundry) и формальную верификацию. Запустите постоянную программу Bug Bounty с вознаграждениями, конкурентными потенциальному ущербу.
- Используйте безопасные паттерны обновления: применяйте прокси-контракты (UUPS или Transparent Proxy) для возможности безопасного исправления уязвимостей без необходимости полной миграции средств.
Для пользователей и инвесторов:
- Анализируйте аудиты: не просто проверяйте их наличие. Изучайте, были ли исправлены уязвимости с высоким (High) и критическим (Critical) уровнем опасности, и как давно проводился аудит (отчёты старше года могут быть неактуальны).
- Настройте ончейн-мониторинг: используйте сервисы вроде Forta или Tenderly Alerts для отслеживания подозрительной активности в протоколах, с которыми вы взаимодействуете.
- Диверсифицируйте риски: не размещайте значительную часть капитала в одном протоколе, особенно если он не имеет долгой истории и прозрачной репутации.
Заключение
Эксплойт Truebit — это хрестоматийный пример опасности устаревшего кода и отсутствия базовой валидации платежей. Для предотвращения подобных инцидентов командам необходимо внедрять непрерывный аудит и планы реагирования, а пользователям — проявлять должную осмотрительность, анализируя аудиты и используя инструменты ончейн-мониторинга.
Отказ от ответственности: данный анализ предназначен исключительно для образовательных и информационных целей. Взаимодействие с уязвимыми или скомпрометированными смарт-контрактами может привести к потере средств и несёт правовые риски. Автор не рекомендует воспроизводить описанные действия.