A vulnerabilidade G110 (CWE-409) em Go (Golang) indica uma potencial vulnerabilidade de negação de serviço (DoS) através de uma "bomba de descompressão". Isso ocorre quando um programa descompacta um arquivo comprimido que é projetado para consumir uma quantidade excessiva de recursos do sistema, como CPU ou memória, podendo levar à interrupção do serviço.
CWE-409: Vulnerabilidade de Bomba de Descompressão
CWE-409 refere-se à manipulação inadequada de dados compactados, onde a descompressão de certos dados pode resultar em um consumo de recursos muito maior do que o esperado. Esse tipo de ataque é conhecido como "bomba de descompressão".
Entendendo a Severidade e a Confiança
- Confiança: Média: O sistema automatizado ou o auditor humano que identificou essa vulnerabilidade tem uma confiança moderada de que essa vulnerabilidade existe.
- Severidade: Média: Se explorada, a vulnerabilidade pode causar interrupções notáveis no serviço, mas não leva necessariamente a um comprometimento completo do sistema ou a um grande vazamento de dados.
Exemplo de Código Vulnerável
Aqui está um exemplo em Go que demonstra como uma vulnerabilidade de bomba de descompressão pode ocorrer:
package main
import (
"compress/gzip"
"io/ioutil"
"log"
"os"
)
func main() {
file, err := os.Open("bomba.gz")
if err != nil {
log.Fatal(err)
}
defer file.Close()
reader, err := gzip.NewReader(file)
if err != nil {
log.Fatal(err)
}
defer reader.Close()
_, err = ioutil.ReadAll(reader)
if err != nil {
log.Fatal(err)
}
log.Println("Arquivo descompactado com sucesso")
}
Neste exemplo, a função ioutil.ReadAll(reader)
lê todo o conteúdo descompactado para a memória. Se o arquivo comprimido for uma bomba de descompressão, ele pode consumir muita memória e causar uma DoS.
Mitigações
-
Limitar o Tamanho dos Dados Descompactados: Estabeleça um limite razoável para o tamanho dos dados descompactados. Isso pode evitar que um arquivo compactado malicioso consuma recursos excessivos.
-
Monitorar o Consumo de Recursos: Implementar mecanismos para monitorar o uso de memória e CPU e tomar ações apropriadas se forem detectados consumos anormais.
-
Validar Arquivos Antes da Descompressão: Verifique a estrutura e o conteúdo dos arquivos antes de descompactá-los. Isso pode incluir verificar cabeçalhos ou metadados para assegurar que os dados estão conforme o esperado.
Exemplo de Mitigação
Aqui está uma versão aprimorada do exemplo anterior com uma limitação no tamanho dos dados descompactados:
package main
import (
"compress/gzip"
"io"
"log"
"os"
)
func main() {
file, err := os.Open("bomba.gz")
if err != nil {
log.Fatal(err)
}
defer file.Close()
reader, err := gzip.NewReader(file)
if err != nil {
log.Fatal(err)
}
defer reader.Close()
limitedReader := io.LimitReader(reader, 10*1024*1024) // Limite de 10MB
_, err = ioutil.ReadAll(limitedReader)
if err != nil {
log.Fatal(err)
}
log.Println("Arquivo descompactado com sucesso")
}
Neste exemplo, io.LimitReader
é usado para limitar a quantidade de dados que podem ser lidos a partir do leitor de descompressão para 10MB, mitigando o risco de uma bomba de descompressão.
Se precisar de mais detalhes ou ajuda sobre como lidar com esta vulnerabilidade específica, fique à vontade para perguntar!