vgic_put_irq()xa_erase()GITS_CTLREnableLPIs게스트-호스트 탈출 공격은 드물지만, 하이퍼바이저 버그 중에서도 가장 위험한 유형입니다. 클라우드 컴퓨팅이 의존하는 격리 경계를 완전히 무너뜨리기 때문입니다. 이전에 공개된 KVM 탈출 사례들은 주로 QEMU나 AMD 특정 코드를 통해 x86 아키텍처를 대상으로 했습니다. ITScape는 권한이 없는 arm64 게스트 VM에서 커널 내 KVM 코드 자체를 통해 탈출이 가능함을 보여준 최초의 작동 공격이며, QEMU와 같은 사용자 공간 에뮬레이터 버그가 필요하지 않습니다
.
그래비톤(Graviton), 암페어 알트라(Ampere Altra) 혹은 기타 arm64 KVM 호스트에서 멀티 테넌트 워크로드를 운영하는 클라우드 사업자에게, 게스트 VM은 다음의 행위를 할 수 있게 됩니다:
취약한 코드는 LPI 변환 캐시 무효화 경로에 있습니다. 커널이 캐시 항목을 플러시해야 할 때, xa_for_each()로 XArray를 순회하며 각 항목의 참조 카운트를 해제하기 위해 vgic_put_irq()를 호출합니다. 문제는 xa_for_each()가 다른 vCPU에서 실행된 DISCARD ITS 명령과 같은 동시 작업에 의해 이미 제거되었을 수 있는 항목들을 반환한다는 점입니다. 무효화 루프는 이렇게 이미 제거된 항목에 대해서도 여전히 참조를 해제하여, 이중 해제 및 궁극적으로 해제 후 사용을 초래합니다.
동일한 코드에는 과거에도 유사한 취약점인 CVE-2024-26598이 있었습니다. 이는 LPI 변환 캐시 적중 경로에서 잠금을 해제하기 전에 vgic_its_check_cache() 내부에서 참조 카운트를 올리는 방식으로 부분적인 UAF를 해결했습니다. 하지만 이 수정은 이번 무효화 경로까지는 다루지 못해, 다른 트리거 시퀀스를 통해 경쟁 조건을 악용할 수 있는 여지를 남겼습니다.
업스트림 수정 사항은 vgic_its_invalidate_cache()를 변경합니다. 이제 vgic_put_irq()는 이터레이터가 접근하는 모든 항목이 아닌, xa_erase()가 반환한 값에 대해서만 호출됩니다. 커밋 메시지는 다음과 같습니다: "KVM: arm64: vgic-its: Drop the translation cache reference only for the erased entry".
xa_erase()는 원자적으로 항목을 제거하고 이전 항목을 반환하며, 항목이 이미 사라졌다면 NULL을 반환합니다. 따라서 이 수정은 참조 카운트가 정확히 한 번만 감소하도록 보장하여 이중 해제 가능성을 없앱니다. 이 패치는 2026년 6월 초 업스트림 커널에 반영되었고, 2026년 6월 8일~10일경에 6.x 안정 버전 시리즈로 신속하게 포함되었습니다. 레드햇(Red Hat), 수세(SUSE), 데비안(Debian)을 포함한 주요 배포판들은 지원하는 커널 브랜치에 대한 백포트 패치를 발행했습니다
.
김현우 씨는 2026년 6월 9일에서 10일경에 깃허브에 작동하는 공격 코드를 공개했습니다. 이 저장소에는 전체 소스 코드, 단계별 재현 지침, 그리고 공격 기술에 대한 기술적 설명이 포함되어 있습니다. 이 공격은 vCPU 스레드들이 DISCARD 명령과 LPI 변환 캐시 조회를 동시에 실행하도록 조정하여 경쟁 조건을 유발하고, 호스트 코드 실행을 위한 해제 후 사용 상태를 정밀하게 만들어냅니다.
신뢰할 수 있는 PoC가 공개되었기 때문에, 상용 공격 스캐너와 실제 공격자들은 최소한의 노력으로 이 취약점을 무기화할 수 있게 되었습니다. 이는 취약점 공개와 실제 공격 사이의 시간 간격을 극도로 단축시킵니다.
AWS 그래비톤, 암페어 알트라 또는 유사한 플랫폼과 같은 멀티 테넌트 arm64 KVM 인프라를 운영하는 경우, 이 사안을 즉각적인 긴급 패치 주기로 간주해야 합니다.
Comments
0 comments