Linux 커널에서는 다음 취약점이 해결되었습니다. KVM: x86: 예상치 못한 역할로 인한 섀도우 페이징 use-after-free 수정 0cb2af2ea66ad 커밋("KVM: x86: 해제 후 섀도우 페이징 수정 예상치 못한 GFN") 저장된 페이지와 페이지 간의 섀도우 페이징 불일치를 수정했습니다. 계산된 GFN; PDE 매핑을 변경하면 버그가 발생할 수 있습니다. 게스트 외부에서 memslot을 삭제합니다. rmap_remove() GFN 때문에 호출을 호출하면 PDE 변경 후에 생성된 항목이 누락됩니다. 잎 SPT의
Linux 커널에서는 다음 취약점이 해결되었습니다.
KVM: x86: 예상치 못한 역할로 인한 섀도우 페이징 use-after-free 수정
0cb2af2ea66ad 커밋("KVM: x86: 해제 후 섀도우 페이징 수정 예상치 못한 GFN") 저장된 페이지와 페이지 간의 섀도우 페이징 불일치를 수정했습니다. 계산된 GFN; PDE 매핑을 변경하면 버그가 발생할 수 있습니다. 게스트 외부에서 memslot을 삭제합니다. rmap_remove() GFN 때문에 호출을 호출하면 PDE 변경 후에 생성된 항목이 누락됩니다. 리프 SPTE의 kvm_mmu_page 구조체의 GFN과 일치하지 않습니다.
그러나 수정된 PDE가 리프가 아닌 항목을 가리키는 경우 유사한 구멍이 남습니다. 페이지. 이 경우 gfn은 일치하도록 만들 수 있지만 역할은 일치하지 않습니다. 일치: 원본 대형 2MB 페이지는 direct=1로 kvm_mmu_page를 생성합니다. 새로운 4KB에는 direct=0인 kvm_mmu_page가 필요합니다. 그러나, kvm_mmu_get_child_sp()는 역할을 비교하지 않으므로 재사용합니다. 페이지.
다음 단계는 새 경로에 리프(4KB) SPTE를 설치하는 것입니다. 산책으로 해결된 gfn 아래에 rmap 항목을 기록합니다. 하지만 언제 해당 하위 항목은 해당 상위 kvm_mmu_page에 direct=1이 있고 kvm_mmu_page_get_gfn()은 4KB 페이지에 대한 gfn을 다음과 같이 계산합니다. sp->shadowed_translation[](또는 sp->gfns[]를 사용하는 대신 sp->gfn + 인덱스 이전 커널에서는). 따라서 기록된 항목을 제거하지 못합니다.
memslot이 삭제되면 섀도우 페이지는 해제되지만 rmap은 해제됩니다. 이미 수정된 시나리오에서와 같이 항목이 유지됩니다. 다음과 같은 코드를 작성하세요. 나중에 gfn(더티 로깅, MMU 알리미 무효화 및 등등) 해제된 페이지에 있는 sptep을 역참조하여 무료 후 사용.
왜 이 VPI인가 (설명가능 · 실험적)
VPI 산정 기준
| 영향도 | 88.00 |
| 악용 신호(추가 악용신호 없음) | ×1.00 |
| VPI | 88.00 |
VPI 공식 vpi-v1 기준