Guia completo para corrigir a vulnerabilidade CVE-2026-41054 no haveged (Fedora Linux). Inclui comandos de verificação, script de automação, mitigação alternativa via AppArmor/iptables e recomendações de livro para aprofundamento. Segurança que dura anos."
De Notícia Efêmera a Conhecimento Duradouro
Em maio de 2026, uma vulnerabilidade crítica de escalonamento de privilégios (CVE-2026-41054) foi descoberta no haveged — daemon de entropia que alimenta /dev/random com números aleatórios baseados no algoritmo HAVEGE.
O problema existia desde a versão 1.9.14, afetando sistemas onde o serviço roda com privilégios elevados (o padrão no Fedora 44 e distribuições derivadas).
Em vez de descartar esse aviso como “mais uma notícia de segurança”, você pode transformá-lo em conhecimento perene — útil para proteger seus sistemas agora e nos próximos anos. Este guia prático mostra como verificar, corrigir e mitigar essa falha em qualquer ambiente Fedora ou RHEL-like.
Entendendo o Impacto: O que o CVE-2026-41054 realmente faz?
A falha residia na função socket_handler() do arquivo src/havegecmd.c. O código verificava o UID da conexão via SO_PEERCRED e enviava uma resposta NAK para usuários não-root. O problema é que, após enviar o NAK, a execução não retornava — continuava para o bloco de processamento de comandos.
Na prática, isso significava: um usuário local sem privilégios conseguia enviar comandos (MAGIC_CHROOT, MAGIC_CLOSE) para o daemon que rodava como root, através do socket UNIX abstracto.
Com isso, era possível forçar o daemon a fazer chroot para um diretório controlado pelo invasor — abrindo caminho para escalonamento completo de privilégios.
A falha só podia ser explorada se a opção chroot estivesse desabilitada (padrão em muitas instalações) e afetava todas as versões com suporte a comando socket — ou seja, haveged 1.9.14 em diante.
A correção veio em duas etapas: primeiro, adicionando goto out após o NAK para rejeitar conexões não-root; segundo, movendo a verificação de credencial para antes do parsing dos comandos, como defesa em profundidade.
Seção 1: Como Verificar se Você Está Vulnerável (Fedora e RHEL)
# 1. Verifique a versão atual do haveged rpm -q haveged # 2. Verifique se o serviço está rodando com privilégios elevados systemctl status haveged | grep -i "user\|root" # 3. Veja se a opção chroot está habilitada ps aux | grep haveged | grep -i chroot # 4. Verifique se o socket de comandos está exposto ls -la /run/haveged* 2>/dev/null || echo "Socket não encontrado" # 5. Para sistemas Fedora, confirme se a correção está instalada dnf update --advisory FEDORA-2026-02b08daa05 --assumeno 2>/dev/null && echo "Pacote disponível" || echo "Já corrigido ou não aplicável"
Interpretação dos resultados:
- Versão anterior a 1.9.21 → vulnerável
- Serviço rodando como root + chroot não habilitado → cenário de risco alto
- Qualquer sinal do socket em /run/haveged-cmd.socket → possível vetor de ataque
Seção 2: Script de Automação para Aplicar a Correção (Fedora Linux)
Salve como fix-haveged.sh e execute com sudo bash fix-haveged.sh:
#!/bin/bash # haveged Security Fix Script - CVE-2026-41054 # Compatible with Fedora Linux and RHEL derivatives set -euo pipefail RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' echo -e "${GREEN}[INFO] Iniciando correção de segurança do haveged...${NC}" # Check current version CURRENT_VERSION=$(rpm -q haveged --queryformat "%{VERSION}" 2>/dev/null || echo "not_installed") echo -e "${YELLOW}[INFO] Versão atual: $CURRENT_VERSION${NC}" if [[ "$CURRENT_VERSION" == "not_installed" ]]; then echo -e "${YELLOW}[INFO] haveged não está instalado. Nada a fazer.${NC}" exit 0 fi if [[ "$CURRENT_VERSION" > "1.9.20" ]] || [[ "$CURRENT_VERSION" == "1.9.22"* ]]; then echo -e "${GREEN}[OK] Sistema já está seguro (versão >= 1.9.21).${NC}" exit 0 fi echo -e "${RED}[ALERTA] Versão vulnerável detectada! Aplicando correção...${NC}" # Stop the service sudo systemctl stop haveged || true # Update package (Fedora specific) if command -v dnf &> /dev/null; then echo -e "${GREEN}[INFO] Atualizando via dnf (Fedora)...${NC}" sudo dnf update -y haveged elif command -v yum &> /dev/null; then echo -e "${GREEN}[INFO] Atualizando via yum (RHEL/CentOS)...${NC}" sudo yum update -y haveged else echo -e "${RED}[ERRO] Gerenciador de pacotes não suportado.${NC}" exit 1 fi # Verify new version NEW_VERSION=$(rpm -q haveged --queryformat "%{VERSION}") echo -e "${GREEN}[INFO] Nova versão instalada: $NEW_VERSION${NC}" # Restart and enable service sudo systemctl start haveged sudo systemctl enable haveged # Final security check if [[ "$NEW_VERSION" == "1.9.22"* ]] || [[ "$NEW_VERSION" > "1.9.20" ]]; then echo -e "${GREEN}[SUCESSO] Correção aplicada com sucesso!${NC}" else echo -e "${RED}[ERRO] Falha na correção. Versão ainda vulnerável.${NC}" exit 1 fi echo -e "${GREEN}[INFO] Script concluído. Sistema seguro.${NC}"
Como usar:
chmod +x fix-haveged.sh sudo ./fix-haveged.sh
📗 Recomendação de Leitura
Segurança em servidores Linux: Ataque e Defesa (anúncio) -> https://amzn.to/4ochVDk
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.
Seção 3: Mitigação Alternativa (Caso Não Possa Atualizar Agora)
Se você não pode reiniciar o servidor ou aplicar a atualização imediatamente, estas medidas alternativas reduzem drasticamente o risco:
Opção A: Bloquear o socket de comandos via iptables (restrição local)
# Remover permissões de escrita no socket sudo chmod 000 /run/haveged-cmd.socket 2>/dev/null # Bloquear acesso ao socket via iptables (limitação para processos locais) sudo iptables -A OUTPUT -p unix --dport /run/haveged-cmd.socket -j DROP sudo iptables -A INPUT -p unix --sport /run/haveged-cmd.socket -j DROP # Persistir as regras sudo iptables-save > /etc/iptables/rules.v4
Limitação: iptables não filtra sockets UNIX diretamente. Essa abordagem é mais eficaz em sistemas onde o socket está exposto via rede (ex: configurações incorretas). Para proteção local robusta, use AppArmor.
Opção B: Restringir via AppArmor (recomendado)
O próprio AppArmor já protege o haveged por padrão em distribuições como Ubuntu e Debian. No Fedora, habilite e configure:
# Instalar AppArmor (se não disponível) sudo dnf install apparmor apparmor-utils # Criar perfil restritivo para haveged sudo aa-genprof haveged # Colocar o perfil em modo de reclamação para auditoria sudo aa-complain /usr/sbin/haveged # Após validar os logs, ativar o perfil sudo aa-enforce /usr/sbin/haveged
Perfil AppArmor recomendado (adicione em /etc/apparmor.d/usr.sbin.haveged):
/usr/sbin/haveged {
# Capacidades essenciais
capability dac_override,
capability setgid,
capability setuid,
# Acesso apenas aos arquivos necessários
/dev/urandom r,
/dev/random rw,
/run/haveged/ rw,
# NEGAR acesso ao socket de comandos
deny /run/haveged-cmd.socket rw,
# Isolar o processo
mount options=(ro, nosuid, nodev, noexec) -> /proc/*/,
}
Opção C: Executar em container ou namespace isolado
# Executar haveged dentro de um container Docker com restrições docker run --rm \ --cap-drop=ALL \ --cap-add=DAC_OVERRIDE \ --security-opt=no-new-privileges:true \ --read-only \ -v /dev/urandom:/dev/urandom:ro \ -v /dev/random:/dev/random:rw \ haveged:1.9.22
Importante: Essas medidas são paliativas. A única solução definitiva é a atualização para haveged 1.9.22 (Fedora) ou 1.9.21 (upstream), que corrige a falha na origem.
Conclusão
O CVE-2026-41054 mostra como um simples erro de lógica pode abrir brecha crítica. Este guia perene transforma a notícia passageira em valor duradouro: você sai com comandos, script pronto e mitigações alternativas.
Aplique a correção agora ou use AppArmor como paliativo. Para dominar segurança de servidores Linux, o livro "Segurança em servidores Linux: Ataque e Defesa" na Amazon.

Nenhum comentário:
Postar um comentário