forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge tag 'stackleak-v4.20-rc1' of git://git.kernel.org/pub/scm/linux…
…/kernel/git/kees/linux Pull stackleak gcc plugin from Kees Cook: "Please pull this new GCC plugin, stackleak, for v4.20-rc1. This plugin was ported from grsecurity by Alexander Popov. It provides efficient stack content poisoning at syscall exit. This creates a defense against at least two classes of flaws: - Uninitialized stack usage. (We continue to work on improving the compiler to do this in other ways: e.g. unconditional zero init was proposed to GCC and Clang, and more plugin work has started too). - Stack content exposure. By greatly reducing the lifetime of valid stack contents, exposures via either direct read bugs or unknown cache side-channels become much more difficult to exploit. This complements the existing buddy and heap poisoning options, but provides the coverage for stacks. The x86 hooks are included in this series (which have been reviewed by Ingo, Dave Hansen, and Thomas Gleixner). The arm64 hooks have already been merged through the arm64 tree (written by Laura Abbott and reviewed by Mark Rutland and Will Deacon). With VLAs having been removed this release, there is no need for alloca() protection, so it has been removed from the plugin" * tag 'stackleak-v4.20-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux: arm64: Drop unneeded stackleak_check_alloca() stackleak: Allow runtime disabling of kernel stack erasing doc: self-protection: Add information about STACKLEAK feature fs/proc: Show STACKLEAK metrics in the /proc file system lkdtm: Add a test for STACKLEAK gcc-plugins: Add STACKLEAK plugin for tracking the kernel stack x86/entry: Add STACKLEAK erasing the kernel stack at the end of syscalls
- Loading branch information
Showing
24 changed files
with
841 additions
and
28 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,73 @@ | ||
// SPDX-License-Identifier: GPL-2.0 | ||
/* | ||
* This code tests that the current task stack is properly erased (filled | ||
* with STACKLEAK_POISON). | ||
* | ||
* Authors: | ||
* Alexander Popov <[email protected]> | ||
* Tycho Andersen <[email protected]> | ||
*/ | ||
|
||
#include "lkdtm.h" | ||
#include <linux/stackleak.h> | ||
|
||
void lkdtm_STACKLEAK_ERASING(void) | ||
{ | ||
unsigned long *sp, left, found, i; | ||
const unsigned long check_depth = | ||
STACKLEAK_SEARCH_DEPTH / sizeof(unsigned long); | ||
|
||
/* | ||
* For the details about the alignment of the poison values, see | ||
* the comment in stackleak_track_stack(). | ||
*/ | ||
sp = PTR_ALIGN(&i, sizeof(unsigned long)); | ||
|
||
left = ((unsigned long)sp & (THREAD_SIZE - 1)) / sizeof(unsigned long); | ||
sp--; | ||
|
||
/* | ||
* One 'long int' at the bottom of the thread stack is reserved | ||
* and not poisoned. | ||
*/ | ||
if (left > 1) { | ||
left--; | ||
} else { | ||
pr_err("FAIL: not enough stack space for the test\n"); | ||
return; | ||
} | ||
|
||
pr_info("checking unused part of the thread stack (%lu bytes)...\n", | ||
left * sizeof(unsigned long)); | ||
|
||
/* | ||
* Search for 'check_depth' poison values in a row (just like | ||
* stackleak_erase() does). | ||
*/ | ||
for (i = 0, found = 0; i < left && found <= check_depth; i++) { | ||
if (*(sp - i) == STACKLEAK_POISON) | ||
found++; | ||
else | ||
found = 0; | ||
} | ||
|
||
if (found <= check_depth) { | ||
pr_err("FAIL: thread stack is not erased (checked %lu bytes)\n", | ||
i * sizeof(unsigned long)); | ||
return; | ||
} | ||
|
||
pr_info("first %lu bytes are unpoisoned\n", | ||
(i - found) * sizeof(unsigned long)); | ||
|
||
/* The rest of thread stack should be erased */ | ||
for (; i < left; i++) { | ||
if (*(sp - i) != STACKLEAK_POISON) { | ||
pr_err("FAIL: thread stack is NOT properly erased\n"); | ||
return; | ||
} | ||
} | ||
|
||
pr_info("OK: the rest of the thread stack is properly erased\n"); | ||
return; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
/* SPDX-License-Identifier: GPL-2.0 */ | ||
#ifndef _LINUX_STACKLEAK_H | ||
#define _LINUX_STACKLEAK_H | ||
|
||
#include <linux/sched.h> | ||
#include <linux/sched/task_stack.h> | ||
|
||
/* | ||
* Check that the poison value points to the unused hole in the | ||
* virtual memory map for your platform. | ||
*/ | ||
#define STACKLEAK_POISON -0xBEEF | ||
#define STACKLEAK_SEARCH_DEPTH 128 | ||
|
||
#ifdef CONFIG_GCC_PLUGIN_STACKLEAK | ||
#include <asm/stacktrace.h> | ||
|
||
static inline void stackleak_task_init(struct task_struct *t) | ||
{ | ||
t->lowest_stack = (unsigned long)end_of_stack(t) + sizeof(unsigned long); | ||
# ifdef CONFIG_STACKLEAK_METRICS | ||
t->prev_lowest_stack = t->lowest_stack; | ||
# endif | ||
} | ||
|
||
#ifdef CONFIG_STACKLEAK_RUNTIME_DISABLE | ||
int stack_erasing_sysctl(struct ctl_table *table, int write, | ||
void __user *buffer, size_t *lenp, loff_t *ppos); | ||
#endif | ||
|
||
#else /* !CONFIG_GCC_PLUGIN_STACKLEAK */ | ||
static inline void stackleak_task_init(struct task_struct *t) { } | ||
#endif | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.