GoSuda

Štruktúra implementácií FIPS 140-2 a FIPS 140-3 v štandardnej kryptografickej knižnici jazyka Go

By Gosunuts views ...

FIPS 140 (Federal Information Processing Standard Publication 140)

FIPS 140 je norma na certifikáciu bezpečnosti kryptografických modulov, ktorú vypracoval americký NIST. Táto norma hodnotí, či konkrétny kryptografický modul alebo knižnica spĺňa bezpečnostné požiadavky definované NIST. Preto absolvovanie certifikácie FIPS 140 znamená, že daný modul má oficiálne overenú dôveryhodnú bezpečnosť a môže sa používať v oblastiach, kde je bezpečnosť kritická, ako sú financie, zdravotníctvo či obrana.

Od prvého vydania normy FIPS 140 v roku 1994 bola norma v roku 2001 revidovaná na FIPS 140-2 a v roku 2019 na FIPS 140-3. Mnohé systémy a aplikácie aj dnes vyžadujú certifikáciu FIPS 140-2 alebo FIPS 140-3.

FIPS 140 a programovacie jazyky

Z tohto dôvodu sa kryptografické moduly certifikované podľa FIPS 140 používajú v mnohých programovacích jazykoch a prostrediach ako de facto štandard. Medzi reprezentatívne patria OpenSSL, BoringSSL, LibreSSL a NSS, ktoré sú najrozšírenejšími modulmi v aplikáciách, kde je bezpečnosť kľúčová.

Väčšina kryptografických modulov certifikovaných podľa FIPS 140 je napísaná v jazyku C alebo C++. Preto jazyky ako PHP, Python alebo JavaScript zvyčajne tieto moduly nepoužívajú priamo, ale vytvárajú FIPS prostredie prostredníctvom externých modulov typu Provider. Tento prístup however má niekoľko obmedzení.

  • Problém nesúladu verzií

    Certifikácia FIPS 140 sa udeľuje iba pre konkrétne verzie. Ak sa má použiť novšia verzia modulu, je potrebné znovu absolvovať certifikačný proces, pričom môže dôjsť k nesúladu verzií medzi aplikáciou a certifikovaným modulom FIPS. Ak sa použije neschválená verzia, prostredie už nebude považované za prostredie certifikované podľa FIPS.

  • Dynamické načítavanie a pokles výkonu

    Väčšina jazykov načítava moduly certifikované podľa FIPS 140 ako dynamické knižnice. Tento spôsob môže spôsobiť zníženie výkonu počas inicializácie a vykonávania a ak nastane problém počas behu, môže priamo ovplyvniť stabilitu celej aplikácie.

  • Bezpečnostné zraniteľnosti

    Ako bolo uvedené vyššie, pri štruktúrach, ktoré integrujú externé moduly, ako je OpenSSL Provider, existuje riziko, že bezpečnostné zraniteľnosti daného modulu sa priamo prenesú do aplikácie. Komunikačná vrstva medzi aplikáciou a externým modulom navyše sama predstavuje ďalšiu útočnú plochu a na jej ochranu sú potrebné samostatné bezpečnostné vrstvy. To zvyšuje zložitosť a môže viesť k neočakávaným zraniteľnostiam.

FIPS 140 a Golang

Z tohto dôvodu zvolil Golang iný prístup. Go nespolieha na externé nástroje pri zabezpečení certifikácie FIPS 140, ale podporuje ju priamo v oficiálnej kryptografickej knižnici. Vývojári preto nemusia inštalovať ani konfigurovať žiadne samostatné Provider moduly a môžu používať štandardný balík crypto, pričom stačí aktivovať režim FIPS 140 (GOFIPS=1). Týmto spôsobom sa odstráni komunikačná hranica voči externým modulom, čím sa zvyšuje bezpečnosť, a keďže sa distribuuje iba staticky skompilovaný jednotlivý binárny súbor, zjednodušuje sa aj prevádzka.

FIPS 140-2 a Golang

Na tento účel Golang integroval modul BoringCrypto, odvodený z BoringSSL, priamo do runtime jazyka Go a získal certifikáciu FIPS 140-2. BoringCrypto je možné aktivovať v určitých distribúciách od verzie Go 1.19, a aplikácie v Go tak môžu vytvoriť prostredie certifikované podľa FIPS 140-2 bez použitia externých modulov.

BoringCrypto je však založený na OpenSSL, a preto stále existuje závislosť od jazyka C. Aplikácie v Go preto nie sú plne nezávislé binárne súbory a bolo potrebné distribuovať aj potrebné knižnice jazyka C, čo predstavovalo obmedzenie.

FIPS 140-3 a Golang

Tím Go, aby prekonal toto obmedzenie, upravil štandardnú kryptografickú knižnicu Go tak, aby zodpovedala norme FIPS 140-3. Tento upravený modul bol od verzie Go 1.21 sprístupnený experimentálne a v súčasnosti prebieha posudzovanie certifikácie FIPS 140-3 zo strany NIST.Zoznam modulov v procese posudzovania NIST FIPS 140-3

To odráža vyspelosť kryptografickej knižnice Go a vďaka tomu Go môže poskytovať prostredie certifikované podľa FIPS 140-3 v podobe plne nezávislého jednotlivého binárneho súboru.

Tím Go navyše nezostal iba pri splnení normy FIPS 140-3, ale samostatne posilnil bezpečnosť.

  • Fail Fast

    Režim FIPS v Go uplatňuje bezpečnostný model Fail Fast, ktorý pri volaní neschváleného algoritmu okamžite ukončí vykonávanie pomocou panic. Na rozdiel od modelov založených na Provider v iných jazykoch, ktoré ponechávajú možnosť fallback, tak poskytuje prísnejšiu a jednoznačnejšiu záruku z hľadiska bezpečnosti a súladu s predpismi.

  • Hedged Signature

    Norma FIPS 140-3 odporúča pri podpisovaní ECDSA metódu RFC6979. Go však k tomu pridáva metódu Hedged, ktorá účinnejšie čelí útokom postranným kanálom, ktoré môžu vzniknúť počas procesu podpisovania.

  • Posilnený generátor náhodných čísel

    Generátor náhodných čísel v Go využíva DRBG (Deterministic Random Bit Generator) v používateľskom priestore, pričom dodatočne vkladá entropiu z operačného systémového jadra, vďaka čomu generuje kvalitné náhodné čísla nielen v používateľskom priestore, ale aj v priestore jadra. Týmto spôsobom sa ďalej posilňuje bezpečnosť generátora náhodných čísel.