GoSec: CWE-409: Vulnerabilidade de Bomba de Descompressão

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

  1. 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.

  2. 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.

  3. 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!

Comece hoje mesmo com a Sociap

Dê o próximo passo na evolução de sua Tech Stack

Saiba Mais
whatsapp