stack arenas using alloca

Michael Clark michaeljclark@mac.com
Fri Aug 23 06:41:51 GMT 2024


On 8/23/24 15:57, Michael Clark wrote:
> On 8/23/24 15:46, Michael Clark wrote:
>> one more thing. it doesn't require PT_GNU_STACK or writable stacks 
>> like GCC nested functions. 🙂 so I think it is safer but it does have 
>> safety issues, mostly related to stack overflows but its going to need 
>> some careful analysis with respect to ROP.
> 
> brain isn't working. of course it needs writable stacks. it doesn't need 
> executable stacks. starting to think about [[allocareturn]] ROP...

if you loaded the return address from the fixed frame in the epilogue 
into a temporary during restore of callee save registers which usually 
unwinds the dynamic offset, you could translate the return instruction 
into an indirect branch. that gives similar ROP protection to functions 
without dynamic alloca returns.

then the biggest problem is stack overflows. we can use alloca anyway 
just we have to call the function twice with some funky convention that 
suppresses array writes for null pointers because we have to call it in 
the parent frame. this just makes it somewhat more useful for functions 
returning lists where you don't want to allocate on the heap.

if you don't have any side effects in loops besides array writes, you 
could have some funky feature where you run the loop once for a size. I 
tend to write a lot of code like that by hand and hate it. just look at 
code that uses the Vulkan API. it is full of client code that does that.

that's sort of where this line of thinking emerged. it makes it harder 
if you want to write to either stack or heap/data though because you 
need a couple of different translations of the function. I would like 
implicitly deduced memory region qualifiers like _StackRegion, 
_DataRegion, _HeapRegion, and _ThreadRegion for TLS. and i'm making the 
assumption the stack is data race free which it is 99.9% of the time. 
then you can implicitly typedef _StackRegion MyType MyType in metadata 
for a translation that has an input type with _StackRegion.

I'd like an OS where stack can only escape to fibres and fibres can only 
run on one OS thread. that way we could allocate page table roots or 
overlay page tables for threads to make stack fault when accessed by 
another thread. grsecurity already does this for Linux kernel threads.

Michael.


More information about the Gcc mailing list