• Ladi Prosek's avatar
    KVM: MMU: always terminate page walks at level 1 · 829ee279
    Ladi Prosek authored
    is_last_gpte() is not equivalent to the pseudo-code given in commit
    6bb69c9b ("KVM: MMU: simplify last_pte_bitmap") because an incorrect
    value of last_nonleaf_level may override the result even if level == 1.
    
    It is critical for is_last_gpte() to return true on level == 1 to
    terminate page walks. Otherwise memory corruption may occur as level
    is used as an index to various data structures throughout the page
    walking code.  Even though the actual bug would be wherever the MMU is
    initialized (as in the previous patch), be defensive and ensure here
    that is_last_gpte() returns the correct value.
    
    This patch is also enough to fix CVE-2017-12188.
    
    Fixes: 6bb69c9b
    Cc: stable@vger.kernel.org
    Cc: Andy Honig <ahonig@google.com>
    Signed-off-by: default avatarLadi Prosek <lprosek@redhat.com>
    [Panic if walk_addr_generic gets an incorrect level; this is a serious
     bug and it's not worth a WARN_ON where the recovery path might hide
     further exploitable issues; suggested by Andrew Honig. - Paolo]
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    829ee279
mmu.c 141 KB