GoSuda

FIPS 140-certificering og Golang

By Gosunuts
views ...

FIPS 140 (Federal Information Processing Standard Publication 140)

FIPS 140 er en sikkerhedscertificeringsstandard for kryptografiske moduler, som er fastsat af det amerikanske NIST. Denne standard vurderer, om et specifikt kryptografisk modul eller bibliotek opfylder de sikkerhedskrav, som NIST har defineret. At have bestået FIPS 140-certificeringen betyder derfor, at modulet har officielt pålidelig sikkerhed, og at det kan anvendes inden for områder, hvor sikkerhed er afgørende, såsom finans, sundhed og forsvar.

FIPS 140 blev oprindeligt etableret i 1994 og er siden blevet revideret til FIPS 140-2 i 2001 og FIPS 140-3 i 2019. Til dato kræver mange systemer og applikationer stadig FIPS 140-2- eller FIPS 140-3-certificering.

FIPS 140 og programmeringssprog

Af disse grunde anvendes FIPS 140-certificerede kryptografiske moduler som en de facto-standard i forskellige programmeringssprog og miljøer. Eksempler inkluderer OpenSSL, BoringSSL, LibreSSL og NSS, som er de mest udbredte moduler i sikkerhedskritiske applikationer.

De fleste FIPS 140-certificerede moduler er skrevet i C eller C++. Derfor konfigurerer sprog som PHP, Python og Javascript FIPS-miljøer ved at integrere disse moduler via eksterne Provider-moduler i stedet for at bruge dem direkte. Denne tilgang har dog visse begrænsninger.

  • Version incompatibility issue

    FIPS 140-certificering tildeles kun for specifikke versioner. Brug af den nyeste version af et modul kræver en ny certificeringsproces, hvilket kan medføre versioninkompatibilitet mellem det modul, applikationen bruger, og det FIPS-certificerede modul. Hvis en uautoriseret version anvendes, betragtes miljøet ikke længere som et FIPS-certificeret miljø.

  • Dynamic loading and performance degradation

    De fleste sprog indlæser FIPS 140-certificerede moduler som dynamiske biblioteker. Denne metode kan forårsage ydeevneforringelse under initialisering og udførelse og udgør en risiko for direkte at påvirke applikationens samlede stabilitet, hvis der opstår problemer under runtime.

  • Security vulnerabilities

    Som nævnt ovenfor, i en struktur, der integrerer eksterne moduler som OpenSSL Provider, er der en risiko for, at sikkerhedsbrister i disse moduler direkte spreder sig til applikationen. Desuden bliver kommunikationslaget mellem applikationen og de eksterne moduler i sig selv en yderligere angrebsoverflade, og et separat sikkerhedslag er nødvendigt for at beskytte dette. Dette øger kompleksiteten og kan føre til uventede sårbarheder.

FIPS 140 og Golang

Af disse grunde har Golang valgt en anden strategi. Go valgte at understøtte FIPS 140-certificering direkte i sit officielle kryptografiske bibliotek uden at være afhængig af eksterne værktøjer. Udviklere behøver derfor ikke at installere eller konfigurere en separat Provider; de skal blot aktivere FIPS-certificeret tilstand (GOFIPS=1) ved at bruge den standard crypto-pakke. Denne proces eliminerer kommunikationsgrænsen med eksterne moduler, hvilket forbedrer sikkerheden, og driften forenkles, da kun en statisk kompileret enkelt binær fil skal distribueres.

FIPS 140-2 og Golang

For at opnå dette har Golang indlejret BoringCrypto-modulet, der er afledt af BoringSSL, i Go runtime for at opnå FIPS 140-2-certificering. BoringCrypto kan aktiveres i specifikke distributioner siden Go 1.19, hvilket gør det muligt for Go-applikationer at oprette et FIPS 140-2-certificeret miljø uden eksterne moduler.

BoringCrypto er dog baseret på OpenSSL, og der er derfor stadig en afhængighed af C-sproget. Dette betød, at Go-applikationer ikke kunne bygges som fuldstændig uafhængige binære filer, og der var en begrænsning i, at de nødvendige C-biblioteker skulle distribueres sammen med applikationen.

FIPS 140-3 og Golang

Go-teamet har forbedret det eksisterende Go standard crypto-bibliotek for at imødekomme FIPS 140-3-specifikationerne for at overvinde disse begrænsninger. Dette forbedrede modul har været eksperimentelt tilgængeligt siden Go 1.21, og NISTs FIPS 140-3-certificeringsvurdering er i øjeblikket i gang.Liste over moduler under NIST FIPS 140-3 vurdering

Dette demonstrerer modenheden af Go’s kryptografiske bibliotek, og det har gjort det muligt for Go at levere et FIPS 140-3-certificeret miljø som en fuldstændig uafhængig enkelt binær fil.

Desuden har Go-teamet ikke blot opfyldt FIPS 140-3-standarden, men har også forbedret sikkerheden internt.

  • Fail Fast

    Go's FIPS-tilstand anvender Fail Fast-sikkerhedsmodellen, hvor et kald til en ikke-certificeret algoritme øjeblikkeligt afbryder udførelsen med en panic. I modsætning til andre sprogs Provider-baserede modeller, der efterlader mulighed for fallback, giver dette en strengere og klarere garanti for sikkerhed og overholdelse af regler.

  • Hedged Signature

    FIPS 140-3-standarden anbefaler RFC6979-metoden til ECDSA-signaturer. Go har dog ud over dette introduceret en Hedged-metode, der giver en stærkere beskyttelse mod side-channel-angreb, der kan opstå under signaturprocessen.

  • Enhanced random number generator

    Go's tilfældighedsgenerator bruger en user-space DRBG (Deterministic Random Bit Generator), men injicerer også yderligere entropi til operativsystemets kerne, hvilket genererer tilfældige tal af høj kvalitet ikke kun i user-space, men også i kernel-space. Dette styrker sikkerheden af tilfældighedsgeneratoren yderligere.