FlawOpen

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

● Xz · CVE-2024-3094 · March 2024 · CVSS 10.0 · Kritis
Riset Keamanan · FlawOpen

Kompromi rantai pasok XZ Utils (CVE-2024-3094)

CVE-2024-3094 memengaruhi tarball XZ Utils 5.6.0/5.6.1. Dampak bergantung pada build distribusi; identifikasi dan ganti paket terdampak.[1], [3], [4], [5], [6]

Vektor CVSSCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H[9]
💡 Penjelasan Sederhana (ELI5)

Anggap repositori sumber sebagai resep yang terbuka dan arsip rilis sebagai kotak bahan yang disegel. Walaupun resepnya terlihat benar, dapur tetap memeriksa segel dan daftar kiriman; nama masakan yang sama pada kotak tidak cukup untuk langsung memasukkannya ke proses produksi. Manifest yang diautentikasi melalui kanal tepercaya terpisah dapat mendeteksi kotak yang ditukar, tetapi tanda tangan vendor yang valid pun tidak membuktikan bahwa kotak resmi yang disahkan itu aman: kotak XZ yang dikompromikan adalah rilis resmi. Ganti paket terdampak sesuai panduan distribusi; gunakan pemeriksaan manifest hanya sebagai kontrol terpisah terhadap penggantian artefak.[5], [6]

Konsep Kunci & Istilah

Arsip rilis
Arsip kode sumber yang diterbitkan untuk instalasi atau pembuatan paket. Karena dapat berbeda dari berkas yang diambil dari repositori, arsip ini harus diverifikasi sebagai artefak tersendiri.[3], [4], [6]
Provenans build
Bukti yang mencatat sumber yang telah ditinjau, langkah build, dan penerbit suatu artefak. Catatan ini membantu tim menentukan apakah hasil unduhan layak dipercaya.[5], [6]
Verifikasi artefak
Membandingkan hash atau tanda tangan artefak dengan nilai yang diharapkan dan diperoleh melalui saluran tepercaya yang terpisah sebelum artefak dipakai untuk build atau rilis.

Pemetaan kerangka kerja

  • Referensi CWE untuk kelemahan yang dijelaskan dalam panduan ini: CWE-506

Kronologi Insiden

24 Februari 2024

XZ 5.6.0 dirilis; pernyataan proyek berikutnya menyebut arsip rilisnya mengandung backdoor.[3], [6]

9 Maret 2024

XZ 5.6.1 dirilis; pernyataan yang sama menyebut arsip rilisnya mengandung backdoor.[4], [6]

Sebelum 29 Maret 2024

Setelah penggunaan CPU SSH yang tidak biasa dan kesalahan Valgrind memicu penyelidikan, Freund melaporkan skrip build yang disuntikkan dalam arsip distribusi tetapi tidak ada di berkas sumber hulu yang bersesuaian.[5], [6]

29 Maret 2024

Andres Freund melaporkan masalah tersebut secara publik.[5]

Alur Serangan Langkah demi Langkah

Langkah 1

Repositori dan arsip distribusi tidak selalu sama

Analisis yang dipublikasikan menjelaskan bahwa arsip yang didistribusikan memuat perubahan skrip build yang tidak ada pada berkas repositori hulu yang bersesuaian. Meninjau commit repositori saja tidak membuktikan keamanan arsip.[5], [6]

Langkah 2

Dampak bergantung pada jalur build

Masalah ini terjadi dalam kondisi pemaketan dan build tertentu. Laporan resmi menyebut build dari Git tidak menyuntikkan kode terkait, sehingga dampak tidak boleh digeneralisasi ke semua instalasi XZ atau Linux.[5], [6]

Langkah 3

Anomali memulai penyelidikan

Andres Freund melaporkan penggunaan CPU yang tidak biasa dan kesalahan Valgrind pada proses SSH. Sinyal yang dapat diamati itu memicu penyelidikan dan pengungkapan publik.[5]

Langkah 4

Respons dimulai dengan penggantian dan verifikasi

Perlakukan ini sebagai insiden paket terdampak dan provenance build. Ikuti panduan distribusi dan ganti paket yang terdampak. Untuk artefak berikutnya, verifikasi provenance dan tanda tangannya: langkah ini dapat mendeteksi penggantian, tetapi tidak membuktikan bahwa rilis resmi yang disahkan itu aman.[1], [6]

Kode Sumber: Rentan vs Aman

IMPLEMENTASI RENTAN
# Menerima input build yang diunduh tanpa membuktikan identitasnya.
from pathlib import Path

def stage_release(artifact: Path, build_inputs: Path) -> None:
    build_inputs.joinpath(artifact.name).write_bytes(artifact.read_bytes())

# Salinan yang berhasil tidak membuktikan bahwa arsip ini sesuai
# dengan rilis yang ditinjau atau manifes tepercaya.
PERBAIKAN AMAN & KUAT
# Gerbang pembelajaran: verifikasi SHA-256 yang diharapkan dari manifes tepercaya.
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("Artefak rilis tidak cocok dengan manifes tepercaya")

# Dapatkan expected_sha256 dari jalur publikasi yang diautentikasi terpisah,
# lalu panggil verify_release sebelum memakai arsip sebagai input build.

# Ini mendeteksi penggantian, bukan rilis resmi yang berbahaya; ikuti panduan vendor untuk paket terdampak.

Daftar Periksa Penguatan Sistem Rekayasa

Sumber