В декабре 2016 года китайский центр CERT представил 17-страничный отчет по аудиту безопасности блокчейн программного обеспечения. Как следует из отчёта, аудит был проведен в октябре 2016 года и представлен позже в виде «открытого» документа.
В отчёте представлены результаты проверки 25 блокчейн проектов с открытым исходным кодом, по найденным уязвимостям разделенные на 9 классов. В общей сложности было обнаружено 746 векторов узявимостей высокого уровня. Ripple была признана наиболе уязвимой с 223 багами.
Китайский центр CERT, Национальная сеть по реагированию на угрозы компьютерной безопасности, (известная также как CNCERT или CNCERT/CC), была основана в сентябре 2002 года. Это не правительственный, не прибыльный центр по кибербезопасности, главной командой, которая реагирует на угрозы в этой области. CERT говорят о важности технологии блокчейна, вместе с тем предупреждая о безопасности при разработках.
«Любая из уязвимостей может привести к огромным потерям собственности.»
Данные, используемые в отчёте, получены из результатов сканирования сети и поиска специалистами. В отчёте анализируются уязвимости только с точки зрения кода. Из-за ограничений, введённых разработчиками, некоторые проверки приходилось выполнять с помощью теста проникновения.
Обзор 25 проверенных проектов
Основываясь на количестве пользователей и активности их сетевых сообществ, CERT выбрали 25 блокчейнов с хорошей репутацией и популярностью в разных странах мира. Это программное обеспечение было написано на C, C + +, Java, Python, PHP и других языках программирования. Ниже представлен обзор того, что было в отчёте:
9 категорий уязвимостей
При тестировании обнаружены различные уязвимости, которые были разделены на 9 категорий по следующим критериям: причина возникновения, возможность ущерба, степень вреда и сложность решения.
- Ввод и представление данных
Проблемы со вводом и представлением данных обычно вызываются специальными символами, кодированием и отображением чисел. Некоторые проблемы появляются в результате ошибок ввода. Эти проблемы включают: переполнение буфера, скрипты между сайтами, SQL инъекции, командные инъекции и многие другие.
- Злоупотребление API
API это соглашение между вызывающим и вызываемым, и большинство проблем с API связаны с тем, что вызывающая сторона не понимает цели соглашения. Проблемы с безопасностью также могут возникнуть, когда API не используется правильно.
- Особенности безопасности
В эту категорию входят уязвимости, связанные с аутентификацией, контролем доступа, конфиденциальностью, использованием пароля и управлением правами доступа.
- Управление памятью
С управлением памятью связано большое количество уязвимостей, которые связаны с выполнением операций в памяти, утечками памяти, повторным её использованием и так далее. Этот тип уязвимости обычно приводит к потере производительности системы и падению программ, особенно написанных на языках C / C + +.
- Время и состояние
Распределённые вычисления зависимы от времени и состояния. Взаимодействие между потоками и процессами, а также порядком их выполнения часто задаётся извне, например, семафорами, переменными, системными файлами и так далее. Уязвимости, связанные с распределёнными вычислениями, включают состояние гонки, блокировки и так далее.
- Ошибки при обработке исключительных ситуаций
Этот тип уязвимости связан с обработкой ошибок и обработкой исключений, и наиболее распространенный тип уязвимости — это отсутствие механизма обработки (или наличие не обрабатываемых ошибок), приводящие к неожиданному завершению программы. Другая уязвимость состоит в том, что генерация ошибки выдаёт нападающему слишком много информации.
- Качество кода
Плохое качество кода может привести к непредсказуемому поведению программы. Для атакующего плохой код, наоборот, хороший, поскольку позволяет ему проникнуть в систему не ожиданными способами. Среди этих уязвимостей есть мертвый код, указатель на нулевую точку и утечка ресурсов.
- Инкапсуляция и скрытые дефекты
Разумная инкапсуляция означает задание различий между проверенными и не проверенными данными, между данными различных пользователей, или задания различий между данными, которые видимы или не видимы для пользователей. Распространенные уязвимости включают скрытые поля, утечку информации, подделку запроса к сайту и так далее.
- Ошибки в среде выполнения программы
Уязвимости этих типов являются внешними по отношению к исходному коду, это например, настройки запуска программы, входа в панель управления и так далее, и именно они являются критичными для безопасности продукта.
Первые восемь типов уязвимостей отноятся к проблемам безопасности, связанными с исходным кодом. Их могут использовать атаки, связанные с вредоносным ПО. После проникновения они могут вызвать проблемы безопасности, связанные с утечкой информации, ложной авторизацией и внедрением в запуск программ. Этот последний тип уязвимости описывает то, что является внешним по отношению к действующему коду. Они могут привести к не нормальным действиям ПО, потере данных и другим серьезным проблемам.
Рейтинг уязвимостей
Исследователи разделили проблемы с безопасностью исходного кода на три уровня: высокий, средний и низкий. Критерий для изменения уровня включает два измерения, уверенность и серьезность. Уверенность описывает вероятность того, что здесь есть проблема. Например, вызов strcpy (), помеченный как переполнение буфера, является уязвимостью с низкой уверенностью. Серьезность, по уникальной технике описывает важность проблемы. Например, переполнение буфера чаще всего является показателем более серьезной проблемы с безопасностью, чем пустой указатель. Комбинация этих двух факторов позволяет классифицировать угрозы безопасности, как показано на диаграмме 1.
Ripple это самый не безопасный проект
746 высокоуровневых и 3497 среднеуровневых багов были обнаружены среди 25 проектов, и Ripple заняли лидерство с 223 рискованными участками кода. Диаграмма 2 показывает статистику уязвимостей безопасности, обнаруженных в 25 проектах. Красная линия показывает количество узявимостей на тысячу линий кода (общее количество багов / линии кода * 1000).
«Важно заметить, что среди всех проверенных в этот раз проектов, Ripple наиболее широко используется и имеет самую крупную пользовательскую базу. На момент написания статьи, эта компания по разработке программного обеспечения получила 100 миллионов USD инвестиций от Google и Accenture. Некоторые крупные финансовые учреждения объявили, что присоединяются к этой платёжной сети, среди которых есть Standard Chartered, Westpac, Shanghai Huarui Bank и так далее. Принимая во внимание тот факт, что Ripple напрямую связан с финансовыми активами, и эти участки кода уязвимы для хакеров, данные учреждения могут потерпеть невообразимые убытки.»
Ethereumj это проект на втором месте по небезопасности, со 110 уязвимостями высокого уровня. Bitshares содержит 4 высокорискованных бага и 665 средних, и это наибольшее количество среди всех проектов.
Ethereum Wallet, Hlp-candidate и OmniJ показали ноль или одну ошибку высокого уровня и поэтому были признаны самыми безопасными проектами среди всех проверенных.
Анализ уязвимостей высокого уровня
Большинство уязвимостей попадают в категорию «ошибок ввода и отображения», что в основном является результатом неполной проверки введенных пользователем данных. Вредоносный ввод может вызвать сбой программы, полный доступ к файлам и другие проблемы с безопасностью.
«Например, некоторое блокчейн ПО, написанное на Java, например, Ripple, применяет JNI фреймворк и использует другие языки, такие, как C, C++ для манипуляций с памятью и другими ресурсами операционной системы, пропуская механизм защиты памяти, встроенный в Java, и это делает программы уязвимыми для атак с переполнением буфера.»
Ещё одна уязвимость, которая встречалась часто, это «качество кода», которая следует из «слабых знаний разработчиков о безопасности» и «нестандартизированного кодирования». Некоторые уязвимости могут привести к переполнению памяти, истощению ресурсов и другим проблемам с безопасностью. В наихудшем сценарии может быть не нормальное функционирование или даже падение системы. Так как программное обеспечение на блокчейне часто интегрируется с операционной системой финансового учреждения, падение системы может вызвать неприемлемые убытки.
«Особенности защиты» также составляют немалый процент уязвимостей, связанных с аутентификацией, управлением авторизацией, сохранением паролей и другими задачами. Атакующий может использовать опасные участки кода для получения не авторизированного доступа, кражи приватной информации. Функция шифрования является ключевой для блокчейн программного обеспечения, поскольку она обеспечивает целостность распределённого реестра. Однако результаты проверки показывают, что есть немало проблем, связанных с «не безопасной генерацией случайных чисел», что может привести к удачным хакерским атакам.
Уязвимости JNI и генератора случайных чисел
Из 25 протестированных проектов, двумя наиболее распространными типами уязвимостей стали не безопасный JNI (16.22%, 121) и не безопасные генераторы случайных чисел (21.72%, 162).
Диаграмма 4 распределение уязвимостей высокого и среднего уровня (по отдельным категориям)
- не безопасный JNI (из категории «проверка ввода и отображение данных»).
Когда приложение на Java использует JNI для вызова кода, написанного на другом языке программирования, такой вызов может сделать приложение на Java уязвимым к атакующему коду, написанному на другом языке. Несмотря на то, что в Java существует механизм защиты памяти, он не применим к программному коду, написанному на другом языке и доступ осуществляется через Java Native Interface (JNI). Предложена мера по тщательной предварительной проверке кода, написанного на другом языке, и исполняемого через Java код.
- Не безопасная генерация случайных чисел
В сложных с точки зрения безопасности условиях нужно использовать генераторы случайных чисел; другое решение может вызвать серьёзные проблемы с безопасностью, такие, как лёгкий для подбора пароль, предсказуемые ключи шифрования, атаки угона сессии и спуфинг DNS.
Меры предосторожности: Криптографический генератор псевдослучайных чисел должен использоваться, при этом информационная энтропия при создании ключа должна быть максимальной.
Анализ уязвимостей среднего уровня
Уязвимости среднего и низкого уровня представляют более низкий риск при выполнении в реальном окружении. Однако наличие этих ошибок отображает качество кода, и в некоторой степени внимание разработчиков к проблемам безопасности. Диаграмма 5 показывает распределение уязвимостей безопасности. Несмотря на то, что проблемы среднего уровня не могут вызвать серьезные уязвимости безопасности, они всё ещё представляют серьезную угрозу для системы. Их использование грозит падением системы. «Возможно, причина состоит в том, что некоторые рассмотренные нами релизы были выпущены в тестовых версиях и не прошли полного контроля качества.»
Диаграмма 6 показывает расположение различных уязвимостей безопасности. Примечательно, что 87 уязвимостей встречаются меньше, чем 10 раз, среди которых есть уязвимости, связанные с качеством кода и API, классифицированные, как «остальные» в отображении данных отчёта. Две наиболее распространённые уязвимости это не используемые локальные переменные (13.94%, 1,181) и не безопасные функции строк (13.20%, 1,118). В конце отчёта также предложены меры по исправлению этих двух ошибок.
Это первый аудит кибербезопасности, представленный китайскими исследователями. Такое количество ошибок может смутить сторонников криптовалют.
«746 уязвимостей высокого уровня показывают, что такую высокую степень риска нельзя игнорировать.»
Ожидается отклик от разработчиков, который прояснит ситуацию.
Ссылка на скачивание китайского отчёта и отчёта на английском в виде PDF файла.
Обновление: Ripple выпустили официальный ответ на проверку CERT.