Устаревший эскроу для стейкинга Yieldly вывел ALGO, не проверяя платёж
Пять платежей за девяносто две секунды вывели около 390 000 ALGO из старого хранилища стейкинга Yieldly — спустя много времени после того, как держателям велели забрать средства. Его эскроу-программа, судя по всему, одобряет любой платёж, не проверяя получателя, сумму или актив. Сейчас на счёте осталось 0,20107 ALGO.

Пять платежей покинули счёт контракта стейкинга Yieldly утром 15 октября 2026 года — все уложились в девяносто две секунды. Вместе они вынесли из хранилища около 390 377 ALGO, хотя проект велел пользователям опустошить его ещё три года назад. Первый платёж составил около 14 3741 ALGO, последний — около 174 763. Контракт заплатил потому, что на его собственных счетах был учтён депозит, которого на деле не было, причём в токене, которым он никогда не владел.
Этот счёт — эскроу, стоящий за устаревшим стейкинг-dapp проекта Yieldly, куда держатели вносили токены ради вознаграждений. Проект призывал их вывести стейк в апреле 2023 года, а затем снова в июле. В хранилище оставались ALGO, и они лежали там за опубликованной программой, которая, судя по всему, не читает ни получателя, ни сумму подписываемого платежа.
Токен, выпущенный за восемь секунд до того, как его потратили
Счёт, получивший деньги, был открыт в то же утро и пополнен на 12 ALGO. На нём выпустили токен FUEL — без десятичных знаков и без ролей управляющего, заморозки, возврата или резерва. Создатель отправил весь объём на собственный адрес — перевод, который не изменил ни одного баланса.
Восемь секунд спустя эскроу выплатил тому же счёту 3 239 706 903,7436723 YLDY — примерно 3,244 млрд токенов, треть от 105 млрд эмиссии. Программа стейкинга, судя по всему, хранит баланс для каждого счёта и прибавляет к нему сумму перевода, не сверяя идентификатор актива. FUEL считается целыми единицами, а YLDY — миллионными долями, поэтому сырое число одного токена было прочитано как число другого.
Чтобы зачислить этот баланс, отправлять эскроу что-либо не требовалось. Проверочная программа перед путём депозита возвращает успех для любого вызова, закрывающего позицию, не читая аргументов, — так что защищённый путь можно обойти. Затем ветка депозита зачисляет сумму платежа, не подтверждая, что деньги дошли до счёта, где хранятся средства.
Выводы устроены так же. Каждому из пяти примерно за восемь секунд предшествовал платёж того же счёта самому себе на идентичную сумму — от примерно 14 3746 ALGO до примерно 174 763, — причём в группах, где ничей баланс не менялся. Депозиты были записями в собственных книгах контракта. Ушедшие ALGO — это собственный баланс контракта, а не что-либо, внесённое отправителем.
Хранилище, которое ничего не читало о платеже
Счёт, производивший выплаты, — это логическая подпись, небольшая программа, у которой нет приватного ключа, чтобы его украсть. Деплойер Yieldly открыл её с 2 ALGO 5 июня 2021 года. Её опубликованная программа, судя по всему, одобряет платёж при трёх условиях. В группе должно быть от двух до шести транзакций, и первая должна быть вызовом одного конкретного приложения Yieldly. Ни первая, ни вторая не должны задавать смену ключа. При этом она, похоже, не читает ни получателя, ни сумму, ни актив подписываемого платежа.
В этих рамках она могла подписать платёж любого размера, в любом активе, на любой адрес. При таком прочтении ничего не требовалось взламывать и никакой ключ не нужно было искать. Программа, похоже, ничего не спрашивает о том, кто отправляет платёж, поэтому посторонний и бывший пользователь оказывались в равных условиях. На странице счёта эскроу7 теперь 0,201078 ALGO — чуть выше минимума в 0,2 ALGO, который держит его открытым.
400k в заголовке — это платёж, сделанный позже
Ветка9 на r/AlgorandOfficial, где об этом зашла речь, утверждала, что контракт стейкинга «взломали на 400k10 Algo», и ссылалась на аудит Halborn 2021 года. Ответы разделились: одни называли это взломом, другие винили операторов. Цифра за заголовком — 404 751,14087711 ALGO — это единственный перевод, который кошелёк-получатель сделал через четыре минуты после последнего вывода, и он больше того, что выпустило хранилище.
Это деньги хранилища плюс выручка от зачисленных токенов. Счёт продал 1 898 163 508,44209812 YLDY контрактному счёту за 8 435,73485413 ALGO, а 1 341 543 395,30157314 YLDY — в пул Tinyman за 5 934,49038915. Две продажи принесли 14 370,22524316 ALGO. Прибавьте это к сумме, которую выпустило хранилище, и итог окажется на несколько ALGO меньше отправленных дальше 404 751,14087717 — разницу записи не объясняют.
Сам YLDY сейчас стоит немного: около $2 878 рыночной стоимости при $13,44 торгов за день по состоянию на 19 октября.
Дальнейший платёж вскоре снова сдвинулся с места. Он прошёл ещё через два обычных счёта, и последний из них отправил 220 000 ALGO дальше 19 октября. Ни один из трёх не удаётся связать с именем.
Аудит проверял другой код
Работа Halborn длилась с 8 по 19 мая 2021 года и охватывала лотерейные контракты Yieldly. В отчёте18 сказано, что из-за ограничений по времени и ресурсам проверялись только самые существенные аспекты. Согласно отчёту, одна из пяти находок — HAL-02 с низким уровнем риска — описывала транзакции, которые не проходили через прокси, тогда как эскроу этого ожидал, причём на той же самой границе.
Программы, производившие выплаты, были выпущены позже. Оба приложения стейкинга в последний раз обновлялись 2 июля 2021 года, уже после завершения работы, и с тех пор не менялись. Ссылаться на тот аудит как на гарантию для хранилища стейкинга — значит доверять коду, который в октябре не работал.
Три года после уведомления о закрытии
Yieldly призывал держателей вывести средства в апреле 2023 года, затем в июле. В публикации от 20 апреля19 говорилось: «Выведите свой стейк из Yieldly staking до того, как dapp отключат в течение 30 дней,20» — и назывался конец мая как срок вывода из эксплуатации. В объявлении от 25 июля21 пользователей просили «вывести средства из Yieldly staking до 22:00 EST 26 июля22». Пять платежей прошли через 1 177 дней после этого срока.
Yieldly о переводах ничего не сообщал. Его канал объявлений23 не публиковал ничего с марта 2024 года, лента на Medium24 — с апреля 2023 года, а в аккаунте X25 нет ничего позже января 2025 года.
Dapp исчез, контракты остались. Эскроу продолжал отправлять YLDY и в 2025 году, включая 112 376 408,272 токена одним переводом 4 августа, — значит, программа всё ещё кому-то отвечала. Но хранил он и ALGO, и ушли именно они. Остальные эскроу приложений, которые называют программы, сейчас пусты.
Источники
17 цифр в этом материале проверено. 6 прочитано напрямую из блокчейна.Все проверки