FERRAMENTAS LINUX: Azure Storage AzCopy no SUSE: Guia Completo de Segurança e Correção

sábado, 20 de junho de 2026

Azure Storage AzCopy no SUSE: Guia Completo de Segurança e Correção

 



Guia definitivo para administradores SUSE sobre as vulnerabilidades CVE-2025-47907, CVE-2026-33186, CVE-2026-33814, CVE-2026-34986 e CVE-2026-39821 no Azure Storage AzCopy. Aprenda a verificar, corrigir e mitigar com scripts prontos e medidas alternativas para manter seus sistemas seguros.


O que você precisa saber sobre as vulnerabilidades no AzCopy

                                                                                                                                       Em junho de 2026, a SUSE lançou o boletim de segurança SUSE-SU-2026:2466-1, atualizando o pacote azure-storage-azcopy para a versão 10.32.4. Esta atualização corrige cinco vulnerabilidades que afetam componentes críticos do ecossistema Go utilizados pelo AzCopy:

CVE

A gravidade varia de 2.1 a 9.1 na escala CVSS, com destaque para o CVE-2026-33186 que atinge 9.1 (Crítico) segundo o NVD.

Como verificar se você está vulnerável

Antes de aplicar qualquer correção, verifique a versão atual do AzCopy no seu sistema SUSE:

Verificar a versão instalada do AzCopy

bash
# Verifica a versão do pacote instalado
zypper info azure-storage-azcopy

# Ou use rpm para consulta direta
rpm -q azure-storage-azcopy

Comparar com a versão segura

A versão corrigida é a 10.32.4. Se a sua versão for anterior, seu sistema está vulnerável.

Verificar se os CVEs afetam seu ambiente

Para o CVE-2025-47907 (race condition no database/sql), verifique se sua aplicação usa consultas SQL concorrentes com cancelamento de contexto durante o Scan:

bash
# Procure por uso do database/sql com contexto cancelável
grep -r "database/sql" --include="*.go" /caminho/do/seu/codigo
grep -r "Rows.Scan" --include="*.go" /caminho/do/seu/codigo

Para o CVE-2026-33186 (bypass de autorização gRPC), verifique o uso do pacote authz do gRPC-Go:

bash
grep -r "google.golang.org/grpc" --include="*.go" /caminho/do/seu/codigo
grep -r "authz" --include="*.go" /caminho/do/seu/codigo

 Verificar dependências Go indiretas

O AzCopy é escrito em Go e pode puxar dependências vulneráveis. Use o govulncheck para uma análise completa:

bash
# Instalar govulncheck (se não tiver)
go install golang.org/x/vuln/cmd/govulncheck@latest

# Analisar o binário ou o código-fonte
govulncheck /usr/bin/azcopy
# ou, se tiver o código-fonte:
govulncheck ./...

Script de automação para aplicar a correção

                                                                                                                              Este script Bash verifica a versão do AzCopy e aplica a atualização automaticamente em sistemas SUSE:
bash
#!/bin/bash
# SCRIPT: fix-azcopy-vulnerabilities.sh
# DESCRIÇÃO: Verifica e atualiza azure-storage-azcopy para a versão segura 10.32.4
# AUTOR: [Seu nome]
# DATA: $(date +%Y-%m-%d)

set -euo pipefail

# Cores para output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# Configurações
PACKAGE_NAME="azure-storage-azcopy"
MIN_SAFE_VERSION="10.32.4"
LOG_FILE="/var/log/azcopy-update-$(date +%Y%m%d-%H%M%S).log"

# Função para log
log() {
    echo -e "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}

# Função para verificar se o script está rodando como root
check_root() {
    if [[ $EUID -ne 0 ]]; then
        log "${RED}ERRO: Este script precisa ser executado como root.${NC}"
        log "Execute: sudo $0"
        exit 1
    fi
}

# Função para verificar o sistema operacional
check_os() {
    if ! command -v zypper &> /dev/null; then
        log "${RED}ERRO: zypper não encontrado. Este script é para distribuições SUSE.${NC}"
        exit 1
    fi
    log "${GREEN}Sistema SUSE detectado.${NC}"
}

# Função para verificar a versão atual
check_current_version() {
    if rpm -q "$PACKAGE_NAME" &> /dev/null; then
        CURRENT_VERSION=$(rpm -q --qf "%{VERSION}" "$PACKAGE_NAME")
        log "${GREEN}Versão atual do $PACKAGE_NAME: $CURRENT_VERSION${NC}"
        
        # Comparação simples de versão (funciona para versionamento semântico básico)
        if [[ "$CURRENT_VERSION" == "$MIN_SAFE_VERSION" ]] || \
           [[ "$(printf '%s\n' "$MIN_SAFE_VERSION" "$CURRENT_VERSION" | sort -V | head -n1)" == "$MIN_SAFE_VERSION" ]]; then
            log "${GREEN}✓ O sistema já está atualizado (versão $CURRENT_VERSION >= $MIN_SAFE_VERSION)${NC}"
            return 0
        else
            log "${YELLOW}! Sistema está vulnerável (versão $CURRENT_VERSION < $MIN_SAFE_VERSION)${NC}"
            return 1
        fi
    else
        log "${YELLOW}! Pacote $PACKAGE_NAME não está instalado.${NC}"
        log "Deseja instalar? (s/N)"
        read -r resposta
        if [[ "$resposta" =~ ^[Ss]$ ]]; then
            return 1
        else
            log "Instalação cancelada."
            exit 0
        fi
    fi
}

# Função para atualizar o pacote
apply_update() {
    log "${GREEN}Iniciando atualização do $PACKAGE_NAME...${NC}"
    
    # Atualiza os repositórios
    log "Atualizando repositórios..."
    zypper refresh || {
        log "${RED}ERRO: Falha ao atualizar repositórios.${NC}"
        exit 1
    }
    
    # Aplica o patch específico
    log "Aplicando atualização SUSE-SU-2026:2466-1..."
    zypper patch --cve="CVE-2025-47907,CVE-2026-33186,CVE-2026-33814,CVE-2026-34986,CVE-2026-39821" || {
        log "${YELLOW}Aviso: Patch específico pode não estar disponível. Tentando atualização geral...${NC}"
        zypper update "$PACKAGE_NAME"
    }
    
    # Verifica se a atualização foi bem-sucedida
    if rpm -q "$PACKAGE_NAME" &> /dev/null; then
        NEW_VERSION=$(rpm -q --qf "%{VERSION}" "$PACKAGE_NAME")
        log "${GREEN}✓ Atualização concluída! Nova versão: $NEW_VERSION${NC}"
        
        if [[ "$NEW_VERSION" == "$MIN_SAFE_VERSION" ]] || \
           [[ "$(printf '%s\n' "$MIN_SAFE_VERSION" "$NEW_VERSION" | sort -V | head -n1)" == "$MIN_SAFE_VERSION" ]]; then
            log "${GREEN}✓ Sistema agora está seguro (versão $NEW_VERSION >= $MIN_SAFE_VERSION)${NC}"
        else
            log "${RED}⚠ ATENÇÃO: Versão $NEW_VERSION ainda pode ser vulnerável.${NC}"
            log "Considere verificar manualmente no portal SUSE."
        fi
    else
        log "${RED}ERRO: Falha ao atualizar o pacote.${NC}"
        exit 1
    fi
}

# Função para verificar dependências Go vulneráveis
check_go_vuln() {
    if command -v govulncheck &> /dev/null; then
        log "${GREEN}Verificando vulnerabilidades em dependências Go...${NC}"
        if command -v azcopy &> /dev/null; then
            AZCOPY_PATH=$(which azcopy)
            govulncheck "$AZCOPY_PATH" 2>&1 | tee -a "$LOG_FILE" || {
                log "${YELLOW}Aviso: govulncheck pode não suportar análise de binários.${NC}"
            }
        fi
    else
        log "${YELLOW}govulncheck não encontrado. Instale com: go install golang.org/x/vuln/cmd/govulncheck@latest${NC}"
    fi
}

# Função para reiniciar serviços que usam AzCopy
restart_services() {
    log "Procurando serviços que usam AzCopy..."
    
    # Lista de serviços comuns que podem usar AzCopy
    SERVICES=("azcopy" "azure-storage" "saphana-checks")
    
    for svc in "${SERVICES[@]}"; do
        if systemctl is-active --quiet "$svc" 2>/dev/null; then
            log "Reiniciando serviço: $svc"
            systemctl restart "$svc" || {
                log "${YELLOW}Aviso: Falha ao reiniciar $svc${NC}"
            }
        fi
    done
    
    log "${GREEN}✓ Serviços reiniciados (quando aplicável).${NC}"
}

# --- EXECUÇÃO PRINCIPAL ---

log "=== SCRIPT DE CORREÇÃO AZCOPY - SUSE ==="
log "Iniciado em: $(date)"

check_root
check_os

if check_current_version; then
    log "Nenhuma ação necessária."
    check_go_vuln
    exit 0
fi

# Se chegou aqui, precisa atualizar
log "${YELLOW}Iniciando processo de correção...${NC}"

# Faz backup da configuração atual (se existir)
if [ -f /etc/azcopy/config.json ]; then
    BACKUP_DIR="/root/azcopy-backup-$(date +%Y%m%d)"
    mkdir -p "$BACKUP_DIR"
    cp -r /etc/azcopy "$BACKUP_DIR/"
    log "${GREEN}Backup criado em: $BACKUP_DIR${NC}"
fi

apply_update
check_go_vuln
restart_services

log "${GREEN}=== CORREÇÃO CONCLUÍDA ==="
log "Log salvo em: $LOG_FILE"
log "Recomenda-se reiniciar o sistema se possível."
log "${GREEN}✓ Sistema atualizado com sucesso!${NC}"

Como usar o script:

bash
# 1. Salve o script em um arquivo
nano fix-azcopy-vulnerabilities.sh

# 2. Torne-o executável
chmod +x fix-azcopy-vulnerabilities.sh

# 3. Execute como root
sudo ./fix-azcopy-vulnerabilities.sh


📗  Recomendação de Leitura


Segurança em servidores Linux: Ataque e Defesa  (anúncio) ->  https://link.amazon/B0gMOJEFt


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.


Mitigação alternativa caso não possa atualizar agora


Se você não puder aplicar a atualização imediatamente, estas medidas podem reduzir o risco:

Mitigação para CVE-2026-33814 (Loop infinito HTTP/2)

Configure regras no iptables para limitar ou bloquear tráfego HTTP/2 malicioso:

bash
# Bloquear frames SETTINGS com MAX_FRAME_SIZE=0 (detecção baseada em padrões)
# Nota: Isso é uma mitigação parcial - a atualização é a solução definitiva

# Limitar conexões HTTP/2 por IP (rate limiting)
iptables -A INPUT -p tcp --dport 443 -m conntrack --ctstate NEW -m recent --set
iptables -A INPUT -p tcp --dport 443 -m conntrack --ctstate NEW -m recent --update --seconds 60 --hitcount 10 -j DROP

# Bloquear pacotes suspeitos (exemplo - ajuste conforme necessidade)
# iptables -A INPUT -p tcp --dport 443 -m string --string "SETTINGS_MAX_FRAME_SIZE" --algo bm -j LOG --log-prefix "HTTP2_ATTACK: "

 Mitigação para CVE-2026-33186 (Bypass de autorização gRPC)

Se você usa o AzCopy com gRPC, considere:

  • Adicionar um proxy reverso (nginx/haproxy) que normalize o cabeçalho :path, garantindo a barra inicial
  • Restringir acesso à rede para apenas IPs confiáveis

bash
# Exemplo: Restringir acesso à porta gRPC (padrão 50051) apenas para IPs internos
iptables -A INPUT -p tcp --dport 50051 -s 192.168.0.0/16 -j ACCEPT
iptables -A INPUT -p tcp --dport 50051 -j DROP

Mitigação para CVE-2026-34986 (Panic no JWE)

  • Se você usa JWE com algoritmos KW:
  • Evite algoritmos de wrapping de chave (terminados em KW) até atualizar
  • Valide previamente se encrypted_key não está vazio antes de chamar o decrypt.

Mitigação para CVE-2025-47907 (Race condition no SQL)

  • Evite cancelar contextos durante operações Rows.Scan
  • Use consultas sequenciais em vez de paralelas quando possível

AppArmor para contenção


O SUSE inclui AppArmor por padrão. Crie um perfil restritivo para o AzCopy:

bash
# Gerar perfil AppArmor para o AzCopy
sudo aa-genprof /usr/bin/azcopy

# Aplicar o perfil em modo de reclamação (aprendizado)
sudo aa-complain /usr/bin/azcopy

# Depois de testar, ative em modo de enforced
sudo aa-enforce /usr/bin/azcopy


Isolamento de rede

Se o AzCopy não precisar de acesso externo, isole-o:

bash
# Criar um namespace de rede separado
ip netns add azcopy-ns
# Mover o processo para o namespace (exemplo)
# ip netns exec azcopy-ns /usr/bin/azcopy [args]

Conclusão



As vulnerabilidades corrigidas no AzCopy versão 10.32.4 afetam componentes fundamentais do ecossistema Go: desde o driver SQL até o stack HTTP/2 e gRPC. A gravidade varia de 2.1 a 9.1, com destaque para o CVE-2026-33186 que permite bypass de autorização com CVSS 9.1.

Ações recomendadas:

1. Imediato: Execute o script de correção para atualizar para a versão 10.32.4

2. Curto prazo: Se não puder atualizar, aplique as mitigações alternativas (iptables, AppArmor, isolamento de rede)

3. Longo prazo: Estude as boas práticas de segurança em Go para evitar vulnerabilidades similares em seus próprios projetos

4. Lembre-se: a data do anúncio (19 de junho de 2026) é apenas um marco. As lições e procedimentos aqui descritos permanecem válidos enquanto o AzCopy e o ecossistema Go forem utilizados.



Nenhum comentário:

Postar um comentário