GoSuda

Certificação FIPS 140 e Golang

By Gosunuts
views ...

FIPS 140 ( Federal Information Processing Standard Publication 140 )

FIPS 140 é um padrão de certificação de segurança de módulos criptográficos estabelecido pelo NIST dos EUA. Este padrão avalia se um determinado módulo ou biblioteca criptográfica atende aos requisitos de segurança definidos pelo NIST. Portanto, ter a certificação FIPS 140 significa que o módulo possui segurança oficialmente confiável e pode ser utilizado em áreas onde a segurança é crítica, como finanças, saúde e defesa.

O FIPS 140, após sua primeira promulgação em 1994, foi revisado para FIPS 140-2 em 2001 e para FIPS 140-3 em 2019. Até hoje, muitos sistemas e aplicativos exigem certificação FIPS 140-2 ou FIPS 140-3.

FIPS 140 e Linguagens de Programação

Por essas razões, os módulos criptográficos certificados FIPS 140 são usados como um padrão de fato em várias linguagens de programação e ambientes. Exemplos incluem OpenSSL, BoringSSL, LibreSSL, NSS, entre outros, que são os módulos mais amplamente utilizados em aplicativos onde a segurança é crucial.

A maioria dos módulos certificados FIPS 140 são escritos em C ou C++. Por isso, linguagens como PHP, Python, Javascript, em vez de usar esses módulos diretamente, configuram o ambiente FIPS por meio da interconexão com módulos Provider externos. No entanto, essa abordagem apresenta algumas limitações.

  • Problema de Incompatibilidade de Versão

    A certificação FIPS 140 é concedida apenas para uma versão específica. Portanto, para usar a versão mais recente do módulo, é necessário passar novamente pelo processo de certificação, o que pode causar uma incompatibilidade de versão entre o módulo usado pelo aplicativo e o módulo certificado FIPS. Se uma versão não autorizada for usada, o ambiente não será mais considerado um ambiente certificado FIPS.

  • Carregamento Dinâmico e Degradação de Desempenho

    A maioria das linguagens carrega e usa módulos certificados FIPS 140 como bibliotecas dinâmicas. Esse método pode causar degradação de desempenho durante a inicialização e execução, e, em caso de problemas durante o tempo de execução, há o risco de afetar diretamente a estabilidade geral do aplicativo.

  • Vulnerabilidades de Segurança

    Conforme mencionado acima, em uma arquitetura que interconecta módulos externos, como o OpenSSL Provider, há o risco de que as vulnerabilidades de segurança desses módulos se propaguem diretamente para o aplicativo. Além disso, a própria camada de comunicação entre o aplicativo e os módulos externos se torna uma superfície de ataque adicional, exigindo uma camada de segurança separada para protegê-la. Isso aumenta a complexidade e pode levar a vulnerabilidades inesperadas.

FIPS 140 e Golang

Por essas razões, o Golang adotou uma estratégia diferente. Go optou por não depender de ferramentas externas para a certificação FIPS 140, mas sim por suportá-la diretamente em sua biblioteca criptográfica oficial. Assim, os desenvolvedores não precisam instalar ou configurar um Provider separado; basta ativar o modo certificado FIPS (GOFIPS=1) usando o pacote crypto padrão. Esse processo elimina as fronteiras de comunicação com módulos externos, aumentando a segurança, e simplifica a operação, pois apenas um único binário estaticamente compilado precisa ser distribuído.

FIPS 140-2 e Golang

Para isso, o Golang incorporou o módulo BoringCrypto, derivado do BoringSSL, no runtime do Go, obtendo a certificação FIPS 140-2. O BoringCrypto pode ser ativado em distribuições específicas do Go a partir da versão 1.19, permitindo que os aplicativos Go configurem um ambiente certificado FIPS 140-2 sem a necessidade de módulos externos adicionais.

No entanto, como o BoringCrypto é baseado em OpenSSL, ainda existe uma dependência da linguagem C. Consequentemente, os aplicativos Go não são construídos como binários completamente independentes, havendo a restrição de que as bibliotecas C necessárias precisam ser distribuídas junto.

FIPS 140-3 e Golang

A equipe do Go, para superar essas limitações, aprimorou a biblioteca criptográfica padrão do Go para atender às especificações FIPS 140-3. Este módulo aprimorado começou a ser fornecido experimentalmente a partir da versão Go 1.21, e atualmente está em processo de avaliação de certificação FIPS 140-3 pelo NIST.Lista de módulos em processo de avaliação FIPS 140-3 do NIST

Isso demonstra a maturidade da biblioteca criptográfica do Go, permitindo que o Go forneça um ambiente certificado FIPS 140-3 com um único binário completamente independente.

Além disso, a equipe do Go não se limitou a apenas satisfazer o padrão FIPS 140-3, mas também aprimorou sua própria segurança.

  • Fail Fast

    O modo FIPS do Go aplica o modelo de segurança Fail Fast, interrompendo imediatamente a execução com um panic se um algoritmo não certificado for chamado. Isso, ao contrário dos modelos baseados em Provider de outras linguagens que deixam a possibilidade de fallback, oferece uma garantia mais rigorosa e clara em termos de segurança e conformidade regulatória.

  • Hedged Signature

    O padrão FIPS 140-3 recomenda o método RFC6979 para assinaturas ECDSA. No entanto, o Go, além disso, introduziu o método Hedged para responder de forma mais robusta a ataques de canal lateral que podem ocorrer durante o processo de assinatura.

  • Gerador de Números Aleatórios Aprimorado

    O gerador de números aleatórios do Go usa um DRBG (Deterministic Random Bit Generator) no espaço do usuário, mas também injeta entropia adicional no kernel do sistema operacional, gerando números aleatórios de alta qualidade não apenas no espaço do usuário, mas também no espaço do kernel. Isso reforça ainda mais a segurança do gerador de números aleatórios.