XRP Ledger устранил десятилетний баг в движке платежей, который мог позволить создать поддельные XRP
Ключевые выводы
- •Целочисленное переполнение в движке платежей XRP Ledger, присутствовавшее с момента написания кода в 2015 году, могло позволить злоумышленнику создать расходуемые XRP сверх общей эмиссии токена в рамках одной транзакции.
- •Об ошибке, о которой исследователь сообщил в сентябре через программу bug bounty XRPL, становилось известно лишь когда один платёж поглощал сотни специально сформированных ордеров из книги заявок, из-за чего сумма задолженности зацикливалась до ничтожно малого значения, тогда как продавцы получали оплату полностью.
- •Встроенная проверка безопасности, предназначенная подтверждать, что ни одна транзакция не создаёт XRP, полагалась на ту же ошибочную арифметику и молча давала сбой вместе с уязвимым кодом.
- •Патч вышел в версии 3.4.1 25 сентября и в тот же день был принят более чем 80% доверенных валидаторов — впервые изменение обработки транзакций сознательно обошло двухнедельную процедуру голосования по amendment.
- •Сопровождающие не нашли признаков эксплуатации уязвимости, а это раскрытие перекликается с более ранней историей вокруг ошибки корректности в shielded-пуле Zcash.

Разработчики XRP Ledger раскрыли и исправили критическую уязвимость, которая при отсутствии исправления позволила бы злоумышленнику создать XRP из ничего — дефект, бездействовавший в коде сети около десяти лет.
В опубликованном в пятницу отчёте сопровождающие проекта сообщили, что исследователь сообщил об ошибке в сентябре через программу bug bounty XRPL. Проблемой стало целочисленное переполнение в движке платежей — компоненте программного обеспечения, отвечающем за обработку платежей.
Сбой арифметики проявлялся только в необычных условиях. Когда один платёж поглощал сотни специально сформированных ордеров из книги заявок, сумма задолженности покупателя превышала максимальное значение, которое могла хранить система, и «зацикливалась» до ничтожно малого числа. Движок полностью оплачивал каждого продавца, но списывал с покупателя почти ничего, а разница представляла собой вновь «намайненные» XRP, которых никогда не должно было существовать.
Проблему усугубляло то, что встроенная в реестр проверка безопасности, предназначенная подтверждать, что ни одна транзакция не создаёт XRP, полагалась на ту же ошибочную арифметику. Она зацикливалась точно так же и ничего не выявляла. По данным сопровождающих, злоумышленник мог за одну транзакцию создать расходуемые XRP в объёме, значительно превышающем общую эмиссию токена, а затем переместить их, продать или отправить на биржи. Именно эта проверка служит механизмом, гарантирующим, что ни одна транзакция не может создать новые XRP, и она молча дала сбой вместе с тем самым кодом, который должна была контролировать.
Инженеры RippleX подтвердили, что баг присутствовал с момента написания текущего движка платежей в 2015 году. Он оставался незамеченным, поскольку ни один обычный платёж даже близко не подходит к условиям переполнения, а признаков эксплуатации не обнаружено, заявила команда.
Исправление вышло в версии 3.4.1 25 сентября, и в тот же день более 80% доверенных валидаторов сети уже работали на нём. Примечательно, что патч обошёл обычную процедуру amendment реестра, которая требует от валидаторов голосовать и ждать две недели до вступления изменения в силу. Это первый случай, когда изменение обработки транзакций было сознательно выпущено таким образом с момента запуска системы более десяти лет назад. Сопровождающие заявили, что серьёзность уязвимости оправдывала отклонение от процедуры, поскольку публикация исправления с открытым исходным кодом раскрыла бы баг, оставив его эксплуатируемым ещё несколько недель. Теперь, когда дефект раскрыт, любой валидатор, всё ещё использующий более раннюю версию, имеет и причину, и средство — обновление до 3.4.1 устраняет ошибочную арифметику из обработки платежей на этом узле.
Это раскрытие перекликается с шумихой вокруг поддел монет, которая сотрясла Zcash в начале этого года, когда конфиденциальная валюта в спешке исправляла ошибку корректности в своём shielded-пуле, которая могла позволить создать фальшивые монеты. Тогда инцидент обрушил курс ZEC, прежде чем обновление сети Ironwood устранило проблему. Оба случая затрагивают одну и ту же гарантию: актив блокчейна не может быть создан из ничего, каким бы хитрым ни было построение транзакции.
XRP не избежал потерь на этой неделе. Токен торговался в понедельник по $1,38, снизившись на 1,6% за 24 часа — худший показатель среди основных криптовалют — и на 9,4% за последние семь дней.