linux/scripts
Kees Cook 313dd1b629 gcc-plugins: Add the randstruct plugin
This randstruct plugin is modified from Brad Spengler/PaX Team's code
in the last public patch of grsecurity/PaX based on my understanding
of the code. Changes or omissions from the original code are mine and
don't reflect the original grsecurity/PaX code.

The randstruct GCC plugin randomizes the layout of selected structures
at compile time, as a probabilistic defense against attacks that need to
know the layout of structures within the kernel. This is most useful for
"in-house" kernel builds where neither the randomization seed nor other
build artifacts are made available to an attacker. While less useful for
distribution kernels (where the randomization seed must be exposed for
third party kernel module builds), it still has some value there since now
all kernel builds would need to be tracked by an attacker.

In more performance sensitive scenarios, GCC_PLUGIN_RANDSTRUCT_PERFORMANCE
can be selected to make a best effort to restrict randomization to
cacheline-sized groups of elements, and will not randomize bitfields. This
comes at the cost of reduced randomization.

Two annotations are defined,__randomize_layout and __no_randomize_layout,
which respectively tell the plugin to either randomize or not to
randomize instances of the struct in question. Follow-on patches enable
the auto-detection logic for selecting structures for randomization
that contain only function pointers. It is disabled here to assist with
bisection.

Since any randomized structs must be initialized using designated
initializers, __randomize_layout includes the __designated_init annotation
even when the plugin is disabled so that all builds will require
the needed initialization. (With the plugin enabled, annotations for
automatically chosen structures are marked as well.)

The main differences between this implemenation and grsecurity are:
- disable automatic struct selection (to be enabled in follow-up patch)
- add designated_init attribute at runtime and for manual marking
- clarify debugging output to differentiate bad cast warnings
- add whitelisting infrastructure
- support gcc 7's DECL_ALIGN and DECL_MODE changes (Laura Abbott)
- raise minimum required GCC version to 4.7

Earlier versions of this patch series were ported by Michael Leibowitz.

Signed-off-by: Kees Cook <keescook@chromium.org>
2017-06-22 16:15:45 -07:00
..
basic
coccinelle drm: Introduce drm_property_blob_{get,put}() 2017-02-28 16:16:46 +01:00
dtc DeviceTree fixes for 4.12-rc: 2017-05-19 15:03:24 -07:00
gcc-plugins gcc-plugins: Add the randstruct plugin 2017-06-22 16:15:45 -07:00
gdb
genksyms Merge branch 'kbuild' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild 2017-03-11 01:18:25 +09:00
kconfig gconfig: remove misleading parentheses around a condition 2017-03-22 02:56:33 +09:00
ksymoops Fix dead URLs to ftp.kernel.org 2017-03-28 16:16:52 +02:00
mod kbuild: Consolidate header generation from ASM offset information 2017-04-13 05:43:37 +09:00
package Kbuild misc updates for 4.12 2017-05-10 20:41:43 -07:00
selinux selinux: include sys/socket.h in host programs to have PF_MAX 2017-03-10 15:09:27 -05:00
tracing
.gitignore
adjust_autoksyms.sh
asn1_compiler.c
bloat-o-meter
bootgraph.pl
check-lc_ctype.c
check_00index.sh
check_extable.sh
checkincludes.pl scripts/checkincludes.pl: add exit message for no duplicates found 2017-02-22 16:41:26 -08:00
checkkconfigsymbols.py
checkpatch.pl checkpatch: improve the SUSPECT_CODE_INDENT test 2017-05-08 17:15:11 -07:00
checkstack.pl scripts: remove AVR32 support from checkstack.pl 2017-05-01 09:27:15 +02:00
checksyscalls.sh x86/syscalls/32: Ignore arch_prctl for other architectures 2017-03-24 14:13:55 +01:00
checkversion.pl
cleanfile
cleanpatch
coccicheck
config
conmakehash.c
const_structs.checkpatch
decode_stacktrace.sh
decodecode
depmod.sh
diffconfig
docproc.c
export_report.pl
extract-cert.c
extract-ikconfig
extract-module-sig.pl
extract-sys-certs.pl
extract-vmlinux
extract_xc3028.pl
faddr2line
gcc-goto.sh
gcc-ld
gcc-plugin.sh
gcc-version.sh
gcc-x86_32-has-stack-protector.sh
gcc-x86_64-has-stack-protector.sh
gen_initramfs_list.sh
get_dvb_firmware
get_maintainer.pl
gfp-translate
headerdep.pl
headers.sh
headers_check.pl
headers_install.sh
insert-sys-cert.c
kallsyms.c
Kbuild.include Kbuild updates for v4.12 2017-05-10 20:11:05 -07:00
kernel-doc scripts/kernel-doc: fix handling of parameters with parenthesis 2017-04-02 14:06:56 -06:00
kernel-doc-xml-ref
ld-version.sh
Lindent scripts/Lindent: clean up and optimize 2017-02-22 16:41:26 -08:00
link-vmlinux.sh
Makefile
Makefile.asm-generic
Makefile.build objtool: make it visible in make V=1 output 2017-05-03 13:39:37 +09:00
Makefile.clean
Makefile.dtbinst kbuild: dtbinst: remove unnecessary __dtbs_install_prep target 2017-05-08 07:26:06 +09:00
Makefile.extrawarn kbuild: drop -Wno-unknown-warning-option from clang options 2017-04-23 16:09:15 +09:00
Makefile.fwinst
Makefile.gcc-plugins gcc-plugins: Add the randstruct plugin 2017-06-22 16:15:45 -07:00
Makefile.headersinst kbuild: skip install/check of headers right under uapi directories 2017-05-18 02:17:45 +09:00
Makefile.help
Makefile.host
Makefile.kasan
Makefile.lib devicetree: Move include prefixes from arch to separate directory 2017-05-18 23:55:48 -07:00
Makefile.modbuiltin
Makefile.modinst
Makefile.modpost
Makefile.modsign
Makefile.ubsan
makelst
markup_oops.pl
mkcompile_h
mkmakefile
mksysmap
mkuboot.sh
mkversion
module-common.lds module: set .init_array alignment to 8 2017-03-13 09:40:28 -07:00
namespace.pl
objdiff scripts: objdiff: Ignore debug info when comparing 2017-03-11 11:13:38 +09:00
patch-kernel
pnmtologo.c
profile2linkerlist.pl
prune-kernel
recordmcount.c ftrace: Allow for function tracing to record init functions on boot up 2017-03-24 20:51:49 -04:00
recordmcount.h
recordmcount.pl ftrace: Allow for function tracing to record init functions on boot up 2017-03-24 20:51:49 -04:00
setlocalversion
show_delta
sign-file.c
sortextable.c
sortextable.h
spelling.txt treewide: spelling: correct diffrent[iate] and banlance typos 2017-05-08 17:15:13 -07:00
stackdelta
stackusage
tags.sh scripts/tags.sh: include arch/Kconfig* for tags generation 2017-02-22 16:41:26 -08:00
unifdef.c
ver_linux ver_linux: Use /usr/bin/awk instead of /bin/awk 2017-04-08 18:03:42 +02:00
xen-hypercalls.sh
xz_wrap.sh