|
Message-ID: <eeba7607-f920-2c34-1906-6517a00cd2a5@redhat.com> Date: Thu, 13 Apr 2017 16:39:07 -0700 From: Laura Abbott <labbott@...hat.com> To: Kees Cook <keescook@...omium.org>, kernel-hardening@...ts.openwall.com Cc: Michael Leibowitz <michael.leibowitz@...el.com> Subject: Re: [PATCH 00/18] Introduce struct layout randomization plugin On 04/06/2017 02:18 PM, Kees Cook wrote: > This series brings grsecurity's structure layout randomization plugin > to upstream. The 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. 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. It is > most useful to "in-house" kernel builds where the randomization seed > is not available to an attacker. > > One requirement of the plugin is that randomized structures must use > designated initializers. Many of these have been landing already as > I've been sending them over the past couple months, but there are > still some stragglers, which are included here. > > Another area to address are places where randomized structures are > cast to other structures, since there may be implicit positional > details that need to be addressed. Luckily, there are only a few > of these false positives, and they have been worked around either > by adjusting the source or whitelisting them in the plugin. > > The plugin selects structures in two ways: manually marked with the > new __randomize_layout annotation, or automatically when a structure > is found to consist entirely of function pointers (which can be opted > out of with the new __no_randomize_layout annotation). > > A structure that is especially sensitive and regularly abused in > exploits is task_struct, but randomizing it requires some special > handling due to some fields needing to be at the start and end. To > deal with this, an internal anonymous struct is used to mark the > portion that will be randomized. I'd love feedback on whether I > should bite the bullet and perform indenting or violate indenting > rules to avoid a massive white-space change. > > As mentioned, the bulk of this feature is ported over from grsecurity. > The implementation is almost entirely identical to the original code > written by Brad Spengler and the PaX Team and Brad Spengler. The > changes are addition of improved designated initializer markings, > a whitelisting mechanism, and a different approach to handling the > task_struct randomization. > > I've been doing boot tests with instrumentation showing successfully > changing offsets within the task_struct, which ran overnight without > problems. So far, the 0day builder hasn't alerted on anything, but > it's probably still a bit early. > > This series is based on next-20170404. > > Patches are: > > [PATCH 01/18] gcc-plugins: Add the randstruct plugin > The plugin itself, with struct auto-detection disabled. > > [PATCH 02/18] compiler: Add __designated_init annotation > [PATCH 03/18] randstruct: Set designated_init attribute > Adds marking of structures needing designated initialization. > > [PATCH 04/18] randstruct: Differentiate bad cast warnings > Minor clarifications to bad cast warning output. > > [PATCH 05/18] af_unix: Use designated initializers > Designated initializer fix for af_unix (taken for -next already) > https://lkml.org/lkml/2017/4/6/846 > > [PATCH 06/18] NFS: Avoid cross-structure casting > Avoids a false positive in casting (waiting for feedback) > https://lkml.org/lkml/2017/4/5/530 > > [PATCH 07/18] randstruct: Whitelist struct security_hook_heads cast > [PATCH 08/18] randstruct: Whitelist UNIXCB cast > Whitelist two more false positive cases where source-level > fixes aren't obvious/possible. > > [PATCH 09/18] randstruct: Mark various structs for randomization > Adds the manual annotation for structures to randomize. > > [PATCH 10/18] scsi/bfa: use designated initializers > [PATCH 11/18] scsi: qedi,qedf: Use designated initializers > [PATCH 12/18] ovl: Use designated initializers > The remaining designated initializer fixes for automatic > struct randomization. > > [PATCH 13/18] randstruct: opt-out externally exposed function pointer > Opt out of some externally-exposed structs that would be > otherwise automatically randomized. > > [PATCH 14/18] randstruct: Disable randomization of ACPICA structs > Temporary disabling of automatic randomization of ACPICA struct. > > [PATCH 15/18] randstruct: Enable function pointer struct detection > Enables automatic struct randomization. > > [PATCH 16/18] task_struct: Allow randomized layout > Adds selected portion of task_struct to be randomized. > > [PATCH 17/18] sgi-xp: Use designated initializers > Enable randomization of sgi-xp struct, pending feedback. > https://lkml.org/lkml/2017/3/29/808 > > [PATCH 18/18] ACPICA: Use designated initializers > Enable randomization of ACPICA struct, pending feedback. > https://github.com/acpica/acpica/pull/248/ > > Testing/feedback appreciated! > > -Kees > I gave this a quick spin on my aarch64 Rawhide machine. I needed to change the following to work with gcc7 diff --git a/scripts/gcc-plugins/randomize_layout_plugin.c b/scripts/gcc-plugins/randomize_layout_plugin.c index a2d7e933c33f..8dd5134f161a 100644 --- a/scripts/gcc-plugins/randomize_layout_plugin.c +++ b/scripts/gcc-plugins/randomize_layout_plugin.c @@ -529,8 +529,8 @@ static void randomize_layout_finish_decl(void *event_data, void *data) DECL_SIZE(decl) = 0; DECL_SIZE_UNIT(decl) = 0; - DECL_ALIGN(decl) = 0; - DECL_MODE (decl) = VOIDmode; + SET_DECL_ALIGN(decl, 0); + SET_DECL_MODE(decl, VOIDmode); SET_DECL_RTL(decl, 0); update_decl_size(decl); layout_decl(decl, 0); It boots but dies with a bunch of kernel faults somewhere after reaching userspace. I'll pick up the debugging next week. Thanks, Laura
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.