GoSuda

Сертификация FIPS 140 и Golang

By Gosunuts
views ...

FIPS 140 (Федеральный стандарт обработки информации, публикация 140)

FIPS 140 — это стандарт сертификации безопасности криптографических модулей, разработанный Национальным институтом стандартов и технологий (NIST) США. Этот стандарт оценивает, соответствует ли конкретный криптографический модуль или библиотека требованиям безопасности, определенным NIST. Следовательно, успешное прохождение сертификации FIPS 140 означает, что данный модуль обладает официально надежной безопасностью и может использоваться в областях, критически важных для безопасности, таких как финансы, здравоохранение и оборона.

FIPS 140 был первоначально разработан в 1994 году, затем пересмотрен как FIPS 140-2 в 2001 году и как FIPS 140-3 в 2019 году. До сих пор многие системы и приложения требуют сертификации FIPS 140-2 или FIPS 140-3.

FIPS 140 и языки программирования

По этой причине криптографические модули, сертифицированные FIPS 140, де-факто используются в качестве стандарта в различных языках программирования и средах. Типичными примерами являются OpenSSL, BoringSSL, LibreSSL, NSS, которые являются наиболее широко используемыми модулями в приложениях, критически важных для безопасности.

Большинство модулей, сертифицированных FIPS 140, написаны на C или C++. Из-за этого такие языки, как PHP, Python, Javascript, настраивают среду FIPS, взаимодействуя с этими модулями через внешние модули Provider, а не используя их напрямую. Однако такой подход имеет несколько ограничений.

  • Проблема несоответствия версий

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

  • Динамическая загрузка и снижение производительности

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

  • Уязвимости безопасности

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

FIPS 140 и Golang

По этой причине Golang выбрал другую стратегию. Go выбрал подход прямой поддержки сертификации FIPS 140 в официальной криптографической библиотеке, не полагаясь на внешние инструменты. Таким образом, разработчику достаточно активировать режим FIPS (GOFIPS=1), используя стандартный пакет crypto, без необходимости установки или настройки отдельного Provider. В этом процессе устраняются границы связи с внешними модулями, что повышает безопасность, а развертывание упрощается, поскольку требуется распространять только один статически скомпилированный бинарный файл.

FIPS 140-2 и Golang

Для этого Golang встроил модуль BoringCrypto, производный от BoringSSL, в среду выполнения Go и получил сертификацию 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 при вызове несертифицированного алгоритма. В отличие от моделей на основе Provider в других языках, которые оставляют возможность для резервирования, это обеспечивает более строгие и четкие гарантии с точки зрения безопасности и соответствия нормативным требованиям.

  • Hedged Signature

    Стандарт FIPS 140-3 рекомендует метод RFC6979 для подписи ECDSA. Однако Go, помимо этого, внедряет метод Hedged, который более устойчив к атакам по сторонним каналам, которые могут возникнуть в процессе подписи.

  • Усиленный генератор случайных чисел

    Генератор случайных чисел Go использует DRBG (Deterministic Random Bit Generator) в пользовательском пространстве, но также вводит дополнительную энтропию в ядро операционной системы, генерируя высококачественные случайные числа не только в пользовательском пространстве, но и в пространстве ядра. Это дополнительно усиливает безопасность генератора случайных чисел.