mirror of
https://github.com/tbsdtv/linux_media.git
synced 2025-07-23 04:33:26 +02:00
gcc-plugins: Add STACKLEAK plugin for tracking the kernel stack
The STACKLEAK feature erases the kernel stack before returning from syscalls. That reduces the information which kernel stack leak bugs can reveal and blocks some uninitialized stack variable attacks. This commit introduces the STACKLEAK gcc plugin. It is needed for tracking the lowest border of the kernel stack, which is important for the code erasing the used part of the kernel stack at the end of syscalls (comes in a separate commit). The STACKLEAK feature is ported from grsecurity/PaX. More information at: https://grsecurity.net/ https://pax.grsecurity.net/ This code is modified from Brad Spengler/PaX Team's code in the last public patch of grsecurity/PaX based on our understanding of the code. Changes or omissions from the original code are ours and don't reflect the original grsecurity/PaX code. Signed-off-by: Alexander Popov <alex.popov@linux.com> Tested-by: Laura Abbott <labbott@redhat.com> Signed-off-by: Kees Cook <keescook@chromium.org>
This commit is contained in:
committed by
Kees Cook
parent
afaef01c00
commit
10e9ae9fab
@@ -60,3 +60,31 @@ asmlinkage void stackleak_erase(void)
|
||||
current->lowest_stack = current_top_of_stack() - THREAD_SIZE/64;
|
||||
}
|
||||
|
||||
void __used stackleak_track_stack(void)
|
||||
{
|
||||
/*
|
||||
* N.B. stackleak_erase() fills the kernel stack with the poison value,
|
||||
* which has the register width. That code assumes that the value
|
||||
* of 'lowest_stack' is aligned on the register width boundary.
|
||||
*
|
||||
* That is true for x86 and x86_64 because of the kernel stack
|
||||
* alignment on these platforms (for details, see 'cc_stack_align' in
|
||||
* arch/x86/Makefile). Take care of that when you port STACKLEAK to
|
||||
* new platforms.
|
||||
*/
|
||||
unsigned long sp = (unsigned long)&sp;
|
||||
|
||||
/*
|
||||
* Having CONFIG_STACKLEAK_TRACK_MIN_SIZE larger than
|
||||
* STACKLEAK_SEARCH_DEPTH makes the poison search in
|
||||
* stackleak_erase() unreliable. Let's prevent that.
|
||||
*/
|
||||
BUILD_BUG_ON(CONFIG_STACKLEAK_TRACK_MIN_SIZE > STACKLEAK_SEARCH_DEPTH);
|
||||
|
||||
if (sp < current->lowest_stack &&
|
||||
sp >= (unsigned long)task_stack_page(current) +
|
||||
sizeof(unsigned long)) {
|
||||
current->lowest_stack = sp;
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(stackleak_track_stack);
|
||||
|
Reference in New Issue
Block a user