Merge tag 'x86-entry-2021-04-26' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull entry code update from Thomas Gleixner: "Provide support for randomized stack offsets per syscall to make stack-based attacks harder which rely on the deterministic stack layout. The feature is based on the original idea of PaX's RANDSTACK feature, but uses a significantly different implementation. The offset does not affect the pt_regs location on the task stack as this was agreed on to be of dubious value. The offset is applied before the actual syscall is invoked. The offset is stored per cpu and the randomization happens at the end of the syscall which is less predictable than on syscall entry. The mechanism to apply the offset is via alloca(), i.e. abusing the dispised VLAs. This comes with the drawback that stack-clash-protection has to be disabled for the affected compilation units and there is also a negative interaction with stack-protector. Those downsides are traded with the advantage that this approach does not require any intrusive changes to the low level assembly entry code, does not affect the unwinder and the correct stack alignment is handled automatically by the compiler. The feature is guarded with a static branch which avoids the overhead when disabled. Currently this is supported for X86 and ARM64" * tag 'x86-entry-2021-04-26' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: arm64: entry: Enable random_kstack_offset support lkdtm: Add REPORT_STACK for checking stack offsets x86/entry: Enable random_kstack_offset support stack: Optionally randomize kernel stack offset each syscall init_on_alloc: Optimize static branches jump_label: Provide CONFIG-driven build state defaults
This commit is contained in:
1
tools/testing/selftests/lkdtm/.gitignore
vendored
1
tools/testing/selftests/lkdtm/.gitignore
vendored
@@ -1,2 +1,3 @@
|
||||
*.sh
|
||||
!run.sh
|
||||
!stack-entropy.sh
|
||||
|
||||
@@ -5,6 +5,7 @@ include ../lib.mk
|
||||
|
||||
# NOTE: $(OUTPUT) won't get default value if used before lib.mk
|
||||
TEST_FILES := tests.txt
|
||||
TEST_PROGS := stack-entropy.sh
|
||||
TEST_GEN_PROGS = $(patsubst %,$(OUTPUT)/%.sh,$(shell awk '{print $$1}' tests.txt | sed -e 's/\#//'))
|
||||
all: $(TEST_GEN_PROGS)
|
||||
|
||||
|
||||
36
tools/testing/selftests/lkdtm/stack-entropy.sh
Executable file
36
tools/testing/selftests/lkdtm/stack-entropy.sh
Executable file
@@ -0,0 +1,36 @@
|
||||
#!/bin/sh
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
#
|
||||
# Measure kernel stack entropy by sampling via LKDTM's REPORT_STACK test.
|
||||
set -e
|
||||
samples="${1:-1000}"
|
||||
|
||||
# Capture dmesg continuously since it may fill up depending on sample size.
|
||||
log=$(mktemp -t stack-entropy-XXXXXX)
|
||||
dmesg --follow >"$log" & pid=$!
|
||||
report=-1
|
||||
for i in $(seq 1 $samples); do
|
||||
echo "REPORT_STACK" >/sys/kernel/debug/provoke-crash/DIRECT
|
||||
if [ -t 1 ]; then
|
||||
percent=$(( 100 * $i / $samples ))
|
||||
if [ "$percent" -ne "$report" ]; then
|
||||
/bin/echo -en "$percent%\r"
|
||||
report="$percent"
|
||||
fi
|
||||
fi
|
||||
done
|
||||
kill "$pid"
|
||||
|
||||
# Count unique offsets since last run.
|
||||
seen=$(tac "$log" | grep -m1 -B"$samples"0 'Starting stack offset' | \
|
||||
grep 'Stack offset' | awk '{print $NF}' | sort | uniq -c | wc -l)
|
||||
bits=$(echo "obase=2; $seen" | bc | wc -L)
|
||||
echo "Bits of stack entropy: $bits"
|
||||
rm -f "$log"
|
||||
|
||||
# We would expect any functional stack randomization to be at least 5 bits.
|
||||
if [ "$bits" -lt 5 ]; then
|
||||
exit 1
|
||||
else
|
||||
exit 0
|
||||
fi
|
||||
Reference in New Issue
Block a user