lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Message-ID: <Yweu1dvkJ8aV+C+T@google.com> Date: Thu, 25 Aug 2022 17:18:13 +0000 From: Sean Christopherson <seanjc@...gle.com> To: Peter Zijlstra <peterz@...radead.org> Cc: Dave Hansen <dave.hansen@...el.com>, x86@...nel.org, linux-kernel@...r.kernel.org, linux-hardening@...r.kernel.org, keescook@...omium.org Subject: Re: [PATCH] x86/mm: Refuse W^X violations On Thu, Aug 25, 2022, Peter Zijlstra wrote: > > x86 has STRICT_*_RWX, but not even a warning when someone violates it. > > Add this warning and fully refuse the transition. > > Signed-off-by: Peter Zijlstra (Intel) <peterz@...radead.org> > --- > diff --git a/arch/x86/mm/pat/set_memory.c b/arch/x86/mm/pat/set_memory.c > index 1abd5438f126..9e9bef3f36b3 100644 > --- a/arch/x86/mm/pat/set_memory.c > +++ b/arch/x86/mm/pat/set_memory.c > @@ -579,6 +579,30 @@ static inline pgprot_t static_protections(pgprot_t prot, unsigned long start, > return __pgprot(pgprot_val(prot) & ~forbidden); > } > > +/* > + * Validate and enforce strict W^X semantics. > + */ > +static inline pgprot_t verify_rwx(pgprot_t old, pgprot_t new, unsigned long start, > + unsigned long pfn, unsigned long npg) > +{ > + unsigned long end; > + I think this needs if (!(__supported_pte_mask & _PAGE_NX)) return new; to play nice with non-PAE 32-bit kernels. > + if (!((pgprot_val(old) ^ pgprot_val(new)) & (_PAGE_RW | _PAGE_NX))) > + return new; > + > + if ((pgprot_val(new) & (_PAGE_RW | _PAGE_NX)) != _PAGE_RW) > + return new; > + > + end = start + npg * PAGE_SIZE - 1; > + WARN(1, "CPA refuse W^X violation: %016llx -> %016llx range: 0x%016lx - 0x%016lx PFN %lx\n", WARN_ONCE() to avoid eternal spam if something does go sideways? > + (unsigned long long)pgprot_val(old), > + (unsigned long long)pgprot_val(new), > + start, end, pfn); > + > + /* refuse the transition into WX */ > + return old; > +}
Powered by blists - more mailing lists