2 # SPDX-License-Identifier: GPL-2.0
4 # Measure kernel stack entropy by sampling via LKDTM's REPORT_STACK test.
7 TRIGGER
=/sys
/kernel
/debug
/provoke-crash
/DIRECT
10 # Verify we have LKDTM available in the kernel.
11 if [ ! -r $TRIGGER ] ; then
12 /sbin
/modprobe
-q lkdtm || true
13 if [ ! -r $TRIGGER ] ; then
14 echo "Cannot find $TRIGGER (missing CONFIG_LKDTM?)"
16 echo "Cannot write $TRIGGER (need to run as root?)"
19 exit $KSELFTEST_SKIP_TEST
22 # Capture dmesg continuously since it may fill up depending on sample size.
23 log
=$
(mktemp
-t stack-entropy-XXXXXX
)
24 dmesg
--follow >"$log" & pid
=$
!
26 for i
in $
(seq 1 $samples); do
27 echo "REPORT_STACK" > $TRIGGER
29 percent
=$
(( 100 * $i / $samples ))
30 if [ "$percent" -ne "$report" ]; then
31 /bin
/echo -en "$percent%\r"
38 # Count unique offsets since last run.
39 seen
=$
(tac "$log" |
grep -m1 -B"$samples"0 'Starting stack offset' | \
40 grep 'Stack offset' |
awk '{print $NF}' |
sort |
uniq -c |
wc -l)
41 bits
=$
(echo "obase=2; $seen" |
bc |
wc -L)
42 echo "Bits of stack entropy: $bits"
45 # We would expect any functional stack randomization to be at least 5 bits.
46 if [ "$bits" -lt 5 ]; then
47 echo "Stack entropy is low! Booted without 'randomize_kstack_offset=y'?"