Thread (148 messages) 148 messages, 17 authors, 2022-06-09

Re: [PATCH 18/35] mm: Add guard pages around a shadow stack.

From: Andy Lutomirski <luto@kernel.org>
Date: 2022-02-11 17:54:17
Also in: linux-arch, linux-doc, linux-mm, lkml

On 2/10/22 15:40, Edgecombe, Rick P wrote:
On Thu, 2022-02-10 at 15:07 -0800, Andy Lutomirski wrote:
quoted
On Thu, Feb 10, 2022 at 2:44 PM Dave Hansen [off-list ref]
wrote:
quoted
On 1/30/22 13:18, Rick Edgecombe wrote:
quoted
INCSSP(Q/D) increments shadow stack pointer and 'pops and
discards' the
first and the last elements in the range, effectively touches
those memory
areas.

The maximum moving distance by INCSSPQ is 255 * 8 = 2040 bytes
and
255 * 4 = 1020 bytes by INCSSPD.  Both ranges are far from
PAGE_SIZE.
Thus, putting a gap page on both ends of a shadow stack prevents
INCSSP,
CALL, and RET from going beyond.
What is the downside of not applying this patch?  The shadow stack
gap
is 1MB instead of 4k?

That, frankly, doesn't seem too bad.  How badly do we *need* this
patch?
Like just using VM_SHADOW_STACK | VM_GROWSDOWN to get a regular stack
sized gap? I think it could work. It also simplifies the mm->stack_vm
accounting.
Seems not crazy.  Do we want automatically growing shadow stacks?  I 
don't really like the historical unix behavior where the main thread has 
a sort-of-infinite stack and every other thread has a fixed stack.
It would no longer get a gap at the end though. I don't think it's
needed.
I may have missed something about the oddball way the mm code works, but 
it seems if you have a gap at one end of every shadow stack, you 
automatically have a gap at the other end.

Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help