flawopen.com/Incidents/xz-utils-backdoor-march-2024
Comprometimento do XZ Utils (CVE-2024-3094)
CVE-2024-3094 afetou os tarballs XZ Utils 5.6.0/5.6.1. A exposição dependia do build da distro; identifique e substitua pacotes afetados.[1], [3], [4], [5], [6]
Imagine uma fábrica que recebe um kit de peças lacrado e monta um produto. A receita pública parece normal, mas um kit enviado contém um componente extra escondido. Uma fábrica que cria o kit a partir da receita não recebe esse componente; uma que usa o kit lacrado pode recebê-lo. Um manifesto autenticado por um canal separado pode detectar um kit substituído, mas nem uma assinatura válida do fornecedor prova que um kit autorizado é inofensivo: os kits comprometidos do XZ eram lançamentos oficiais. Substitua os pacotes afetados conforme as orientações da distribuição; use a verificação do manifesto apenas como controle separado contra substituições.[5], [6]
Conceitos Centrais e Termos
Tarball de lançamento- Arquivo distribuído para uma versão de software. É uma entrada de compilação e deve ser verificado independentemente do código-fonte do repositório que deveria representar.[3], [4], [6]
Proveniência de compilação- Evidência que conecta um artefato compilado ao código revisado, a um processo de compilação definido e a uma identidade de lançamento confiável. A proveniência torna detectável uma divergência entre fonte e artefato.[5], [6]
Verificação de artefato- Conferência de um artefato de lançamento com um manifesto assinado confiável ou digest reproduzido de forma independente antes de permiti-lo em uma compilação ou pipeline de pacotes.
Mapeamentos de frameworks
- Referência CWE para a fraqueza descrita neste guia: CWE-506
Linha do Tempo do Incidente
Andres Freund relatou publicamente o problema.[5]
Fluxo de Ataque Passo a Paso
As condições de compilação e distribuição importavam
Os relatórios descrevem dados extraídos de arquivos de teste .xz durante a compilação dos tarballs afetados. Freund também observou que uma compilação a partir do Git não injetaria o código e que o caminho de dependência dependia das escolhas de compilação da distribuição.[5], [6]
Comportamento anômalo provocou investigação
Freund relatou uso incomum de CPU por SSH e erros do Valgrind. Esses sintomas levaram à investigação do artefato de lançamento e de seu comportamento de compilação, em vez de aceitar uma regressão de desempenho sem explicação.[5]
A contenção começa com substituição e verificação de pacotes
Trate o caso como um incidente de pacote afetado e de proveniência de compilação. Siga as orientações da distribuição e substitua os pacotes afetados. Para artefatos futuros, verifique proveniência e assinaturas: isso pode detectar substituições, mas não prova que um lançamento autorizado seja inofensivo.[1], [6]
Código-Fonte: Vulnerável vs. Seguro
# Aceita uma entrada de compilação baixada sem provar sua identidade.
from pathlib import Path
def stage_release(artifact: Path, build_inputs: Path) -> None:
build_inputs.joinpath(artifact.name).write_bytes(artifact.read_bytes())
# Uma cópia bem-sucedida não prova que este arquivo corresponde
# ao lançamento revisado ou a um manifesto confiável do editor.# Portão ilustrativo: verifica um SHA-256 esperado de um manifesto confiável.
import hashlib
import hmac
from pathlib import Path
def verify_release(artifact: Path, expected_sha256: str) -> None:
digest = hashlib.sha256(artifact.read_bytes()).hexdigest()
if not hmac.compare_digest(digest, expected_sha256.lower()):
raise ValueError("o artefato de lançamento não corresponde ao manifesto confiável")
# Obtenha expected_sha256 por um processo de lançamento autenticado à parte
# e chame verify_release antes de o arquivo entrar na compilação.
# Isso detecta substituição, não um lançamento autorizado porém malicioso; siga as orientações para pacotes afetados.Lista de Verificação de Segurança para Engenharia
- ✓Siga as orientações da sua distribuição para
CVE-2024-3094, identifique e substitua os pacotes e versões realmente afetados e depois verifique a proveniência do pacote substituto.[1], [6] - ✓Antes que um arquivo de lançamento se torne entrada de compilação, compare-o com um hash ou uma assinatura obtidos por um canal autenticado separadamente; falhe de forma segura em caso de divergência, pois um download bem-sucedido não comprova a proveniência.
- ✓Para compilações reproduzíveis, registre a revisão do código-fonte, o ambiente de compilação, o digest do artefato, a identidade do construtor e a configuração; compare compilações independentes ao atualizar dependências críticas.
- ✓Revise arquivos de lançamento, scripts de compilação, regras de empacotamento e artefatos de teste com o mesmo rigor aplicado ao código da aplicação; registre a origem e a integridade de dados binários de teste sem explicação.[5], [6]
- ✓Exija a aprovação de pelo menos dois mantenedores para mudanças nas ferramentas de lançamento, configuração de CI e etapas de empacotamento, separada da aprovação de mudanças comuns no código da aplicação; mantenha registros rastreáveis.
- ✓Investigue uso inexplicado de CPU em compilações ou serviços, regressões de desempenho e erros de memória ou de ferramentas de validação; preserve artefatos e evidências para comparação.[5]
Fontes
- NVD — CVE-2024-3094
- MITRE CWE-506
- XZ Utils 5.6.0 — lançamento de 24 de fevereiro de 2024
- XZ Utils 5.6.1 — lançamento de 9 de março de 2024
- Andres Freund — relatório original no oss-security
- Declaração de incidente do projeto XZ — arquivo oss-security
- Shai-Hulud: o worm npm que publicava a si mesmo
- SUNBURST: quando a esteira de build era a própria vulnerabilidade
- Registro do Programa CVE — dados da CNA da Red Hat