Certifikace FIPS 140 a Golang
FIPS 140 ( Federal Information Processing Standard Publication 140 )
FIPS 140 je standard pro certifikaci bezpečnosti kryptografických modulů stanovený americkým NIST. Tento standard hodnotí, zda konkrétní kryptografický modul nebo knihovna splňuje bezpečnostní požadavky definované agenturou NIST. Úspěšné projití certifikací FIPS 140 tedy znamená, že daný modul disponuje formálně ověřenou spolehlivostí zabezpečení, a umožňuje jeho nasazení v oblastech s kritickou bezpečností, jako jsou finance, zdravotnictví nebo obrana.
Od prvotního zavedení FIPS 140 v roce 1994 byl standard revidován na FIPS 140-2 v roce 2001 a následně na FIPS 140-3 v roce 2019. Dodnes mnoho systémů a aplikací vyžaduje certifikaci FIPS 140-2 nebo FIPS 140-3.
FIPS 140 a programovací jazyky
Z těchto důvodů jsou kryptografické moduly certifikované dle FIPS 140 používány jako de facto standard v mnoha programovacích jazycích a prostředích. Mezi reprezentativní příklady patří OpenSSL, BoringSSL, LibreSSL a NSS, které představují nejrozšířeněji využívané moduly v aplikacích s vysokými nároky na bezpečnost.
Většina modulů certifikovaných dle FIPS 140 je implementována v jazyce C nebo C++. Proto jazyky jako PHP, Python či Javascript konfigurují prostředí FIPS spíše prostřednictvím integrace s externími moduly Provider, než aby tyto moduly využívaly přímo. Nicméně tento přístup s sebou nese několik limitací.
Problém nesouladu verzí
Certifikace FIPS 140 je vydávána pouze pro specifické verze. Použití nejnovější verze modulu proto vyžaduje opětovné absolvování certifikačního procesu, přičemž během této iterace může dojít k nesouladu verzí mezi modulem používaným aplikací a modulem certifikovaným FIPS. Používání neschválené verze způsobí, že dané prostředí již nebude považováno za prostředí certifikované dle FIPS.
Dynamické načítání a snížení výkonu
Většina jazyků načítá certifikované FIPS 140 moduly ve formě dynamických knihoven. Tento mechanismus může způsobit snížení výkonu během inicializace a spuštění, a v případě vzniku problému za běhu existuje riziko přímého dopadu na celkovou stabilitu aplikace.
Bezpečnostní zranitelnosti
Jak bylo uvedeno výše, u struktur integrujících externí moduly, jako je OpenSSL Provider, existuje riziko přímého přenosu bezpečnostních zranitelností daného modulu do aplikace. Kromě toho se komunikační vrstva mezi aplikací a externím modulem stává dodatečnou útočnou plochou, což vyžaduje zavedení samostatné bezpečnostní vrstvy k její ochraně. To zvyšuje komplexitu a může vést ke vzniku neočekávaných zranitelností.
FIPS 140 a Golang
Z těchto důvodů zaujal Golang odlišnou strategii. Go se rozhodl pro přístup, kdy certifikaci FIPS 140 přímo podporuje jeho oficiální kryptografická knihovna, aniž by závisel na externích nástrojích. Vývojáři tak mohou aktivovat režim certifikace FIPS (GOFIPS=1) pouhým použitím standardního balíčku crypto
, aniž by museli instalovat či konfigurovat samostatný Provider. Tento postup odstraňuje komunikační hranice s externími moduly, čímž posiluje bezpečnost, a zjednodušuje provoz, jelikož je nutné distribuovat pouze jeden staticky zkompilovaný binární soubor.
FIPS 140-2 a Golang
Za tímto účelem Golang získal certifikaci FIPS 140-2 implementací modulu BoringCrypto, který je odvozen z BoringSSL, přímo do běhového prostředí Go (Go runtime). BoringCrypto je aktivovatelný v určitých distribucích od verze Go 1.19, což umožňuje Go aplikacím vytvořit prostředí certifikované dle FIPS 140-2 bez nutnosti použití externích modulů.
Nicméně, jelikož je BoringCrypto založen na OpenSSL, stále existuje závislost na jazyce C. Z toho důvodu se Go aplikace kompletně nezkompilovaly jako nezávislé binární soubory, ale bylo nutné s nimi distribuovat i potřebné C knihovny, což představovalo omezení.
FIPS 140-3 a Golang
Tým Go k překonání těchto limitů provedl vylepšení stávající standardní kryptografické knihovny Go tak, aby odpovídala specifikaci FIPS 140-3. Tento vylepšený modul je experimentálně dostupný od verze Go 1.21 a v současné době probíhá jeho certifikační posouzení dle FIPS 140-3 ze strany NIST.Seznam modulů ve fázi posuzování FIPS 140-3 u NIST
To demonstruje vyspělost kryptografické knihovny Go a umožňuje Go poskytovat prostředí certifikované dle FIPS 140-3 jako zcela nezávislý, jediný binární soubor.
Tým Go navíc neomezil svou činnost pouze na splnění standardu FIPS 140-3, ale samostatně posílil i vlastní bezpečnostní aspekty.
Fail Fast
Režim FIPS v Go aplikuje bezpečnostní model Fail Fast, který při volání necertifikovaných algoritmů okamžitě ukončí provádění pomocí paniky (
panic
). To na rozdíl od providerem založených modelů jiných jazyků, které ponechávají možnost návratu k záložnímu řešení (fallback), poskytuje přísnější a jednoznačnější záruky z hlediska bezpečnosti a regulatorní shody.Hedged Signature
Standard FIPS 140-3 doporučuje pro digitální podpisy ECDSA použití metody RFC6979. Go však nad rámec tohoto standardu zavádí metodu Hedged Signature, která poskytuje robustnější obranu proti útokům postranními kanály, jež se mohou vyskytnout během procesu podepisování.
Vylepšený generátor náhodných čísel
Generátor náhodných čísel v Go využívá DRBG (Deterministic Random Bit Generator) v uživatelském prostoru, přičemž navíc injektuje entropii z jádra operačního systému, čímž zajišťuje generování vysoce kvalitních náhodných čísel nejen v uživatelském prostoru, ale i v prostoru jádra. Tímto způsobem se dále zvyšuje bezpečnost generátoru náhodných čísel.