Перевод Анализ устранённого бага, позволяющего «умножить» переводимые суммы

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

  1. Mr. Pickles

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

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

    5 сентября 2018


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

    Баг, позволявший умножить суммы расчётов и имевший два варианта, обнаружился в связи с возможностью использования подадресов, которой требуется другая структура (кода) публичных ключей транзакции. Первый вариант бага в основном заключался в том, что код не проводил проверку, необходимую для предотвращения возможности появления дубликатов публичных ключей. Следовательно, злоумышленник мог создать транзакцию, в которую публичный ключ транзакции включался множество раз, вследствие чего определённый публичный ключ транзакции дублировался. В результате принимающий кошелёк сообщает о том, что он получил сумму в x раз превышающую фактически полученную сумму (x в данном случае является целым числом, обозначающим количество идентичных публичных ключей транзакции). Были повреждены все команды, выводящие информацию о входящих транзакциях (например, show_transfers (CLI), get_transfers (RPC)). Однако баланс не пострадал, то есть кошелёк по-прежнему показывал верный баланс. Но увы, большинство бирж использовало RPC команду кошелька get_transfers или get_payments, которые в случае наличия дублированных приватных ключей транзакции выдавали неправильное значение суммы.

    К сожалению, этот вариант бага оказался довольно прост в использовании. То есть злоумышленнику было достаточно добавить add_tx_pub_key_to_extra(tx, txkey_pub) в src/cryptonote_core/cryptonote_tx_utils.cpp, и публичные ключи транзакции после перекомпиляции кода начинали дублироваться. В сущности, это работает следующим образом. Злоумышленник начинает с того, что добавляет в src/cryptonote_core/cryptonote_tx_utils.cpp, скажем, трижды, создавая таким образом четыре идентичных публичных ключа транзакции для соответствующих транзакций. Затем транзакция на сумму, допустим, 1 XMR отправляется на биржу, которую злоумышленник собирается обмануть. Наиболее вероятно, что биржа запишет на счёт злоумышленника 4 XMR. Хакер после этого выведет эти 4 XMR, ограбив биржу, таким образом, на 3 XMR. Если биржа не производит регулярного сравнения баланса с суммой входящих и исходящих транзакций или же не проверяет горячий кошелёк на предмет каких-либо странностей, то хакер, вполне вероятно, будет повторять описанный процесс до тех пор, пока не опустошит горячий кошелёк до конца, или же, при наихудшем сценарии, пока все запасы Monero не будут исчерпаны.

    Второй вариант бага, подробный отчёт по которому был опубликован на HackerOne, не даёт коду проводить проверку, необходимую для обнаружения фальшивых публичных ключей транзакции. Следовательно, хакер может использовать альтернативные публичные ключи транзакции, чтобы обмануть кошелёк и заставить его дважды сканировать выходы транзакций. В результате принимающий кошелёк сообщит о том, что он получил сумму в два раза превышающую ту, что была получена на самом деле. Как и в случае с первым вариантом бага, общий баланс при этом не страдает.

    Сообщение о первом варианте впервые появилось в этой ветке на GitHub, и он был быстро исправлен moneromooo в этом запросе на включение. Однако, к сожалению, серьёзность бага была недооценена до тех пор, пока (1) биржа не была взломана через форк Monero, и (2) исследователь в области безопасности (jagerman) не опубликовал на HackerOne подробный отчёт, в котором было указано, как можно использовать этот баг для хищения средств у бирж. О втором варианте бага сообщил пользователь phiren на HackerOne, и ошибка была быстро исправлена уже в этом запросе на включение. Оба патча были объединены fluffypony и включены в версию v0.12.3.0.

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

    Подытожим. Критический баг в программном обеспечении кошелька, серьёзность которого была недооценена в значительной мере, позволила злоумышленнику похитить средства у организаций, входящих в экосистему Monero. К счастью, баг коснулся только функции проведения расчётов программного обеспечения кошелька, поэтому протокол и денежная система монеты в целом не пострадали. Тем не менее крайне важно сделать выводы из этого случая и искать способы, которые позволят в значительной степени избежать последствий в случае обнаружения подобного бага в будущем. Более того, этот случай является хорошим напоминанием о том, что криптовалюта и соответствующее программное обеспечение всё ещё находятся на раннем этапе развития, и поэтому крайне чувствительны к (критическим) багам. По существу, было бы благоразумно со стороны организаций проводить максимально возможное количество проверок (например, проверок, направленных на верификацию соответствия суммы транзакций балансу). Помимо этого, сообщество разработчиков Monero уже исследует возможность осуществления такой проверки для RPC кошелька.

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

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

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