flawopen.com/Incidents/xz-utils-backdoor-march-2024
●
Xz · CVE-2024-3094 · March 2024 · CVSS 10.0 · 심각
보안 연구 · FlawOpen
XZ Utils 공급망 침해 (CVE-2024-3094)
CVE-2024-3094는 XZ Utils 5.6.0/5.6.1에 영향을 주었습니다. 위험은 배포판 빌드 조건에 따라 달랐으므로 해당 패키지를 찾아 교체하세요.[1], [3], [4], [5], [6]
💡 알기 쉬운 설명 (ELI5)
소스 저장소를 공개된 조리법, 릴리스 아카이브를 밀봉된 식재료 상자라고 생각해 보세요. 조리법이 맞아 보여도 주방은 상자의 봉인과 납품서를 확인합니다. 같은 음식 이름이 적혀 있다는 이유만으로 상자를 곧바로 조리대에 올려놓아서는 안 됩니다. 별도의 신뢰 채널로 인증한 매니페스트는 바뀐 상자를 찾아낼 수 있지만, 유효한 공급업체 서명도 승인된 상자가 안전하다는 점까지 증명하지는 못합니다. 침해된 XZ 상자도 공식 릴리스였습니다. 배포판 안내에 따라 영향받은 패키지를 교체하고, 매니페스트 검증은 바꿔치기를 막는 별도 통제로만 사용하세요.[5], [6]
핵심 개념 및 용어
빌드 출처 증명(build provenance)- 산출물이 어떤 검토된 소스, 빌드 단계, 게시자에서 왔는지 기록한 증거입니다. 다운로드한 파일을 신뢰할지 판단하게 해 줍니다.[5], [6]
산출물 검증(artifact verification)- 산출물을 빌드나 릴리스에 사용하기 전에 해시나 서명을 독립적인 신뢰 경로로 얻은 기대값과 대조하는 절차입니다.
프레임워크 매핑
- 이 가이드에서 설명하는 약점의 CWE 참조: CWE-506
사고 타임라인
2024년 3월 29일 전
2024년 3월 29일
Andres Freund가 문제를 공개적으로 보고했습니다.[5]
단계별 공격 실행 흐름
단계 1
단계 2
단계 3
이상 징후가 조사의 출발점이 됐다
Andres Freund는 SSH 프로세스의 비정상적인 CPU 사용량과 Valgrind 오류를 보고했습니다. 관찰 가능한 이상 징후가 조사와 공개로 이어졌습니다.[5]
소스 코드 비교: 취약한 구현 vs 보안 패치
취약한 구현
# 다운로드한 빌드 입력을 그 신원을 증명하지 않고 받아들인다.
from pathlib import Path
def stage_release(artifact: Path, build_inputs: Path) -> None:
build_inputs.joinpath(artifact.name).write_bytes(artifact.read_bytes())
# 복사가 성공해도 이 아카이브가 검토된 릴리스 또는
# 신뢰할 수 있는 매니페스트에 해당한다는 증거는 아니다.보안 강화 패치
# 교육용 게이트: 신뢰할 수 있는 매니페스트의 예상 SHA-256을 검증한다.
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("릴리스 산출물이 신뢰할 수 있는 매니페스트와 일치하지 않습니다")
# expected_sha256은 별도로 인증된 게시 경로에서 구하고,
# 아카이브를 빌드 입력으로 사용하기 전에 verify_release를 호출한다.
# 이는 바꿔치기를 찾지만 승인된 악성 릴리스는 찾지 못합니다. 영향받은 패키지는 공급업체 안내를 따르세요.엔지니어링 및 시스템 보안 강화 체크리스트
- ✓다운로드한 릴리스 아카이브를 별도 인증 경로에서 얻은 해시 또는 서명과 대조하고, 다운로드 성공 자체를 출처 증명으로 취급하지 않는다.[1], [6]
- ✓재현 가능한 빌드에는 소스 리비전, 빌드 환경, 산출물 해시를 기록하고 중요한 의존성을 갱신할 때 독립 빌드의 결과를 비교한다.
- ✓빌드 스크립트, 패키징 규칙, 테스트 산출물을 애플리케이션 코드와 같은 수준으로 검토하고 설명할 수 없는 이진 테스트 데이터의 출처와 무결성을 기록한다.
- ✓릴리스 도구, CI 설정, 패키징 절차 변경에는 최소 두 명의 유지관리자 승인을 요구하고 추적 가능한 기록을 남긴다.[5], [6]
- ✓공급업체와 배포판 공지로 실제 영향 패키지와 버전을 확인하고 패키지 교체 후에도 출처를 다시 검증한다.
- ✓빌드나 서비스의 설명되지 않는 CPU 사용량, 성능 저하, 메모리 검사 오류를 조사 절차에 포함하고 검토 가능한 증거를 보관한다.[5]