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:
ruby -v
O output será algo como:
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux-gnu]
Verifique a versão da gem net-imap
Exemplo de output:
*** 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:
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
#!/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:
1. Verifique explicitamente se o TLS foi estabelecido
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:
# 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:
# 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])

Nenhum comentário:
Postar um comentário