GoSuda

Struktura implementací FIPS 140-2 a FIPS 140-3 ve standardní kryptografické knihovně jazyka Go

By Gosunuts views ...

FIPS 140 (Federal Information Processing Standard Publication 140)

FIPS 140 je standard pro certifikaci bezpečnosti kryptografických modulů, který vydal americký NIST. Tento standard hodnotí, zda konkrétní kryptografický modul nebo knihovna splňuje bezpečnostní požadavky definované NISTem. Absolvování certifikace FIPS 140 proto znamená, že daný modul má oficiálně ověřenou bezpečnost a může být používán v oblastech, kde je bezpečnost klíčová, jako jsou finance, zdravotnictví a obrana.

Standard FIPS 140 byl poprvé vydán v roce 1994 a následně byl revidován jako FIPS 140-2 v roce 2001 a jako FIPS 140-3 v roce 2019. Mnoho systémů a aplikací dosud vyžaduje certifikaci podle FIPS 140-2 nebo FIPS 140-3.

FIPS 140 a programovací jazyky

Z tohoto důvodu se kryptografické moduly certifikované podle FIPS 140 používají v mnoha programovacích jazycích a prostředích jako de facto standard. Typickými příklady jsou OpenSSL, BoringSSL, LibreSSL a NSS, které patří mezi nejrozšířenější moduly v aplikacích, kde je bezpečnost zásadní.

Většina modulů certifikovaných podle FIPS 140 je napsána v jazyce C nebo C++. Z tohoto důvodu jazyky jako PHP, Python nebo JavaScript tyto moduly obvykle nepoužívají přímo, ale vytvářejí prostředí FIPS prostřednictvím připojení externích Provider modulů. Tento přístup má však několik omezení.

  • Problém nesouladu verzí

    Certifikace FIPS 140 se uděluje pouze pro konkrétní verze. Chcete-li použít novější verzi modulu, je nutné znovu projít certifikačním procesem, a v jeho průběhu může dojít k nesouladu verzí mezi modulem používaným aplikací a certifikovaným modulem FIPS. Pokud je použita neschválená verze, dané prostředí již nelze považovat za prostředí certifikované podle FIPS.

  • Dynamické načítání a snížení výkonu

    Většina jazyků načítá moduly certifikované podle FIPS 140 jako dynamické knihovny. Tento způsob může při inicializaci a běhu způsobit snížení výkonu a případné problémy za běhu mohou přímo ovlivnit stabilitu celé aplikace.

  • Bezpečnostní zranitelnosti

    Jak bylo uvedeno výše, u architektur, které připojují externí moduly, jako je OpenSSL Provider, existuje riziko, že bezpečnostní zranitelnosti tohoto modulu přímo zasáhnou aplikaci. Komunikační vrstva mezi aplikací a externím modulem sama o sobě představuje další útočnou plochu a vyžaduje samostatnou bezpečnostní vrstvu k její ochraně. To zvyšuje složitost a může vést k neočekávaným zranitelnostem.

FIPS 140 a Golang

Z tohoto důvodu zvolil Golang odlišnou strategii. Go nezajišťuje certifikaci FIPS 140 prostřednictvím externích nástrojů, ale přímo podporuje režim FIPS v oficiální kryptografické knihovně. Vývojáři tak nemusejí instalovat ani konfigurovat žádný samostatný Provider a mohou používat standardní balíček crypto beze změn, stačí pouze aktivovat režim FIPS (GOFIPS=1). Tímto postupem je odstraněna komunikační hranice s externími moduly, což zvyšuje bezpečnost, a protože stačí distribuovat jeden staticky zkompilovaný binární soubor, je také provoz jednodušší.

FIPS 140-2 a Golang

Za tímto účelem Golang začlenil do runtime jazyka Go modul BoringCrypto, odvozený od BoringSSL, a získal tak certifikaci FIPS 140-2. BoringCrypto lze v určitých distribucích aktivovat od verze Go 1.19, a Go aplikace tak mohou vytvořit prostředí certifikované podle FIPS 140-2 bez dalších externích modulů.

BoringCrypto je však založen na OpenSSL, a proto stále závisí na jazyce C. Aplikace v Go tak nejsou sestavovány jako plně nezávislé binární soubory a bylo nutné distribuovat i potřebné knihovny v jazyce C.

FIPS 140-3 a Golang

Tým Go, aby tato omezení překonal, upravil stávající standardní kryptografickou knihovnu Go tak, aby odpovídala specifikaci FIPS 140-3. Tento upravený modul je od Go 1.21 k dispozici experimentálně a v současné době probíhá jeho certifikační posouzení podle FIPS 140-3 ze strany NIST.Seznam modulů v procesu posuzování NIST FIPS 140-3

To svědčí o vyspělosti kryptografické knihovny Go a umožňuje Go poskytovat certifikované prostředí FIPS 140-3 jako plně nezávislý jediný binární soubor.

Tým Go navíc nezůstal pouze u splnění standardu FIPS 140-3, ale bezpečnost dále posílil vlastními úpravami.

  • Fail Fast

    Režim FIPS v Go uplatňuje bezpečnostní model Fail Fast, takže při volání neschváleného algoritmu okamžitě ukončí běh pomocí panic. Na rozdíl od modelů založených na Provider v jiných jazycích, které ponechávají možnost fallbacku, tak poskytuje přísnější a jednoznačnější záruky z hlediska bezpečnosti a dodržování předpisů.

  • Hedged Signature

    Standard FIPS 140-3 pro podepisování pomocí ECDSA doporučuje metodu RFC6979. Go k ní navíc zavádí metodu Hedged, která účinněji brání útokům postranními kanály, k nimž může dojít během podepisování.

  • Posílený generátor náhodných čísel

    Generátor náhodných čísel v Go sice používá DRBG (Deterministic Random Bit Generator) v uživatelském prostoru, ale navíc do něj přidává entropii z operačního systému, a generuje tak kvalitní náhodná čísla nejen v uživatelském, ale i v jádru operačního systému. Tím dále posiluje bezpečnost generátoru náhodných čísel.