diff options
author | José Bollo <jose.bollo@iot.bzh> | 2016-11-02 11:28:37 +0100 |
---|---|---|
committer | José Bollo <jose.bollo@iot.bzh> | 2016-11-03 11:22:56 +0100 |
commit | 21d40b2e0dc344f6b89c2a71296a4dd2a29a2a4e (patch) | |
tree | f0a0bb5f9b9ebdf1c18422437253df7e92f28d0c /meta-rcar-gen2/recipes-kernel/linux/linux-renesas/smack | |
parent | adc078dcd90064375fa04899c9bb039ac180c992 (diff) |
Smack: fixup of bluetooth socket labelling
The sockets created by kernel thread will now be
tagged @ instead of _.
Change-Id: I92dcc885e9e8f7b45076f7df7a0e1ef4e66453a3
Signed-off-by: José Bollo <jose.bollo@iot.bzh>
Diffstat (limited to 'meta-rcar-gen2/recipes-kernel/linux/linux-renesas/smack')
3 files changed, 165 insertions, 0 deletions
diff --git a/meta-rcar-gen2/recipes-kernel/linux/linux-renesas/smack/0055-Smack-Assign-smack_known_web-as-default-smk_in-label.patch b/meta-rcar-gen2/recipes-kernel/linux/linux-renesas/smack/0055-Smack-Assign-smack_known_web-as-default-smk_in-label.patch new file mode 100644 index 0000000..18353d3 --- /dev/null +++ b/meta-rcar-gen2/recipes-kernel/linux/linux-renesas/smack/0055-Smack-Assign-smack_known_web-as-default-smk_in-label.patch @@ -0,0 +1,55 @@ +From 292f377160c78213af88b5cc069dbdaa08db17dd Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Jos=C3=A9=20Bollo?= <jose.bollo@iot.bzh> +Date: Wed, 2 Nov 2016 11:11:01 +0100 +Subject: [PATCH 55/56] Smack: Assign smack_known_web as default smk_in label + for kernel thread's socket +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This change fixes the bug associated with sockets owned by kernel threads. These +sockets, created usually by network devices' drivers tasks, received smk_in +label from the task that created them - the "floor" label in the most cases. The +result was that they were not able to receive data packets because of missing +smack rules. The main reason of the access deny is that the socket smk_in label +is placed as the object during smk check, kernel thread's capabilities are +omitted. + +Refers-to: http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=7412301b76bd53ee53b860f611fc3b5b1c2245b5 +Change-Id: Icec88b0d51133df8d0a09ea8016233bde255af10 +Signed-off-by: Marcin Lis <m.lis@samsung.com> +Signed-off-by: José Bollo <jose.bollo@iot.bzh> +--- + security/smack/smack_lsm.c | 16 +++++++++++++++- + 1 file changed, 15 insertions(+), 1 deletion(-) + +diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c +index 895fe5c..ff696e7 100644 +--- a/security/smack/smack_lsm.c ++++ b/security/smack/smack_lsm.c +@@ -2453,7 +2453,21 @@ static int smack_inode_setsecurity(struct inode *inode, const char *name, + static int smack_socket_post_create(struct socket *sock, int family, + int type, int protocol, int kern) + { +- if (family != PF_INET || sock->sk == NULL) ++ struct socket_smack *ssp; ++ ++ if (sock->sk == NULL) ++ return 0; ++ ++ /* ++ * Sockets created by kernel threads receive web label. ++ */ ++ if (unlikely(current->flags & PF_KTHREAD)) { ++ ssp = sock->sk->sk_security; ++ ssp->smk_in = &smack_known_web; ++ ssp->smk_out = &smack_known_web; ++ } ++ ++ if (family != PF_INET) + return 0; + /* + * Set the outbound netlbl. +-- +2.7.4 + diff --git a/meta-rcar-gen2/recipes-kernel/linux/linux-renesas/smack/0056-Smack-Assign-smack_known_web-label-for-kernel-thread.patch b/meta-rcar-gen2/recipes-kernel/linux/linux-renesas/smack/0056-Smack-Assign-smack_known_web-label-for-kernel-thread.patch new file mode 100644 index 0000000..b045101 --- /dev/null +++ b/meta-rcar-gen2/recipes-kernel/linux/linux-renesas/smack/0056-Smack-Assign-smack_known_web-label-for-kernel-thread.patch @@ -0,0 +1,49 @@ +From ea1c9711146e251c809ecf7eb348b548ac6e967c Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Jos=C3=A9=20Bollo?= <jose.bollo@iot.bzh> +Date: Wed, 2 Nov 2016 11:01:15 +0100 +Subject: [PATCH 56/56] Smack: Assign smack_known_web label for kernel thread's + socket in the sk_alloc_security hook +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Creating struct sock by sk_alloc function in various kernel subsystems +like bluetooth dosen't call smack_socket_post_create(). In such case, +received sock label is the floor('_') label and makes access deny. + +Refers-to: http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=7412301b76bd53ee53b860f611fc3b5b1c2245b5 +Refers-to: https://review.tizen.org/gerrit/#/c/80717/4 + +Change-Id: I614c5f0e6d59be5ca6b49f0581edfef79fc334cf +Signed-off-by: jooseong lee <jooseong.lee@samsung.com> +Signed-off-by: José Bollo <jose.bollo@iot.bzh> +--- + security/smack/smack_lsm.c | 12 ++++++++++-- + 1 file changed, 10 insertions(+), 2 deletions(-) + +diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c +index ff696e7..94914db 100644 +--- a/security/smack/smack_lsm.c ++++ b/security/smack/smack_lsm.c +@@ -2075,8 +2075,16 @@ static int smack_sk_alloc_security(struct sock *sk, int family, gfp_t gfp_flags) + if (ssp == NULL) + return -ENOMEM; + +- ssp->smk_in = skp; +- ssp->smk_out = skp; ++ /* ++ * Sockets created by kernel threads receive web label. ++ */ ++ if (unlikely(current->flags & PF_KTHREAD)) { ++ ssp->smk_in = &smack_known_web; ++ ssp->smk_out = &smack_known_web; ++ } else { ++ ssp->smk_in = skp; ++ ssp->smk_out = skp; ++ } + ssp->smk_packet = NULL; + + sk->sk_security = ssp; +-- +2.7.4 + diff --git a/meta-rcar-gen2/recipes-kernel/linux/linux-renesas/smack/0057-Smack-handles-socket-in-file_receive.patch b/meta-rcar-gen2/recipes-kernel/linux/linux-renesas/smack/0057-Smack-handles-socket-in-file_receive.patch new file mode 100644 index 0000000..ba02af8 --- /dev/null +++ b/meta-rcar-gen2/recipes-kernel/linux/linux-renesas/smack/0057-Smack-handles-socket-in-file_receive.patch @@ -0,0 +1,61 @@ +From 99719d12de612819e06fc3d0741b7e2da119d61c Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Jos=C3=A9=20Bollo?= <jose.bollo@iot.bzh> +Date: Wed, 2 Nov 2016 18:32:32 +0100 +Subject: [PATCH] Smack: handles socket in file_receive +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The security context of sockets and the rules +of security are differents for sockets. + +This is a backport of http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=79be09350 + +Change-Id: Id520c9ca8f7ee8883523a0e4b40176524442db33 +Signed-off-by: José Bollo <jose.bollo@iot.bzh> +--- + security/smack/smack_lsm.c | 25 +++++++++++++++++++++++++ + 1 file changed, 25 insertions(+) + +diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c +index 94914db..3b09524 100644 +--- a/security/smack/smack_lsm.c ++++ b/security/smack/smack_lsm.c +@@ -1638,9 +1638,34 @@ static int smack_file_receive(struct file *file) + int may = 0; + struct smk_audit_info ad; + struct inode *inode = file_inode(file); ++ struct socket *sock; ++ struct task_smack *tsp; ++ struct socket_smack *ssp; ++ ++ if (unlikely(IS_PRIVATE(inode))) ++ return 0; + + smk_ad_init(&ad, __func__, LSM_AUDIT_DATA_PATH); + smk_ad_setfield_u_fs_path(&ad, file->f_path); ++ ++ if (S_ISSOCK(inode->i_mode)) { ++ sock = SOCKET_I(inode); ++ ssp = sock->sk->sk_security; ++ tsp = current_security(); ++ /* ++ * If the receiving process can't write to the ++ * passed socket or if the passed socket can't ++ * write to the receiving process don't accept ++ * the passed socket. ++ */ ++ rc = smk_access(tsp->smk_task, ssp->smk_out, MAY_WRITE, &ad); ++ rc = smk_bu_file(file, may, rc); ++ if (rc < 0) ++ return rc; ++ rc = smk_access(ssp->smk_in, tsp->smk_task, MAY_WRITE, &ad); ++ rc = smk_bu_file(file, may, rc); ++ return rc; ++ } + /* + * This code relies on bitmasks. + */ +-- +2.7.4 + |