Незначительная ошибка в алгоритме расчета привела к краже криптоактивов у одного из старейших и наиболее авторитетных проектов на крипторынке.

Математика преступления: как хакеру удалось взломать Yearn на $9 млн

05.12.2025

328

8 мин

1 декабря 2025 года один из самых старых децентрализованных сервисов Yearn Finance, который помогает людям зарабатывать на своих токенах, подвергся атаке. В результате злоумышленник смог вывести около $9 млн. GetBlock AML Research публикует полный разбор атаки.

В чем была ошибка

Проблема появилась в том, как система Yearn рассчитывает количество “долей” (LP-токенов), которые получает пользователь, когда кладет активы в один из пулов — yETH. Внутри этого пула использовалась неверная математическая формула. Из-за ошибок в округлении и переполнении чисел программа могла посчитать результат неправильно.

Этой уязвимостью и воспользовался злоумышленник: он смог “накрутить” такие значения, при которых система выдавала ему гораздо больше долей, чем полагалось. А эти доли можно обменивать на настоящие токены — так он и заработал.

Что нужно знать о yETH-пуле

yETH — это пул, в который люди кладут токены, связанные с Ethereum (разные версии “стейкинговых” ETH). Когда пользователь кладет такие токены в пул, он получает взамен “долю” в виде yETH. Эти доли должны точно отражать реальную стоимость того, что лежит в пуле.

У пула есть:

  • виртуальный баланс — условная “внутренняя цифра”, считая по которой система решает, сколько всего лежит в пуле;
  • переменная D — общая сумма всех долей, которые должны существовать при правильно сбалансированном пуле;
  • Если D растет — долей становится больше, если уменьшается — долей меньше. Эта логика должна поддерживать честный обмен;
  • Проблема в том, что расчет этих значений происходил через сложную формулу, в которой возникла ошибка.

Формула расчета долей.

Как проходила атака

1. Взятие флеш-кредита

Злоумышленник взял краткосрочный заем (флеш-кредит) — огромный объем разных ETH-токенов. Часть ETH он вывел через анонимайзер Tornado Cash, чтобы скрыть следы, а затем вернул их обратно в свой вредоносный контракт.

2. Подмена внутренних значений пула

Он вызвал функцию, которая обновляет внутренние коэффициенты (курсы) для всех токенов пула. Это изменило то, как система оценивает стоимость каждого актива. Сразу после этого он внес 800 WETH и получил первые LP-токены (yETH).

3. “Раскачка” пула: многократное добавление и вывод ликвидности

Дальше началась ключевая часть атаки.

Злоумышленник несколько раз подряд забирал все активы из пула, а затем добавлял обратно не все активы, а только часть. Так он создавал искажение во внутренних числах пула — особенно в так называемом “виртуальном балансе”. В ходе повторений одна из внутренних переменных (виртуальный баланс-произведение) уменьшалась вплоть до нуля.

В этот момент система начала считать, будто в пуле находится очень много активов — больше, чем было на самом деле. Это и позволило злоумышленнику получить слишком много LP-токенов.

Почему формула дала сбой?

Внутри функции расчета происходило неправильное вычитание, которое приводило к переполнению чисел. Из-за этого значение резко “опускалось” до очень маленького — такого, которое полностью ломало расчеты. Поскольку формула зависела от деления большого числа на маленькое, итоговый результат рос в сотни тысяч раз.

Все это привело к тому, что злоумышленник получил огромный объем LP-токенов, которые он не должен был получать.

Восстановление нормальных значений

После того как он “накрутил” себе виртуальный баланс, злоумышленник применил хитрый прием: он вызвал функцию обновления коэффициентов для одного из токенов так, чтобы вернуть переменные пула в нормальное состояние. Но полученные им ранее неверные LP-токены никуда не исчезли — и теперь их можно было обменять на реальные средства.

Вывод активов

Злоумышленник несколько раз менял свои токены туда-сюда, пока полностью не опустошил пул. После финальной операции в пуле остались нули: нулевые балансы, нулевая стоимость, нулевая сумма долей.

Добавление “пыли” и финальная накрутка

Когда пул был полностью пуст, злоумышленник добавил в него символическое количество токенов (буквально “пылинки”). Поскольку других активов в пуле не было, система решила, что все токены принадлежат ему и на их основе нужно создать новую огромную сумму LP-токенов.

Из-за ошибки в переполнении чисел в момент расчета система “создала” сумму токенов около 2.354e56 — фантастическое число. Эти токены злоумышленник получил себе.

Конвертация в реальные деньги

Затем он обменял yETH на настоящие токены ETH и другие активы, погасил флеш-кредит и забрал чистую прибыль.

Изначально хакер вывел 1100 ETH ($3,4 млн) на Tornado Cash. Остальные активы (примерно $6 млн): 28 ETH, 48,96 cbETH, 203,55 rETH, 742,63 frxETH, 857,48 pxETH и 167,67 stETH были отправлены на адрес для хранения.

Адрес для хранения похищенных активов
0xa80d3f2022f6bfd0b260bf16d72cad025440c822

Вывод части похищенных средств на Tornado Cash. Визуализация: MistTrack.

Команде Yearn удалось вернуть около $2,4 млн при помощи уничтожения 857,48 pxETH, которые хранились на кошельке хакера. Монеты были перевыпущены и возвращены Yearn.

Итог

Атака стала возможна из-за ошибок в сложной формуле, по которой Yearn рассчитывал количество долей при добавлении ликвидности:

  • неверное округление,
  • переполнение чисел,
  • отсутствие обязательной проверки корректности расчетов.

Злоумышленник искусственно создал такие условия, при которых программа выдавала ему гигантскую долю фонда. Затем он обменял эту “виртуальную долю” на настоящие активы и вывел их.

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