Páginas

terça-feira, 16 de junho de 2026

Ruby e Segurança: Guia Definitivo para Proteger seu Net::IMAP contra Ataques MITM e Injeção de Comandos

 



 Aprenda como verificar, corrigir e mitigar vulnerabilidades críticas no Net::IMAP do Ruby (CVE-2026-42246 e CVE-2026-42257). Guia completo com comandos, scripts e medidas alternativas para administradores Ubuntu.



O Que Você Precisa Saber Sobre Segurança no Net::IMAP


A biblioteca Net::IMAP do Ruby é amplamente utilizada para conectar aplicações a servidores de e-mail e outros serviços que utilizam o protocolo IMAP. Assim como qualquer componente crítico de infraestrutura, ela precisa ser mantida atualizada e configurada corretamente.


Recentemente, duas vulnerabilidades foram identificadas em versões antigas do net-imap:

  • CVE-2026-42246 — Um atacante em posição de intermediário (MITM) pode fazer com que o método Net::IMAP#starttls retorne "sucesso" sem que a conexão TLS seja realmente estabelecida. Isso significa que todos os dados trafegados entre sua aplicação e o servidor IMAP podem ser lidos e modificados por terceiros.

  • CVE-2026-42257 — Diversos comandos do Net::IMAP aceitam argumentos raw (brutos) que são enviados ao servidor sem validação ou escape. Se esses argumentos forem originados de entrada do usuário, um atacante pode injetar comandos IMAP arbitrários usando sequências CRLF.

Ambas as vulnerabilidades foram corrigidas nas versões 0.3.10, 0.4.24, 0.5.14 e 0.6.4 do net-imap.


Como Verificar se Você Está Vulnerável


1. Verifique a versão do Ruby instalada

Abra um terminal e execute:

bash
ruby -v

O output será algo como:

text
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux-gnu]

Verifique a versão da gem net-imap

Exemplo de output:

text
*** LOCAL GEMS ***

net-imap (0.3.9, 0.2.3)

Se a versão for anterior a 0.3.10, 0.4.24, 0.5.14 ou 0.6.4, sua aplicação está vulnerável.

Verifique os pacotes do sistema (Ubuntu)

Para sistemas Ubuntu 18.04 LTS e 16.04 LTS, verifique se os pacotes corrigidos estão instalados:

bash
dpkg -l | grep ruby

As versões corrigidas para cada release são:


Atenção: As versões corrigidas para Ubuntu estão disponíveis apenas com Ubuntu Pro.

Script de Automação para Aplicar a Correção




Este script Bash verifica a versão do net-imap e, se necessário, atualiza a gem ou os pacotes do sistema.
bash
#!/bin/bash
# Ruby Net::IMAP Security Fix Script
# Compatible with Ubuntu Linux distributions

set -e

echo "=== Ruby Net::IMAP Security Check ==="

# Check Ruby version
RUBY_VERSION=$(ruby -v 2>/dev/null | cut -d' ' -f2 || echo "not found")
echo "Ruby version: $RUBY_VERSION"

# Check net-imap gem version
GEM_VERSION=$(gem list net-imap 2>/dev/null | grep -oP '(?<=net-imap \()\d+\.\d+\.\d+' | head -1 || echo "not installed")

echo "net-imap gem version: $GEM_VERSION"

# Define fixed versions
FIXED_VERSIONS=("0.3.10" "0.4.24" "0.5.14" "0.6.4")

is_fixed() {
    local current="$1"
    for fixed in "${FIXED_VERSIONS[@]}"; do
        if [[ "$current" == "$fixed" ]]; then
            return 0
        fi
    done
    # Check if version is greater than any fixed version
    if [[ -n "$current" ]]; then
        local major=$(echo "$current" | cut -d. -f1)
        local minor=$(echo "$current" | cut -d. -f2)
        local patch=$(echo "$current" | cut -d. -f3)
        for fixed in "${FIXED_VERSIONS[@]}"; do
            local fmajor=$(echo "$fixed" | cut -d. -f1)
            local fminor=$(echo "$fixed" | cut -d. -f2)
            local fpatch=$(echo "$fixed" | cut -d. -f3)
            if [[ "$major" -gt "$fmajor" ]] || [[ "$major" -eq "$fmajor" && "$minor" -gt "$fminor" ]] || [[ "$major" -eq "$fmajor" && "$minor" -eq "$fminor" && "$patch" -ge "$fpatch" ]]; then
                return 0
            fi
        done
    fi
    return 1
}

# Determine if we need to update
if [[ "$GEM_VERSION" == "not installed" ]]; then
    echo "WARNING: net-imap gem not found. Installing latest version..."
    gem install net-imap
elif is_fixed "$GEM_VERSION"; then
    echo "SUCCESS: net-imap $GEM_VERSION is not vulnerable."
else
    echo "VULNERABLE: net-imap $GEM_VERSION needs to be updated."
    echo "Updating net-imap gem..."
    gem update net-imap
fi

# System package update for Ubuntu
if command -v apt &> /dev/null; then
    echo "Checking for Ubuntu system updates..."
    sudo apt update
    sudo apt upgrade -y ruby2.5 ruby2.3 libruby2.5 libruby2.3 2>/dev/null || echo "No system Ruby packages to update."
fi

echo "=== Verification complete ==="
echo "Final net-imap version: $(gem list net-imap | grep -oP '(?<=net-imap \()\d+\.\d+\.\d+' | head -1)"


📗  Recomendação de Leitura



Segurança em servidores Linux: Ataque e Defesa  (anúncio) ->  https://amzn.to/4fNAQlV


Se você prefere estudar em português e quer aprender a "pensar como um hacker" para se antecipar a invasões, essa é a pedida! O livro ensina a usar as ferramentas prediletas dos invasores (como Nmap e Netcat) a seu favor, blindando seus sistemas.


Eu ganho uma comissão quando você faz uma compra.


Para usar o script:

bash
chmod +x fix_ruby_imap.sh
./fix_ruby_imap.sh

Mitigação Alternativa (Caso Não Possa Atualizar Agora)


Se você não pode atualizar a gem ou os pacotes do sistema imediatamente, aqui estão medidas de mitigação:

1. Verifique explicitamente se o TLS foi estabelecido

Em vez de confiar apenas no retorno de starttls, verifique se a conexão está realmente segura:

ruby
require 'net/imap'

imap = Net::IMAP.new('seu-servidor-imap', port: 143)
imap.starttls

# VERIFICAÇÃO CRÍTICA: confirme se o TLS está ativo
unless imap.tls_verified?
  raise "STARTTLS falhou - conexão NÃO está segura!"
end

# Continua apenas se tls_verified? retornar true

A vulnerabilidade CVE-2026-42246 permite que starttls retorne sucesso sem TLS ativo. A verificação explícita com tls_verified? é sua última linha de defesa.

Restrinja o tráfego de rede com iptables

Se sua aplicação se conecta a um servidor IMAP específico, restrinja o tráfego a esse destino:

bash
# Permite apenas conexões com o servidor IMAP confiável
sudo iptables -A OUTPUT -p tcp -d SEU_SERVIDOR_IMAP --dport 143 -j ACCEPT
sudo iptables -A OUTPUT -p tcp --dport 143 -j DROP

# Para conexões TLS diretas (porta 993)
sudo iptables -A OUTPUT -p tcp -d SEU_SERVIDOR_IMAP --dport 993 -j ACCEPT
sudo iptables -A OUTPUT -p tcp --dport 993 -j DROP

Use AppArmor para restringir o processo Ruby

Crie um perfil AppArmor para sua aplicação Ruby, limitando quais portas e endereços ela pode acessar.

Valide e sanitize entradas do usuário

Para CVE-2026-42257, nunca passe dados não sanitizados diretamente para comandos IMAP que aceitam argumentos raw:

ruby
# ERRADO: entrada do usuário passada diretamente
imap.search(['FROM', params[:email]])  # Perigo: CRLF injection

# CORRETO: sanitize ou use APIs seguras
sanitized_email = params[:email].gsub(/[\r\n]/, '')
imap.search(['FROM', sanitized_email])


Conclusão

As vulnerabilidades no Net::IMAP (CVE-2026-42246 e CVE-2026-42257) são sérias, mas completamente evitáveis com as práticas corretas:

  1. Atualize para as versões corrigidas (0.3.10, 0.4.24, 0.5.14 ou 0.6.4).

  2. Verifique explicitamente tls_verified? após starttls.

  3. Sanitize todas as entradas do usuário antes de usá-las em comandos IMAP.

  4.Monitore regularmente as versões das gems e pacotes do sistema.

A segurança de uma aplicação não é um destino, mas uma jornada contínua. Mantenha-se atualizado, revise seu código periodicamente e nunca subestime a importância de uma camada extra de verificação.





Nenhum comentário:

Postar um comentário