리눅스의 가상화 기술인 KVM(Kernel-based Virtual Machine)에서 16년 동안 발견되지 않았던 심각한 보안 취약점이 공개됐습니다. CVE-2026-53359로 등록되고 'Januscape'라는 이름이 붙은 이 버그는 게스트 가상 머신(VM) 내에서 루트 권한을 가진 공격자가 호스트 커널 메모리를 조작해 VM 격리를 무너뜨리고 호스트 시스템 전체를 장악할 수 있게 합니다![]()
.
취약점 상세: 섀도 MMU 역할 불일치
이 취약점은 리눅스 커널의 KVM 섀도 MMU(메모리 관리 장치) 코드, 특히 kvm_mmu_get_child_sp() 함수에서 비롯됩니다. 이 함수는 게스트가 페이지 테이블을 수정할 때 기존 섀도 페이지 테이블 엔트리(SPTE)를 재사용하도록 설계되었습니다. 문제는 이 함수가 섀도 페이지 재사용 여부를 결정할 때 게스트 프레임 번호(GFN)만 검증하고, **MMU 역할(role)**은 확인하지 않는다는 점입니다
.
공격 과정은 다음과 같이 요약됩니다:
- 초기 상태: 게스트 VM이 2MB 페이지 매핑을 사용합니다. KVM은 이 매핑에 대해
direct=1 역할을 가진 섀도 페이지를 생성합니다.
- PDE 수정: 게스트 내 루트 권한의 공격자가 페이지 디렉토리 엔트리(PDE)를 변경해 리프(leaf)가 아닌 페이지를 가리키도록 합니다. 새 매핑은 이제
direct=0 역할이 필요한 4KB 페이지가 됩니다.
- 역할 불일치:
kvm_mmu_get_child_sp()가 재사용할 섀도 페이지를 찾을 때, GFN이 일치하므로 기존 섀도 페이지를 발견합니다. 하지만 direct 역할을 비교하지 않아 인 오래된 섀도 페이지가 이 필요한 컨텍스트에 잘못 재사용됩니다.