Перевод Посмертное вскрытие бага "сжигания" Monero

Тема в разделе "Статьи", создана пользователем AgentLvM, 29 сен 2018.

  1. AgentLvM

    Команда форума Модератор Редактор

    Регистрация:
    19 авг 2017
    Сообщения:
    59
    Симпатии:
    39
    Опубликовал: dEBRUYNE

    25 сентября 2018

    В этом сообщении будет подробно описана ошибка, с помощью которого можно было совершать так называемое «сжигание». Цель этого сообщения - предоставить подробное объяснение вышеупомянутой ошибки, как ее можно использовать для нанесения вреда сервисам и биржам, и того, как данная ошибка была устранена сообществом Monero (разработчиками).

    Ошибка заключалась в отсутствии предупреждений со стороны программного обеспечении кошелька при получении средств на «сгоревший» (использованный) выход (burnt output). Таким образом, определенный злоумышленник мог «сжечь» средства кошелька любой организации, потратив при этом только комиссию за транзакции в сети. В подобных действиях атакующие не могли получать никаких прямых денежных вознаграждений. Тем не менее существовала вероятность для косвенной выгоды злоумышленника. Понятие «сжигания» средств путем отправки нескольких транзакций одному и тому же скрытому адресу (stealth address) уже достаточно давно задокументировано. Например, подробную информацию об этом явлении можно найти на StackExchange в разделе Monero SE Q&A. Однако, к сожалению, последствия данной ошибки для какой-либо из организаций не были тщательно просчитаны до тех пор, пока один из членов сообщества подробно не описал гипотетическую атаку на Reddit Monero.

    На данный момент скрытый адрес (stealth address) в Monero описывается следующей формулой:

    P = Hs(rA||i)*G + B
    Hs является хешем для скалярной функции (заметим, что скалярный выход уменьшается по модулю l);

    r - приватный ключ транзакции, который случайно генерируется отправителем;

    A - это публичный ключ просмотра (который является частью публичного адреса) получателя;

    i - индекс выхода (каждый выход имеет свой собственный индексный номер (например, у первого выхода индекс - 0));

    G - стандартная базовая точка Ed25519;

    B - это публичный ключ траты (который является частью публичного адреса) получателя;

    В то время как образ ключа в Monero описывается следующей формулой:

    I = xHp (P) `

    x - является приватным ключом / скаляром (создается путем добавления приватного ключа для траты получателя и хеша для скалярного выхода общего ECDH секрета);

    Hp - хеш-функция;

    P – скрытый адрес (stealth address);

    Как видно из вышеупомянутых функций, отправка Monero на тот же скрытый адрес (stealth address) приведет к созданию нескольких дублирующихся образов ключей. Обратите внимание, что сеть будет отклонять образ ключа, если он уже присутствует в блокчейне, потому что это будет рассматриваться как попытка двойной траты. Таким образом, можно будет только совершить трату из этого скрытого адреса всего один раз (кошелек автоматически выберет образ с наибольшим достоинством), а оставшаяся часть выходов станет непригодной / «сгоревшей». Кроме того, транзакции с одним и тем же скрытым адресом будут связаны.

    Практически эта ошибка используется следующим образом. Злоумышленник сначала генерирует случайный приватный ключ транзакции. После этого он изменяет код, чтобы использовать только этот приватный ключ транзакции, который обеспечивает одновременное обращение нескольких транзакций к одному и тому же публичному адресу (например, на горячий кошелек биржи) и на тот же скрытый адрес. Впоследствии он отправляет, скажем, тысячу транзакций по 1 XMR на биржу. Поскольку кошелек биржи не предупреждает его владельцев о подозрительности данных действий (т. е. поступании средств, полученных по одному и тому же скрытому адресу), биржа в обычном режиме кредитует злоумышленника на сумму 1000 XMR. Затем злоумышленник конвертирует свои XMR в BTC и выводит свои BTC. Результатом этих действий хакера является то, что на бирже остается 999 непригодных / «сгоревших» выходов по 1 XMR.

    Ошибка была обнаружена после того, как один из участников сообщества описал (гипотетическую) атаку на Reddit Monero. Патч, который частично исправлял проблему, был быстро создан и позже включен в код через PR. Я (и некоторые другие члены сообщества) постарались известить о ошибке как можно больше торговых бирж и сервисов, предоставляя этот, частично решающий проблему патч, который должен был применяться поверх версии v0.12.3.0. Еще раз повторюсь (из предыдущего блога о ошибке с «сжиганием»), данный метод явно не является предпочтительным методом, поскольку он (1) неизменно исключает организации, с которыми я (и другие) лично не имеют контакта (не знакомы), но являются неотъемлемой частью экосистемы Monero и (2) это может неэтично выглядеть по отношению к не оповещенным организациям. Однако для более эффективного процесса распространение отчета о данной уязвимости было мало времени. С другой стороны, само по себе добавление ошибки в список почтовой рассылки может восприниматься как улучшение дел. Кроме того, я хотел бы подчеркнуть, что для любой организации, присутствующей в экосистеме Monero, необходимо подписаться на нашу почтовую рассылку.

    В общем случае ошибка в программном обеспечении кошелька позволяла определенному злоумышленнику нанести значительный ущерб организациям, присутствующим в экосистеме Monero, с минимальными для него затратами. К счастью, ошибка не повлияла на протокол, а поэтому и на общее количество запаса монет. Тем не менее долг сообщества Monero искать способы детального анализа написанного программного кода, особенно новых запросов на его изменения (PR). Если вы знакомы с C и / или C++, пожалуйста, если вам позволяет время, попробуйте проанализировать качество всех новых существующих запросов на изменения кодовой базы Monero (даже частичное обозрение будет очень полезным). В конце концов, данное событие снова является важным напоминанием о том, что криптовалюта и ее программное обеспечение все еще находятся в зачаточном состоянии и, следовательно, весьма подвержены (критическим) ошибкам.

    Источник: A Post Mortem of The Burning Bug

    Перевод:
    Agent LvM (@LvMi4)
    Редактирование:
    Mr. Pickles (@v1docq47)
    Коррекция:
    Kukima (@Kukima)
     
    #1 AgentLvM, 29 сен 2018
    Последнее редактирование модератором: 29 сен 2018
    TheFuzzStone нравится это.
  • О нас

    Наш сайт является одним из уникальных мест, где русскоязычное сообщество Monero может свободно общаться на темы, связанные с этой криптовалютой. Мы стараемся публиковать полезные мануалы и статьи (как собственные, так и переводы с английского) о криптовалюте Monero. Если вы хорошо владеете английским (или можете писать собственные статьи/мануалы) и хотите помочь в переводах и общем развитии Monero для русскоязычной аудитории - свяжитесь с одним из администраторов.