lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [day] [month] [year] [list]
Date:   Mon, 17 Jul 2017 13:24:35 -0700
From:   Kees Cook <keescook@...omium.org>
To:     Linus Torvalds <torvalds@...ux-foundation.org>
Cc:     linux-kernel@...r.kernel.org
Subject: [GIT PULL] gcc-plugins updates for v4.13-rc2

Hi,

Please pull these gcc-plugins changes for v4.13-rc2. Now that IPC and
other trees have landed, it's sensible to pull the manual markings
portion of randstruct. This is the rest of what was staged in -next for
the gcc-plugins, and comes in three patches, largest first:
- mark "easy" structs with __randomize_layout
- mark task_struct with an optional anonymous struct to isolate the
  __randomize_layout section
- mark structs to opt _out_ of automated marking (which will come later)

Various (trivial) merge conflicts exist due to additions to structures.
Since there were more than a couple, I thought I'd just send along how
I solved the conflicts when I did the merge to your tree this morning,
if it helps:

diff --cc fs/proc/internal.h
index 18694598bebf,07b16318223f..aa2b89071630
--- a/fs/proc/internal.h
+++ b/fs/proc/internal.h
@@@ -67,10 -67,10 +67,10 @@@ struct proc_inode 
  	struct proc_dir_entry *pde;
  	struct ctl_table_header *sysctl;
  	struct ctl_table *sysctl_entry;
 -	struct list_head sysctl_inodes;
 +	struct hlist_node sysctl_inodes;
  	const struct proc_ns_operations *ns_ops;
  	struct inode vfs_inode;
- };
+ } __randomize_layout;
  
  /*
   * General functions
diff --cc include/linux/fs.h
index 7b5d6816542b,8f28143486c4..6e1fd5d21248
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@@ -295,8 -275,7 +295,8 @@@ struct kiocb 
  	void (*ki_complete)(struct kiocb *iocb, long ret, long ret2);
  	void			*private;
  	int			ki_flags;
 +	enum rw_hint		ki_hint;
- };
+ } __randomize_layout;
  
  static inline bool is_sync_kiocb(struct kiocb *kiocb)
  {
@@@ -403,8 -392,7 +403,8 @@@ struct address_space 
  	gfp_t			gfp_mask;	/* implicit gfp mask for allocations */
  	struct list_head	private_list;	/* ditto */
  	void			*private_data;	/* ditto */
 +	errseq_t		wb_err;
- } __attribute__((aligned(sizeof(long))));
+ } __attribute__((aligned(sizeof(long)))) __randomize_layout;
  	/*
  	 * On most architectures that alignment is already the case; but
  	 * must be enforced here for CRIS, to let the least significant bit
@@@ -882,8 -868,8 +882,9 @@@ struct file 
  	struct list_head	f_tfile_llink;
  #endif /* #ifdef CONFIG_EPOLL */
  	struct address_space	*f_mapping;
 +	errseq_t		f_wb_err;
- } __attribute__((aligned(4)));	/* lest something weird decides that 2 is OK */
+ } __randomize_layout
+   __attribute__((aligned(4)));	/* lest something weird decides that 2 is OK */
  
  struct file_handle {
  	__u32 handle_bytes;
diff --cc include/linux/ipc.h
index 5591f055e13f,ea0eb0b5f98c..fadd579d577d
--- a/include/linux/ipc.h
+++ b/include/linux/ipc.h
@@@ -20,9 -20,6 +20,9 @@@ struct kern_ipc_perm 
  	umode_t		mode;
  	unsigned long	seq;
  	void		*security;
 +
 +	struct rcu_head rcu;
 +	atomic_t refcount;
- } ____cacheline_aligned_in_smp;
+ } ____cacheline_aligned_in_smp __randomize_layout;
  
  #endif /* _LINUX_IPC_H */
diff --cc include/linux/sem.h
index be5cf2ea14ad,23bcbdfad4a6..de2deb8676bd
--- a/include/linux/sem.h
+++ b/include/linux/sem.h
@@@ -39,9 -21,7 +39,9 @@@ struct sem_array 
  	int			sem_nsems;	/* no. of semaphores in array */
  	int			complex_count;	/* pending complex operations */
  	unsigned int		use_global_lock;/* >0: global lock required */
 +
 +	struct sem		sems[];
- };
+ } __randomize_layout;
  
  #ifdef CONFIG_SYSVIPC
  

And, FWIW, this continues to pass allmodconfig (normal and patched to
enable gcc-plugins) builds of x86_64, i386, arm64, arm, powerpc, and
s390 for me.

Thanks!

-Kees

The following changes since commit ffa47aa678cfaa9b88e8a26cfb115b4768325121:

  ARM: Prepare for randomized task_struct (2017-06-30 12:00:50 -0700)

are available in the git repository at:

  git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git tags/gcc-plugins-v4.13-rc2

for you to fetch changes up to 8acdf5055974e49d337d51ac7011449cfd7b7d05:

  randstruct: opt-out externally exposed function pointer structs (2017-06-30 12:00:52 -0700)

----------------------------------------------------------------
Now that IPC and other changes have landed, enable manual markings for
randstruct plugin, including the task_struct.

----------------------------------------------------------------
Kees Cook (3):
      randstruct: Mark various structs for randomization
      task_struct: Allow randomized layout
      randstruct: opt-out externally exposed function pointer structs

 arch/arm/include/asm/cacheflush.h     |  2 +-
 arch/x86/include/asm/paravirt_types.h | 16 ++++++++--------
 arch/x86/include/asm/processor.h      |  2 +-
 fs/mount.h                            |  4 ++--
 fs/namei.c                            |  2 +-
 fs/proc/internal.h                    |  6 +++---
 include/linux/binfmts.h               |  4 ++--
 include/linux/cdev.h                  |  2 +-
 include/linux/compiler-gcc.h          | 13 ++++++++++++-
 include/linux/compiler.h              |  5 +++++
 include/linux/cred.h                  |  4 ++--
 include/linux/dcache.h                |  2 +-
 include/linux/fs.h                    | 17 +++++++++--------
 include/linux/fs_struct.h             |  2 +-
 include/linux/ipc.h                   |  2 +-
 include/linux/ipc_namespace.h         |  2 +-
 include/linux/key-type.h              |  4 ++--
 include/linux/kmod.h                  |  2 +-
 include/linux/kobject.h               |  2 +-
 include/linux/lsm_hooks.h             |  4 ++--
 include/linux/mm_types.h              |  4 ++--
 include/linux/module.h                |  4 ++--
 include/linux/mount.h                 |  2 +-
 include/linux/msg.h                   |  2 +-
 include/linux/path.h                  |  2 +-
 include/linux/pid_namespace.h         |  2 +-
 include/linux/proc_ns.h               |  2 +-
 include/linux/sched.h                 | 16 +++++++++++++++-
 include/linux/sched/signal.h          |  2 +-
 include/linux/sem.h                   |  2 +-
 include/linux/shm.h                   |  2 +-
 include/linux/sysctl.h                |  2 +-
 include/linux/tty.h                   |  2 +-
 include/linux/tty_driver.h            |  4 ++--
 include/linux/user_namespace.h        |  2 +-
 include/linux/utsname.h               |  2 +-
 include/net/af_unix.h                 |  2 +-
 include/net/neighbour.h               |  2 +-
 include/net/net_namespace.h           |  2 +-
 include/net/sock.h                    |  2 +-
 kernel/futex.c                        |  4 ++--
 security/keys/internal.h              |  2 +-
 42 files changed, 97 insertions(+), 66 deletions(-)

-- 
Kees Cook
Pixel Security

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ