]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
x86/mm: Use lookup_address_in_pgd_attr() in show_fault_oops()
authorJuergen Gross <jgross@suse.com>
Fri, 12 Apr 2024 15:12:56 +0000 (17:12 +0200)
committerIngo Molnar <mingo@kernel.org>
Sun, 14 Apr 2024 20:16:27 +0000 (22:16 +0200)
Fix show_fault_oops() to not only look at the leaf PTE for detecting
NX violations, but to use the effective NX value returned by
lookup_address_in_pgd_attr() instead.

Signed-off-by: Juergen Gross <jgross@suse.com>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Link: https://lore.kernel.org/r/20240412151258.9171-3-jgross@suse.com
arch/x86/mm/fault.c

index 622d12ec7f08518ba6701c33efd74d5f77545806..6b2ca8ba75b874c9c452a595da592acb54f5eb08 100644 (file)
@@ -514,18 +514,19 @@ show_fault_oops(struct pt_regs *regs, unsigned long error_code, unsigned long ad
 
        if (error_code & X86_PF_INSTR) {
                unsigned int level;
+               bool nx, rw;
                pgd_t *pgd;
                pte_t *pte;
 
                pgd = __va(read_cr3_pa());
                pgd += pgd_index(address);
 
-               pte = lookup_address_in_pgd(pgd, address, &level);
+               pte = lookup_address_in_pgd_attr(pgd, address, &level, &nx, &rw);
 
-               if (pte && pte_present(*pte) && !pte_exec(*pte))
+               if (pte && pte_present(*pte) && (!pte_exec(*pte) || nx))
                        pr_crit("kernel tried to execute NX-protected page - exploit attempt? (uid: %d)\n",
                                from_kuid(&init_user_ns, current_uid()));
-               if (pte && pte_present(*pte) && pte_exec(*pte) &&
+               if (pte && pte_present(*pte) && pte_exec(*pte) && !nx &&
                                (pgd_flags(*pgd) & _PAGE_USER) &&
                                (__read_cr4() & X86_CR4_SMEP))
                        pr_crit("unable to execute userspace code (SMEP?) (uid: %d)\n",