FlawOpen

flawopen.com/Incidents/xz-utils-backdoor-march-2024

● Xz · CVE-2024-3094 · March 2024 · CVSS 10.0 · Crítica
Pesquisa · FlawOpen

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]

Vetor CVSSCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H[9]
💡 Explicação em Linguagem Simples (ELI5)

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

24 de fevereiro de 2024

O XZ Utils 5.6.0 foi lançado; a declaração posterior do projeto diz que seu tarball de lançamento continha um backdoor.[3], [6]

9 de março de 2024

O XZ Utils 5.6.1 foi lançado; a mesma declaração diz que seu tarball de lançamento continha um backdoor.[4], [6]

Antes de 29 de março de 2024

Freund relatou um script de compilação injetado em tarballs distribuídos, ausente no arquivo-fonte upstream correspondente, após uso incomum de CPU por SSH e erros do Valgrind motivarem a investigação.[5], [6]

29 de março de 2024

Andres Freund relatou publicamente o problema.[5]

Fluxo de Ataque Passo a Paso

Passo 1

Um artefato de lançamento diferiu da fonte esperada

Andres Freund informou que um script de compilação injetado existia nos tarballs distribuídos, mas não no arquivo-fonte upstream correspondente. Isso é uma falha de proveniência: revisar uma entrada não provou a identidade da outra.[5], [6]

Passo 2

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]

Passo 3

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]

Passo 4

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

IMPLEMENTAÇÃO VULNERÁVEL
# 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.
PATCH SEGURO E ROBUSTO
# 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

Fontes