GoSuda

Structura implementărilor FIPS 140-2 și FIPS 140-3 din biblioteca criptografică standard Go

By Gosunuts views ...

FIPS 140 ( Federal Information Processing Standard Publication 140 )

FIPS 140 este un standard de certificare a securității pentru modulele criptografice, stabilit de către NIST din Statele Unite. Acest standard evaluează dacă un anumit modul criptografic sau o bibliotecă specifică îndeplinește cerințele de securitate definite de NIST. Prin urmare, trecerea certificării FIPS 140 înseamnă că modulul respectiv dispune de o securitate oficial de încredere și poate fi utilizat în domenii în care securitatea este esențială, cum ar fi finanțele, medicina și apărarea.

De la stabilirea sa inițială în 1994, FIPS 140 a fost revizuit în FIPS 140-2 în anul 2001 și în FIPS 140-3 în anul 2019. Până în prezent, multe sisteme și aplicații continuă să solicite certificarea FIPS 140-2 sau FIPS 140-3.

FIPS 140 și limbajele de programare

Din aceste motive, modulele criptografice certificate FIPS 140 sunt utilizate ca standard de facto în diverse limbaje și medii de programare. Printre exemplele reprezentative se numără OpenSSL, BoringSSL, LibreSSL și NSS, acestea fiind cele mai utilizate module în aplicațiile unde securitatea este critică.

Majoritatea modulelor certificate FIPS 140 sunt scrise în C sau C++. Din acest motiv, în limbaje precum PHP, Python și Javascript, în loc să se utilizeze direct aceste module, mediul FIPS este configurat prin intermediul unor module Provider externe. Totuși, această abordare prezintă anumite limitări.

  • Problema nepotrivirii versiunilor

    Certificarea FIPS 140 este acordată exclusiv pentru versiuni specifice. Prin urmare, utilizarea celei mai recente versiuni a unui modul necesită reluarea procesului de certificare, iar în acest proces pot apărea nepotriviri de versiune între modulul utilizat de aplicație și modulul certificat FIPS. Dacă se utilizează o versiune neautorizată, mediul respectiv nu va mai fi considerat un mediu certificat FIPS.

  • Încărcarea dinamică și scăderea performanței

    Majoritatea limbajelor încarcă și utilizează modulele certificate FIPS 140 sub formă de biblioteci dinamice. Această metodă poate provoca o scădere a performanței în timpul inițializării și execuției, existând totodată riscul ca o problemă survenită în timpul rulării să afecteze direct stabilitatea întregii aplicații.

  • Vulnerabilități de securitate

    Așa cum s-a menționat anterior, în arhitecturile care utilizează module externe, cum este cazul OpenSSL Provider, există riscul ca vulnerabilitățile de securitate ale respectivelor module să se propage direct în aplicație. De asemenea, însăși stratul de comunicație dintre aplicație și modulul extern devine o suprafață suplimentară de atac, fiind necesar un strat de securitate separat pentru protejarea acestuia. Aceasta sporește complexitatea și poate genera vulnerabilități neprevăzute.

FIPS 140 și Golang

Din acest motiv, Golang a adoptat o altă strategie. Go a ales o metodă prin care certificarea FIPS 140 este suportată direct în biblioteca sa criptografică oficială, fără a depinde de instrumente externe. Astfel, dezvoltatorii nu trebuie să instaleze sau să configureze un Provider separat, ci doar să activeze modul de certificare FIPS (GOFIPS=1) în timp ce utilizează pachetul standard crypto ca atare. În acest proces, granița de comunicație cu modulele externe este eliminată, ceea ce sporește securitatea, iar operațiunile sunt simplificate, deoarece trebuie distribuit doar un singur binar compilat static.

FIPS 140-2 și Golang

În acest scop, Golang a încorporat în runtime-ul Go modulul BoringCrypto, derivat din BoringSSL, obținând astfel certificarea FIPS 140-2. BoringCrypto poate fi activat în anumite distribuții începând cu versiunea Go 1.19, permițând aplicațiilor Go să configureze un mediu certificat FIPS 140-2 fără a necesita module externe suplimentare.

Totuși, deoarece BoringCrypto se bazează pe OpenSSL, dependența de limbajul C persistă în continuare. Prin urmare, aplicațiile Go nu sunt construite ca binare complet independente, existând constrângerea de a distribui bibliotecile C necesare împreună cu acestea.

FIPS 140-3 și Golang

Pentru a depăși aceste limitări, echipa Go a îmbunătățit biblioteca criptografică standard existentă din Go, astfel încât să respecte specificațiile FIPS 140-3. Acest modul îmbunătățit a început să fie oferit în mod experimental începând cu versiunea Go 1.21, iar evaluarea curentă pentru certificarea FIPS 140-3 din partea NIST este în curs de desfășurare.Lista modulelor aflate în proces de evaluare NIST FIPS 140-3

Acest lucru demonstrează maturitatea bibliotecii criptografice Go, permițând limbajului să ofere un mediu certificat FIPS 140-3 printr-un singur binar complet independent.

De asemenea, echipa Go nu s-a limitat doar la îndeplinirea standardului FIPS 140-3, ci a consolidat suplimentar securitatea prin mijloace proprii.

  • Fail Fast

    Modul FIPS din Go aplică modelul de securitate Fail Fast, întrerupând imediat execuția prin intermediul unui panic în cazul în care este apelat un algoritm necertificat. Spre deosebire de modelele bazate pe Provider din alte limbaje, care lasă posibilitatea unui fallback, această abordare oferă garanții mai stricte și mai clare din perspectiva securității și a conformității cu reglementările.

  • Hedged Signature

    Standardul FIPS 140-3 recomandă utilizarea metodei RFC6979 pentru semnăturile ECDSA. Cu toate acestea, Go introduce în plus metoda Hedged, contracarând mai ferm atacurile de tip canal lateral care pot apărea în timpul procesului de semnare.

  • Generator de numere aleatoare îmbunătățit

    Generatorul de numere aleatoare din Go utilizează un DRBG (Deterministic Random Bit Generator) în spațiul utilizator, injectând în același timp entropie suplimentară din kernelul sistemului de operare. Astfel, sunt generate numere aleatoare de înaltă calitate nu doar în spațiul utilizator, ci și în spațiul kernelului. Această metodă consolidează și mai mult securitatea generatorului de numere aleatoare.