Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3859a271 authored by Kees Cook's avatar Kees Cook
Browse files

randstruct: Mark various structs for randomization



This marks many critical kernel structures for randomization. These are
structures that have been targeted in the past in security exploits, or
contain functions pointers, pointers to function pointer tables, lists,
workqueues, ref-counters, credentials, permissions, or are otherwise
sensitive. This initial list was extracted 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.

Left out of this list is task_struct, which requires special handling
and will be covered in a subsequent patch.

Signed-off-by: default avatarKees Cook <keescook@chromium.org>
parent ffa47aa6
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -129,7 +129,7 @@ struct cpuinfo_x86 {
	/* Index into per_cpu list: */
	u16			cpu_index;
	u32			microcode;
};
} __randomize_layout;

struct cpuid_regs {
	u32 eax, ebx, ecx, edx;
+2 −2
Original line number Diff line number Diff line
@@ -16,7 +16,7 @@ struct mnt_namespace {
	u64 event;
	unsigned int		mounts; /* # of mounts in the namespace */
	unsigned int		pending_mounts;
};
} __randomize_layout;

struct mnt_pcp {
	int mnt_count;
@@ -68,7 +68,7 @@ struct mount {
	struct hlist_head mnt_pins;
	struct fs_pin mnt_umount;
	struct dentry *mnt_ex_mountpoint;
};
} __randomize_layout;

#define MNT_NS_INTERNAL ERR_PTR(-EINVAL) /* distinct from any mnt_namespace */

+1 −1
Original line number Diff line number Diff line
@@ -524,7 +524,7 @@ struct nameidata {
	struct inode	*link_inode;
	unsigned	root_seq;
	int		dfd;
};
} __randomize_layout;

static void set_nameidata(struct nameidata *p, int dfd, struct filename *name)
{
+3 −3
Original line number Diff line number Diff line
@@ -51,7 +51,7 @@ struct proc_dir_entry {
	spinlock_t pde_unload_lock; /* proc_fops checks and pde_users bumps */
	u8 namelen;
	char name[];
};
} __randomize_layout;

union proc_op {
	int (*proc_get_link)(struct dentry *, struct path *);
@@ -70,7 +70,7 @@ struct proc_inode {
	struct list_head sysctl_inodes;
	const struct proc_ns_operations *ns_ops;
	struct inode vfs_inode;
};
} __randomize_layout;

/*
 * General functions
@@ -279,7 +279,7 @@ struct proc_maps_private {
#ifdef CONFIG_NUMA
	struct mempolicy *task_mempolicy;
#endif
};
} __randomize_layout;

struct mm_struct *proc_mem_open(struct inode *inode, unsigned int mode);

+2 −2
Original line number Diff line number Diff line
@@ -46,7 +46,7 @@ struct linux_binprm {
	unsigned interp_flags;
	unsigned interp_data;
	unsigned long loader, exec;
};
} __randomize_layout;

#define BINPRM_FLAGS_ENFORCE_NONDUMP_BIT 0
#define BINPRM_FLAGS_ENFORCE_NONDUMP (1 << BINPRM_FLAGS_ENFORCE_NONDUMP_BIT)
@@ -81,7 +81,7 @@ struct linux_binfmt {
	int (*load_shlib)(struct file *);
	int (*core_dump)(struct coredump_params *cprm);
	unsigned long min_coredump;	/* minimal dump size */
};
} __randomize_layout;

extern void __register_binfmt(struct linux_binfmt *fmt, int insert);

Loading