123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222 |
- diff --git a/Kconfig b/Kconfig
- index c13f48d..e18713e 100644
- --- a/Kconfig
- +++ b/Kconfig
- @@ -9,3 +9,4 @@ config SRCARCH
- option env="SRCARCH"
-
- source "arch/$SRCARCH/Kconfig"
- +source "graphene/Kconfig"
- diff --git a/Makefile b/Makefile
- index e5ac8a6..116ac82 100644
- --- a/Makefile
- +++ b/Makefile
- @@ -779,7 +779,7 @@ export mod_sign_cmd
-
-
- ifeq ($(KBUILD_EXTMOD),)
- -core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/
- +core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/ graphene/
-
- vmlinux-dirs := $(patsubst %/,%,$(filter %/, $(init-y) $(init-m) \
- $(core-y) $(core-m) $(drivers-y) $(drivers-m) \
- diff --git a/include/linux/miscdevice.h b/include/linux/miscdevice.h
- index 3737f72..f7a4aba 100644
- --- a/include/linux/miscdevice.h
- +++ b/include/linux/miscdevice.h
- @@ -3,6 +3,7 @@
- #include <linux/major.h>
- #include <linux/list.h>
- #include <linux/types.h>
- +#include <../graphene/graphene.h>
-
- /*
- * These allocations are managed by device@lanana.org. If you use an
- diff --git a/include/linux/sched.h b/include/linux/sched.h
- index a781dec..3381137 100644
- --- a/include/linux/sched.h
- +++ b/include/linux/sched.h
- @@ -1161,6 +1161,11 @@ enum perf_event_task_context {
- perf_nr_task_contexts,
- };
-
- +#ifdef CONFIG_GRAPHENE
- +# include <../graphene/graphene.h>
- +struct graphene_struct;
- +#endif
- +
- struct task_struct {
- volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */
- void *stack;
- @@ -1581,6 +1586,11 @@ struct task_struct {
- unsigned int sequential_io;
- unsigned int sequential_io_avg;
- #endif
- +
- +#ifdef CONFIG_GRAPHENE
- + /* for graphene tasks */
- + struct graphene_struct *graphene; /* structure to store graphene info */
- +#endif
- };
-
- /* Future-safe accessor for struct task_struct's cpus_allowed. */
- diff --git a/kernel/fork.c b/kernel/fork.c
- index a17621c..41d5958 100644
- --- a/kernel/fork.c
- +++ b/kernel/fork.c
- @@ -11,6 +11,7 @@
- * management can be a bitch. See 'mm/memory.c': 'copy_page_range()'
- */
-
- +#include <linux/version.h>
- #include <linux/slab.h>
- #include <linux/init.h>
- #include <linux/unistd.h>
- @@ -84,6 +85,10 @@
- #define CREATE_TRACE_POINTS
- #include <trace/events/task.h>
-
- +#ifdef CONFIG_GRAPHENE
- +# include <../graphene/graphene.h>
- +#endif
- +
- /*
- * Protected counters by write_lock_irq(&tasklist_lock)
- */
- @@ -242,6 +247,10 @@ void __put_task_struct(struct task_struct *tsk)
- delayacct_tsk_free(tsk);
- put_signal_struct(tsk->signal);
-
- +#ifdef CONFIG_GRAPHENE
- + put_graphene_struct(tsk);
- +#endif
- +
- if (!profile_handoff_task(tsk))
- free_task(tsk);
- }
- @@ -322,6 +331,16 @@ static struct task_struct *dup_task_struct(struct task_struct *orig)
- tsk->stack_canary = get_random_int();
- #endif
-
- +#ifdef CONFIG_GRAPHENE
- + err = dup_graphene_struct(tsk);
- + if (err)
- +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)
- + goto free_ti;
- +#else
- + goto out;
- +#endif
- +#endif
- +
- /*
- * One for us, one for whoever does the "release_task()" (usually
- * parent)
- diff -ruNp linux-3.19/mm/mmap.c linux-3.19.new/mm/mmap.c
- --- linux-3.19/mm/mmap.c 2015-02-08 21:54:22.000000000 -0500
- +++ linux-3.19.new/mm/mmap.c 2016-08-23 22:15:18.387511888 -0400
- @@ -2000,6 +2000,10 @@ arch_get_unmapped_area_topdown(struct fi
- }
- #endif
-
- +#ifdef CONFIG_GRAPHENE
- +# include <../graphene/graphene.h>
- +#endif
- +
- unsigned long
- get_unmapped_area(struct file *file, unsigned long addr, unsigned long len,
- unsigned long pgoff, unsigned long flags)
- @@ -2018,6 +2022,10 @@ get_unmapped_area(struct file *file, uns
- get_area = current->mm->get_unmapped_area;
- if (file && file->f_op->get_unmapped_area)
- get_area = file->f_op->get_unmapped_area;
- +#ifdef CONFIG_GRAPHENE
- + if (file && current->in_execve && GRAPHENE_ENABLED())
- + get_area = graphene_execve_get_area;
- +#endif
- addr = get_area(file, addr, len, pgoff, flags);
- if (IS_ERR_VALUE(addr))
- return addr;
- diff --git a/security/apparmor/lsm.c b/security/apparmor/lsm.c
- index 4257b7e..b21c19d 100644
- --- a/security/apparmor/lsm.c
- +++ b/security/apparmor/lsm.c
- @@ -36,6 +36,10 @@
- #include "include/policy.h"
- #include "include/procattr.h"
-
- +#ifdef CONFIG_GRAPHENE
- +# include <../graphene/graphene.h>
- +#endif
- +
- /* Flag indicating whether initialization completed */
- int apparmor_initialized __initdata;
-
- @@ -165,6 +169,12 @@ static int common_perm(int op, struct path *path, u32 mask,
- struct aa_profile *profile;
- int error = 0;
-
- +#ifdef CONFIG_GRAPHENE
- + if (GRAPHENE_ENABLED() &&
- + (error = graphene_common_perm(op, path, mask)))
- + return error;
- +#endif
- +
- profile = __aa_current_profile();
- if (!unconfined(profile))
- error = aa_path_perm(op, profile, path, 0, mask, cond);
- @@ -377,6 +387,7 @@ static int apparmor_file_open(struct file *file, const struct cred *cred)
- {
- struct aa_file_cxt *fcxt = file->f_security;
- struct aa_profile *profile;
- + u32 mask;
- int error = 0;
-
- if (!mediated_filesystem(file_inode(file)))
- @@ -388,10 +399,21 @@ static int apparmor_file_open(struct file *file, const struct cred *cred)
- * actually execute the image.
- */
- if (current->in_execve) {
- +#ifdef CONFIG_GRAPHENE
- + if (GRAPHENE_ENABLED() && (error = graphene_execve_open(file)))
- + return error;
- +#endif
- fcxt->allow = MAY_EXEC | MAY_READ | AA_EXEC_MMAP;
- return 0;
- }
-
- +#ifdef CONFIG_GRAPHENE
- + mask = aa_map_file_to_perms(file);
- + if (GRAPHENE_ENABLED() &&
- + (error = graphene_common_perm(OP_OPEN, &file->f_path, mask)))
- + return error;
- +#endif
- +
- profile = aa_cred_profile(cred);
- if (!unconfined(profile)) {
- struct inode *inode = file_inode(file);
- @@ -647,6 +669,14 @@ static struct security_operations apparmor_ops = {
- .getprocattr = apparmor_getprocattr,
- .setprocattr = apparmor_setprocattr,
-
- +#ifdef CONFIG_GRAPHENE
- + .socket_bind = graphene_socket_bind,
- + .socket_listen = graphene_socket_listen,
- + .socket_connect = graphene_socket_connect,
- + .socket_sendmsg = graphene_socket_sendmsg,
- + .socket_recvmsg = graphene_socket_recvmsg,
- +#endif
- +
- .cred_alloc_blank = apparmor_cred_alloc_blank,
- .cred_free = apparmor_cred_free,
- .cred_prepare = apparmor_cred_prepare,
- @@ -658,6 +688,10 @@ static struct security_operations apparmor_ops = {
- .bprm_secureexec = apparmor_bprm_secureexec,
-
- .task_setrlimit = apparmor_task_setrlimit,
- +
- +#ifdef CONFIG_GRAPHENE
- + .task_kill = graphene_task_kill,
- +#endif
- };
-
- /*
|