Структура реализации FIPS 140-2 и FIPS 140-3 в стандартной криптографической библиотеке Go

FIPS 140 (Federal Information Processing Standard Publication 140)
FIPS 140 — это стандарт безопасности криптографических модулей, разработанный Национальным институтом стандартов и технологий США (NIST). Данный стандарт оценивает, соответствуют ли конкретные криптографические модули или библиотеки требованиям безопасности, определенным NIST. Следовательно, прохождение сертификации FIPS 140 означает, что соответствующий модуль обладает официально надежной безопасностью, и может использоваться в сферах, где безопасность имеет критическое значение, таких как финансы, здравоохранение и оборона.
С момента своего первоначального принятия в 1994 году стандарт FIPS 140 претерпел изменения: в 2001 году он был пересмотрен как FIPS 140-2, а в 2019 году — как FIPS 140-3. По сей день многие системы и приложения требуют сертификации FIPS 140-2 или FIPS 140-3.
FIPS 140 и языки программирования
По этой причине криптографические модули, сертифицированные по стандарту FIPS 140, используются в качестве де-факто стандарта в различных языках программирования и средах. В качестве примеров можно привести OpenSSL, BoringSSL, LibreSSL и NSS, которые являются наиболее широко используемыми модулями в приложениях, требующих повышенной безопасности.
Большинство модулей с сертификацией FIPS 140 написаны на языке C или C++. По этой причине в таких языках, как PHP, Python и JavaScript, вместо прямого использования этих модулей среда FIPS настраивается путем интеграции через внешние модули-провайдеры. Однако такой подход имеет ряд ограничений.
Проблема несоответствия версий
Сертификация FIPS 140 выдается только для конкретных версий. Следовательно, для использования последней версии модуля необходимо повторно пройти процесс сертификации, в ходе которого может возникнуть несоответствие версий между модулем, используемым приложением, и модулем с сертификацией FIPS. Если используется неавторизованная версия, данная среда больше не будет считаться сертифицированной по стандарту FIPS.
Динамическая загрузка и снижение производительности
Большинство языков загружают и используют модули сертификации FIPS 140 в виде динамических библиотек. Этот подход может вызывать снижение производительности на этапах инициализации и выполнения, а также создает риск прямого влияния на общую стабильность приложения в случае возникновения проблем во время выполнения.
Уязвимости безопасности
Как отмечалось выше, в архитектуре, использующей внешние модули, такие как провайдер OpenSSL, существует риск прямого распространения уязвимостей безопасности данного модуля на приложение. Кроме того, сам уровень связи между приложением и внешним модулем становится дополнительной поверхностью атаки, что требует создания отдельного защитного слоя для ее обеспечения. Это увеличивает сложность и может привести к возникновению непредвиденных уязвимостей.
FIPS 140 и Golang
По этой причине в Golang был выбран иной подход. Go предпочел не полагаться на внешние инструменты для получения сертификации FIPS 140, а встроить ее поддержку непосредственно в свою официальную криптографическую библиотеку. Следовательно, разработчикам не требуется устанавливать или настраивать отдельные провайдеры, достаточно продолжать использовать стандартный пакет crypto и просто активировать режим сертификации FIPS (GOFIPS=1). В этом процессе устраняется граница связи с внешними модулями, что повышает уровень безопасности, а также упрощает эксплуатацию, поскольку требуется развертывать только один статически скомпилированный бинарный файл.
FIPS 140-2 и Golang
Для достижения этой цели в Golang был встроен модуль BoringCrypto, производный от BoringSSL, что позволило получить сертификацию FIPS 140-2. Модуль BoringCrypto может быть активирован в определенных дистрибутивах, начиная с версии Go 1.19, благодаря чему приложения на Go могут настраивать среду с сертификацией FIPS 140-2 без использования дополнительных внешних модулей.
Тем не менее, поскольку BoringCrypto основан на OpenSSL, зависимость от языка C сохраняется. Соответственно, приложения на Go не собираются в полностью независимые бинарные файлы, и существовало ограничение, требующее совместного распространения необходимых библиотек C.
FIPS 140-3 и Golang
Чтобы преодолеть эти ограничения, команда Go усовершенствовала существующую стандартную криптографическую библиотеку Go в соответствии со спецификацией FIPS 140-3. Этот усовершенствованный модуль стал доступен в экспериментальном режиме, начиная с версии Go 1.21, и в настоящее время проходит процесс оценки на соответствие стандарту FIPS 140-3 со стороны NIST.Список модулей, проходящих оценку NIST FIPS 140-3
Это демонстрирует зрелость криптографической библиотеки Go, благодаря которой Go может предоставить среду с сертификацией FIPS 140-3 в виде единого, полностью независимого бинарного файла.
Более того, команда Go не ограничилась простым соответствием стандарту FIPS 140-3, но и самостоятельно повысила уровень безопасности.
Fail Fast (Быстрый сбой)
Режим FIPS в Go реализует модель безопасности Fail Fast, которая немедленно прекращает выполнение программы с помощью паники (panic) при вызове несертифицированных алгоритмов. В отличие от моделей на основе провайдеров в других языках, которые оставляют вероятность отката к резервным вариантам, это обеспечивает более строгие и однозначные гарантии с точки зрения безопасности и соблюдения нормативных требований.
Hedged Signature (Защищенная подпись)
Стандарт FIPS 140-3 рекомендует метод RFC6979 при создании цифровых подписей ECDSA. Однако Go дополнительно внедряет подход Hedged, что обеспечивает более надежное противодействие атакам по сторонним каналам, которые могут возникнуть в процессе подписания.
Усовершенствованный генератор случайных чисел
Генератор случайных чисел в Go использует детерминированный генератор случайных битов (DRBG) в пользовательском пространстве, одновременно вводя дополнительную энтропию из ядра операционной системы. Это позволяет генерировать высококачественные случайные числа не только в пользовательском пространстве, но и в пространстве ядра. Данный подход дополнительно усиливает безопасность генератора случайных чисел.