GoSuda

FIPS 140 Validation și Golang

By Gosunuts
views ...

FIPS 140 ( Federal Information Processing Standard Publication 140 )

FIPS 140 este un standard de certificare a securității modulelor criptografice, stabilit de NIST din SUA. Acest standard evaluează dacă un anumit modul sau o bibliotecă criptografică îndeplinește cerințele de securitate definite de NIST. Prin urmare, faptul că un modul a trecut certificarea FIPS 140 înseamnă că modulul respectiv are o securitate oficială de încredere și poate fi utilizat în domenii critice pentru securitate, cum ar fi finanțe, sănătate și apărare.

FIPS 140 a fost stabilit inițial în 1994, ulterior fiind revizuit ca FIPS 140-2 în 2001 și FIPS 140-3 în 2019. Până în prezent, multe sisteme și aplicații necesită certificare FIPS 140-2 sau FIPS 140-3.

FIPS 140 și limbajele de programare

Din aceste motive, modulele criptografice certificate FIPS 140 sunt utilizate ca un standard de facto în diverse limbaje de programare și medii. Exemple reprezentative includ OpenSSL, BoringSSL, LibreSSL, NSS, care sunt cele mai utilizate module în aplicații critice pentru securitate.

Majoritatea modulelor certificate FIPS 140 sunt scrise în C sau C++. Din acest motiv, limbaje precum PHP, Python, Javascript configurează mediul FIPS prin integrarea acestor module prin intermediul modulelor Provider externe, în loc să le utilizeze direct. Cu toate acestea, această abordare prezintă câteva limitări.

  • Problema neconcordanței versiunilor

    Certificarea FIPS 140 este acordată numai pentru o anumită versiune. Prin urmare, pentru a utiliza cea mai recentă versiune a modulului, este necesar să se parcurgă din nou procesul de certificare, iar în acest proces poate apărea o neconcordanță 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ărcare dinamică și degradare a performanței

    Majoritatea limbajelor utilizează modulele certificate FIPS 140 prin încărcarea lor ca biblioteci dinamice. Această metodă poate cauza o degradare a performanței în timpul inițializării și execuției și există riscul de a afecta direct stabilitatea întregii aplicații în cazul apariției unor probleme în timpul rulării.

  • Vulnerabilități de securitate

    Așa cum am menționat mai sus, într-o structură care integrează module externe, cum ar fi OpenSSL Provider, există riscul ca vulnerabilitățile de securitate ale modulului respectiv să se propage direct în aplicație. În plus, stratul de comunicare dintre aplicație și modulul extern devine o suprafață de atac suplimentară, necesitând un strat de securitate separat pentru a o proteja. Acest lucru crește complexitatea și poate duce la vulnerabilități neașteptate.

FIPS 140 și Golang

Din aceste motive, Golang a adoptat o altă strategie. Go a ales să suporte direct certificarea FIPS 140 prin biblioteca criptografică oficială, fără a depinde de instrumente externe. Prin urmare, dezvoltatorii nu trebuie să instaleze sau să configureze un Provider separat; ei pot utiliza pur și simplu pachetul standard crypto și pot activa modul certificat FIPS (GOFIPS=1). Acest proces elimină granițele de comunicare cu modulele externe, sporind securitatea, iar operațiunile sunt simplificate, deoarece este necesară doar distribuirea unui singur binar compilat static.

FIPS 140-2 și Golang

Pentru aceasta, Golang a obținut certificarea FIPS 140-2 prin încorporarea modulului BoringCrypto, derivat din BoringSSL, în runtime-ul Go. 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 separate.

Cu toate acestea, deoarece BoringCrypto se bazează pe OpenSSL, există încă o dependență de limbajul C. Prin urmare, aplicațiile Go nu sunt construite ca binare complet independente, existând restricția de a distribui și bibliotecile C necesare.

FIPS 140-3 și Golang

Echipa Go a îmbunătățit biblioteca standard Go crypto existentă pentru a se conforma specificațiilor FIPS 140-3, în scopul depășirii acestor limitări. Acest modul îmbunătățit a fost disponibil experimental începând cu versiunea Go 1.21, iar în prezent este în curs de evaluare pentru certificarea NIST FIPS 140-3.Lista modulelor în curs de evaluare NIST FIPS 140-3

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

În plus, echipa Go nu s-a limitat doar la îndeplinirea standardului FIPS 140-3, ci și-a consolidat propria securitate.

  • Fail Fast

    Modul FIPS al Go aplică modelul de securitate Fail Fast, care întrerupe imediat execuția cu un panic la apelarea unui algoritm neautorizat. Spre deosebire de modelele bazate pe Provider din alte limbaje, care lasă posibilitatea de fallback, acest lucru oferă o garanție mai strictă și mai clară în ceea ce privește securitatea și conformitatea.

  • Hedged Signature

    Standardul FIPS 140-3 recomandă metoda RFC6979 pentru semnăturile ECDSA. Cu toate acestea, Go a introdus în plus metoda Hedged pentru a gestiona mai robust atacurile de tip side-channel care pot apărea în timpul procesului de semnare.

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

    Generatorul de numere aleatoare al Go utilizează un DRBG (Deterministic Random Bit Generator) în spațiul utilizatorului, injectând în același timp entropie suplimentară în kernel-ul sistemului de operare, generând astfel numere aleatoare de înaltă calitate nu numai în spațiul utilizatorului, ci și în spațiul kernel-ului. Acest lucru consolidează și mai mult securitatea generatorului de numere aleatoare.