Перевод Результаты четырех аудиторских проверок RandomX для Monero и Arweave

Тема в разделе "Статьи", создана пользователем TheFuzzStone, 24 авг 2019.

  1. TheFuzzStone

    Команда форума Администратор Модератор

    Регистрация:
    18 авг 2017
    Сообщения:
    217
    Симпатии:
    61
    Хотим напомнить, что наша работа осуществляется только при поддержке наших спонсоров и сообщества. У вас есть отличная возможность сделать пожертвование и привлечь к участию компании, в которых вы работаете. Нам постоянно не хватает средств, полученных от финансирования, и чем больше денег, тем больше исследований мы можем провести. Отдельное спасибо Private Internet Access, Monero Research Lab, NordVPN, ExpressVPN и Mullvad за вклад в OSTIF, который помогает нам продвигать мир открытого исходного кода. Этот проект финансировался в основном за счет средств сообщества Monero и Monero Research Lab.

    Мы работали с сообществом Monero, Arweave, Monero Research Lab и четырьмя аудиторскими командами, чтобы провести тщательный анализ RandomX, нового PoW-алгоритма, направленного на продвижение "эгалитарного идеала" для криптовалют.

    RandomX стремится сделать высокооптимизированное аппаратное оборудование (или ASIC) не выгодным или намного менее эффективным, чем обычное пользовательское оборудование. Мысль, лежащая в основе этого шага, заключается в том, что пользовательское оборудование, которое доступно каждому, с гораздо большей вероятностью будет использоваться энтузиастами и людьми повсеместно, что позволяет защититься от централизации вычислительной мощности, которая используется для проверки транзакций.

    Одна из классических проблем в криптовалюте заключается в том, что если одна сторона (или группа злоумышленников) владеет хотя бы 51% вычислительной мощности сети, то она может перезаписывать транзакции для проведения двойной траты, аннулирования реальных транзакций или других манипуляций с сетью. Рост количества специализированного оборудования (ASIC и FPGA) дал группам людей возможность получить мажоритарную долю в вычислительных мощностях (также известных как хешрейт).

    RandomX нацелен на решение этой проблемы, делая алгоритм слишком сложным для ASIC и FPGA с точки зрения эффективной оптимизации. Они будут либо значительно медленнее, либо слишком дороги в производстве из-за сложности архитектуры или слишком дороги в эксплуатации по сравнению с оборудованием общего назначения (в перерасчете мощности к стоимости электроэнергии).

    RandomX - это совершенно новая идея, но она использует множество хорошо известных криптографических функций и применяет их самым что ни на есть интересным образом.

    Для проверки безопасности RandomX Monero Research Lab, сообщество Monero и Arweave внесли значительный вклад в финансирование исследований по безопасности, которые мы все координировали сообща.

    Эти четыре аудиторские проверки проводились последовательно, результаты и исправления вносились по результатам каждой из них в последующую проверку. Эта серия каскадных аудитов дала нам возможность ознакомиться с уникальной точкой зрения различных команд, а также взглянуть на аспекты кода, на которых другие не акцентировали внимания, что привело к детальному анализу безопасности.

    Область применения

    Цель этих аудитов заключается не только в определении того, что код и криптография не содержат ошибок, но и что его внедрение не позволит использовать ASIC или FPGA в дальнейшем со значительным преимуществом перед аппаратным оборудованием общего (пользовательского) назначения.

    В общих чертах

    Все четыре аудиторских конторы согласны с тем, что код RandomX выполнен на очень высоком уровне, соответствующая документация может быть улучшена, чтобы предотвратить ошибки реализации в других блокчейнах (не-Monero и не-Arweave). Команды не нашли допустимых изменений в коде, которые позволили бы повысить производительно, а также функций или компонентов RandomX, которые можно было бы легко обойти с помощью аппаратной оптимизации (ASIC / FPGA). По общему мнению, код почти готов к внедрению, и со временем некоторые небольшие изменения в коде и усовершенствования документации могут еще больше повысить безопасность по мере развития RandomX и с появлением его последующих обновлений.

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

    ИСПРАВЛЕНО = Был применен патч, который исправляет эту проблему.

    РЕШЕНО = Разъяснение, данное командой RandomX, указывает, что проблема не требует исправления.

    ОСПОРЕНО = Команда RandomX не согласна с оценкой.

    Если вопрос не имеет статуса, то только потому, что он все еще обсуждается между рабочими группами. Это не означает, что OSTIF не знает о текущем состоянии данного вопроса или проблемы. Статус вопросов будет обновляться по мере того, как мы будем узнавать о них все больше и больше.


    Аудит 1 - Trail of Bits, финансируемый Arweave
    • Проблема 1 - ИСПРАВЛЕНО - Одиночный раунд, используемый в AesGenerator
    В RandomX используется один раунд AES для достижения диффузии. Для полного смешивания исходных данных требуется не менее двух раундов AES. Это проблематично, поскольку в возможном сценарии уязвимости злоумышленник смог найти подобное отклонение и в других компонентах RandomX и другие операционные части алгоритма можно было бы также пропустить или оставить без вычислений, что позволило бы реализовать более простое решение ASIC или FPGA. Но это было бы возможно только в том случае, если бы в других функциях RandomX существовала аналогичная проблема, которой не было выявлено. Тем не менее RandomX теперь обновлен для использования AesGenerator4R, который выполняет четыре цикла AES для правильного смешивания и достижения диффузии данных.
    • Проблема 2 - ИСПРАВЛЕНО - Недостаточное тестирование и проверка корректности VM
    RandomX использует виртуальную машину, но не имеет машиночитаемой спецификации для проверки ее на соответствие. Это важно, потому что при изменении реализации очень маленькие изменения могут привести к появлению форков в непредсказуемых местах в блокчейне. Возможность тестирования в соответствии со спецификацией обнаруживает эти (потенциально редкие и трудно обнаруживаемые) проблемы до того, как они возникнут проблемой в "живом" блокчейне. Тестирование было значительно расширено, поскольку теперь доступны модульные тесты для RandomX.
    • Проблема 3 - ИСПРАВЛЕНО - Настраиваемые параметры в RandomX являются хрупкими - Pull Request 59
    RandomX имеет много вариантов конфигурации, чтобы позволить множеству криптовалютным проектам имплементировать его. Некоторые из этих опций могут значительно ухудшить свойства RandomX в плане безопасности и устойчивости к ASIC. Настоятельно рекомендуется по крайней мере добавить комментарии к параметрам, которые оказывают значительное влияние на безопасность и надежность RandomX, и это должно быть долгосрочной целью, чтобы полностью исключить возможность выбора небезопасных параметров. Команда RandomX провела дополнительные проверки, чтобы убедиться, что их значения являются разумными, а также они добавили значительно больше документации о том, какие значения следует выбирать.
    • Дополнительные опции
    Некоторые предложения по улучшению качества кода. Предложены улучшения в методе случайности в SuperscalarHash. Trail of Bits также провел комплексный анализ случайности RandomX и обнаружил, что он достаточно хорошо выбирает различные пути, что препятствует оптимизации для специфических путей, которые чаще всего выбираются со смещением. Они также обеспечили отличный ресурс, на котором можно безопасно изменять настраиваемые параметры в RandomX, и который следует оставить в покое. (Раздел Е.) Они также рекомендовали конкретные значения для Arweave, спонсора исследования Trail of Bits.

    Полный отчет для Arweave можно найти здесь.


    Аудит 2 - Kudelski Security при финансовой поддержке OSTIF, Monero Research Lab и сообщества Monero.

    (Выводы по результатам аудита Trail of Bits были опущены.)
    • Проблема 1 - РЕШЕНО - Использование неоптимизированного BLAKE2
    Версия хэш-функции BLAKE2 в RandomX не оптимизирована и не использует расширение системы команд AVX-512. С помощью оптимизированной версии BLAKE2 достигается ускорение до 40%. Однако общая производительность RandomX не зависит от BLAKE2, единственным преимуществом доработанной части кода является соотношение энергопотребление / процессорное время. Команда RandomX изучает возможность использования оптимизированной реализации BLAKE2 от LibSodium для последующих обновлений и релизов.
    • Проблема 2 - ИСПРАВЛЕНО - Отсутствие NULL-проверок - Pull Request 88
    RandomX не выполняет NULL проверки при разыменовании указателя в большинстве областей кода. Разыменования указателей NULL являются распространенной проблемой безопасности в языках, которые их используют. Как правило, в таких случаях используется проверка, даже если вы уверены в своем коде, потому что ошибки могут быть обнаружены на последующих этапах.
    • Проблема 3 - РЕШЕНО - randomx_reciprocal() можно разделить на ноль - Pull Request 88
    Деление на ноль может привести к ошибкам и другим нежелательным действиям. После обсуждения этой проблемы с командой разработчиков было принято решение исправить это и в других частях кода. Проверка была исправлена в pull request 88.
    • Проблема 4 - ИСПРАВЛЕНО - randomx.cpp содержит ошибку несоответствия типа (Type Mismatch Error) - Pull Request 88
    Этот тип ошибки может привести к тому, что злоумышленник может использовать созданные входные данные для принудительного выполнения нежелательных действий (целочисленное переполнение). Команда RandomX добавила проверки и утверждения в код для того, чтобы приложение аварийно завершало работу при обнаружении недопустимых входных данных.
    • Проблема 5 - ИСПРАВЛЕНО - getCodeSize() имеет потенциальное недополучение интеграла - Pull Request 95
    • Проблема 6 - РЕШЕНО - randomx.cpp не проверяет вручную ошибки хеша Blake2b
    Ошибки хэширования могут привести к нежелательному состоянию RandomX, что позволит пользователю обойти некоторые этапы в RandomX. После подробного исследования была добавлена проверка во время компиляции. В дополнение команда разработчиков добавила дополнительный слой защиты в RandomX - ручную проверку значения и вызов соответствующего сообщения (аварийное завершение работы приложения) в случае возникновения ошибки.
    • Проблема 7 - РЕШЕНО - Потенциальные внешние записи в формате fillAes1Rx4() и fillAes4Rx4() - Pull Request 95
    Не является проблемой, так как существуют проверки границ во время компиляции. Были добавлены дополнительные проверки безопасности.
    • Проблема 8 - РЕШЕНО - isPowerOf2() может иметь нулевой вход, который не является входом 2 - Pull Request 95
    Проверка значения была неправильно помечена как "isPowerOf2()", и нулевое значение может быть интерпретировано в функцию, вызывая потенциально нежелательное поведение. После беседы с командой RandomX была предварительно установлена возможность вызова нуля в функции, но эта функция была переименована для большей ясности в том, что на самом деле делает проверка. Теперь она называется isZeroOrPowerOf2().


    Аудит 3 - X41 D-Sec при финансовой поддержке OSTIF, Monero Research Lab и сообщества Monero.
    • Проблема 1 - ИСПРАВЛЕНО - Размер кода в компиляторе JIT - Pull Request 98
    Компилятор RandomX JIT ограничен до размера в 64k, который может быть превышен путем изменения некоторых параметров RandomX (это может повлиять на реализации, не использующие шаблон Monero). Может иметь последствия как для безопасности, так и для стабильности.
    • Проблема 2 - РЕШЕНО - Целостная обработка при вычислении цели перехода
    Функция "Перепрыгивание мишени" не учитывает граничные случаи, которые могут привести к целочисленным переполнениям или целочисленным обходам. После обсуждения с командой RandomX это, по-видимому, не проблема, потому что существует небольшой диапазон допустимых входных данных, которые предотвращают возникновение этой проблемы.
    • Проблема 3 - ИСПРАВЛЕНО - DatasetSize не учитывает использование в 32-битных системах - Pull Request 99
    DatasetSize может переполняться очень небольшим количеством на 32-битных системах из-за ограничения по объему выделенной памяти для 32-битной адресации. После разговора с командой RandomX, было выясненоо, что RandomX не предназначен для работы на 32-битных системах, так как они не будут конкурентоспособны на современном алгоритме доказательства работы. Pull Request 99 добавляет проверку, чтобы при запуске на 32-битных системах выводилось соответствующее сообщение.
    • Проблема 4 - ИСПРАВЛЕНО - неверный код, сгенерированный в режиме эмуляции - Pull Request 98
    X41 обнаружил несколько проблем в работе RandomX, в частности, в режиме эмуляции с параметрами, отличающимися от параметров по умолчанию. Параметры по умолчанию предназначены только для использования с Monero, а другие проекты будут использовать параметры, отличные от параметров по умолчанию. Pull request 98 исправляет эти проблемы.
    • Проблема 5 - ИСПРАВЛЕНО - Недостаточная диффузия в AesGenerator4R генераторе - Pull Request 76
    X41 обнаружили, что повторное использование ключей в функции AesGenerator4R позволяет осуществить тривиальный реверс функции. Рекомендуется использовать отдельные ключи в AesGenerator4R. Важно отметить, что специфический способ использования в RandomX функции AesGenerator4R не представляет угрозы безопасности, поскольку входные данные представляют собой криптографически безопасную хеш-функцию.
    • Проблема 6 - ИСПРАВЛЕНО - Неудовлетворительный охват кода - Запрос на вытаскивание 73
    X41 отметили, что RandomX является «монолитным компонентом» и что трудно тестировать отдельные компоненты RandomX, а не RandomX в целом. Это важно, потому что зачастую проблемы могут быть скрыты в компонентах, которые не проходят тестирование в отдельном ключе. В pull request 73 добавлены отдельные векторы для тестов, а также дополнительное регрессионное тестирование.
    • Проблема 7 - ИСПРАВЛЕНО (ОПЦИОНАЛЬНО) - Страницы памяти JIT для генерируемого кода могут быть записаны и выполнены - Pull Request 112
    JIT-компилятор имеет одновременные разрешения на чтение, запись и выполнение, которые ему не требуются. Удаление для JIT-компилятора возможности записи и выполнения уменьшает вероятность того, что злоумышленник использует ошибку в JIT-компиляторе для выполнения произвольного кода. Данная проблема была исправлена в pull request 112, однако данное исправления привело к значительному снижению производительности (~30%), что может оказаться неприемлемо для большинства пользователей. Из-за этого была сделана опция с возможность включения/выключения данного функционала.
    • Проблема 8 - РЕШЕНО - Выполнение RandomX в песочнице
    Поскольку сценарий использования RandomX необходимо взять пользовательские данные из внешнего источника (блока) и обработать их, не исключено, что злоумышленник сможет найти вход, который может обойти спецификации безопасности виртуальной машины RandomX, Virtual Machine. Методы песочницы, подобные тем, которые предлагает AppContiner или seccomp, помогут смягчить любую возможность возникновения подобного сценария атаки. Команда RandomX не согласна с этой оценкой, потому что значения, которые злоумышленник может изменить (отправив поддельные блоки), незамедлительно передаются для хеширования через Blake2, что означает, что входные данные не могут эффективно контролироваться, чтобы вызвать проблему при наличии уязвимости в RandomX.
    • Проблема 9 - ИСПРАВЛЕНО - Неверная задержка функции SuperScalarHash при слишком малом размере колмогоровской сложности объекта - Pull Request 98
    Некоторые комбинации параметров могут привести к некорректным состояниям, в которых RandomX будет продолжать работать, даже если для корректной работы приложения выделено недостаточно памяти. Рекомендуется дополнительная проверка работоспособности программы в зависимости от колмогоровской сложности объекта.
    • Проблема 10 - Отсутствие машиночитаемой спецификации
    RandomX не имеет машиночитаемой спецификации для тестирования, что означает, что нет простого метода для тестирования альтернативных реализаций RandomX. Альтернативные реализации будут иметь одинаковые результаты. Наличие такой спецификации предотвращает проблемы с взаимодействием, а также помогает разработчикам альтернативных реализаций обнаруживать и исправлять ошибки в собственном коде. По мере роста проекта крайне важно добавить машиночитаемую спецификацию как приложение.
    • Сопротивление ASIC/FPGA 1 - ОСПОРЕНО - Низкая степень зависимости от модуля прогнозирования ветвлений
    Модуль прогнозирования ветвления CPU представляет собой сложный и большой компонент, занимающий много физического пространства в CPU. RandomX не полагается на логику прогнозирования ветвления, поэтому это может значительно упростить появление потенциальных ASIC спецификаций. После общения с командой RandomX эта область кода была оспорена, потому что любая логика, которая может быть предсказана предиктором ветвления, может быть реализована в ASIC.
    • Сопротивление ASIC/FPGA 2 - Низкая зависимость от логики внешнего планирования
    Некоторые части RandomX могут выполняться параллельно с использованием препроцессора вместо JIT, что позволяет использовать нестандартный прототип чипа, имеющий преимущество перед CPU. После обсуждения с командой RandomX эта часть кода не является высокоэффективной и не оказывает существенного влияния на производительность, но может привести к появлению ASIC.
    • Сопротивление ASIC/FPGA 3 - ОСПОРЕНО - Низкая зависимость от других современных элементов процессора
    RandomX не использует большинство сложных современных возможностей процессора, таких как: привилегированные инструкции, прерывания и маршрутизация прерываний (x86 APIC), TLB 8 s, MMU 9, виртуальную память, взаимодействие между ядрами и согласованность кэша. Хотя эти функции не занимают много места в матрице, но они очень сложны и требуют отдельных исследований и разработок для их реализации. Добавление в RandomX функций, использующих перечисленные возможности процессора, значительно увеличит производительность пользовательского оборудования. RandomX не может реализовать многие пользовательские функции из современных CPU, поскольку он разработан для работы на большинстве актуальных CPU, которые могут не обладать такими функциями.


    Аудит 4 - QuarksLab при финансовой поддержке OSTIF, Monero Research Lab и сообщества Monero

    Этот аудит был проведен компанией QuarksLab после завершения и публикации трех предыдущих аудиторских проверок, чтобы максимально повысить его эффективность. Они рассмотрели актуальную версию RandomX и всю работу предыдущих команд.
    • Проблема 1 — (RNDX-N2) Использование жестко закодированных строк
    RandomX приложил значительные усилия, чтобы сделать все компоненты своего протокола полностью настраиваемыми для безопасного повторного использования. Есть шесть закодированных строк в качестве различных констант и ключей, и предлагается добавить эти строки в набор конфигурации для упрощения управления и настройки. Это незначительная проблема этичности кода, а не уязвимость системы безопасности.
    • Проблема 2 - ИСПРАВЛЕНО - (RNDX-N2) Предупреждение о повторном использовании компонентов RandomX - Pull Request 111
    Хотя существующая реализация компонентов AesHash1R, AesGenerator1R и AesGenerator4R является разумной, должны быть созданы соответствующие предупреждения о повторном использовании этих функций для разработчиков, которые могут испытывать функции в своих собственных реализациях RandomX. Они опасны, если используются в различных контекстах.
    • Проблема 3 — ИСПРАВЛЕНО - (RNDX-M1) Реализация Argon2 не обеспечивает соблюдения минимального размера модификатора Соли - Pull Request 111
    Для работы Argon2 требуется модификатор Соли размером не менее 8 байт. RandomX не использует данной проверки и не выводит соответствующую ошибку, если размер модификатора Соли слишком мал. Следует добавить нижнюю границу проверки.
    • Проблема 4 — ИСПРАВЛЕНО - (RNDX-L1) RANDOMX_ARGON_LANES и RANDOMX_ARGON_ITERATIONS необходимы верхние пределы ограничения - Pull Request 111
    Для RANDOMX_ARGON_LANES верхний предел должен составлять 2^24-1, а для RANDOMX_ARGON_ITERATIONS верхний предел должен составлять 2^32-1.
    • Проблема 5 - ИСПРАВЛЕНО - (RNDX-L2) RANDOMX_ARGON_MEMORY нуждается в нижнем ограничении в размере 8 - Pull Request 111
    Нижний предел, но в настоящее время равен 1, что не учитывает ARGON2_SYNC_POINTS = 4.
    • Проблема 6 - ИСПРАВЛЕНО — (RNDX-L2) отсутствие 64-байтового выравнивания для mx и ma спецификаций - Pull Request 111
    • Проблема 7 - ИСПРАВЛЕНО - (RND X-M2) Ошибка при вычислении смещения данных (DataOffset)
    Вычисления смещения данных (DataOffset) не соответствовали спецификации. После того как QuarksLab обсудил это с командой RandomX, выяснилось, что это был фрагмент устаревшего кода из старой версии RandomX. Данная проблема уже исправлена.
    • Проблема 8 - ИСПРАВЛЕНО - Ограничение размера ключа RandomX не является принудительным - Pull Request 111
    RandomX определяет 60-байтовый входной ключ, но большие ключи могут быть загружены без ошибок. После обсуждения с командой RandomX большие ключи обрезаются до 60 байт. Теперь RandomX информирует пользователей в тех случаях, когда длинные ключи обрезаны.

    Аудиторские отчеты

    Trail of Bits
    Kudelski Security
    X41 D-Sec
    QuarksLab


    Если вам нравится наша работа, пожалуйста, рассмотрите возможность пожертвования и отслеживания нашей деятельности в социальных сетях (@ostifofficial в Twitter и /u/ostifofficial в Reddit) и расскажите о нашей деятельности. Мы упорно работаем над этими проектами, и ни один из них не может быть выполнен без финансирования!

    Источник: Four Audits of RandomX for Monero and Arweave have been Completed – Results

    Перевод:
    TheFuzzStone (@TheFuzzStone)
    Редактирование:
    Agent LvM (@LvMi4)
    Коррекция:
    Kukima (@Kukima)
     
    Am1n нравится это.
  • О нас

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