* [PATCH 1/1] file capabilities: remove cap_task_kill() (-git)
@ 2008-03-19 16:56 Serge E. Hallyn
2008-03-19 18:12 ` Luiz Fernando N. Capitulino
` (2 more replies)
0 siblings, 3 replies; 10+ messages in thread
From: Serge E. Hallyn @ 2008-03-19 16:56 UTC (permalink / raw)
To: lkml, Linus Torvalds
Cc: Andrew Morton, Andrew Morgan, buraphalinuxserver,
Luiz Fernando N. Capitulino
(resending once against -git. I had sent against -stable in
http://lkml.org/lkml/2008/2/28/225. Without this patch,
atd is broken at least on some distros.)
The original justification for cap_task_kill() was as follows:
check_kill_permission() does appropriate uid equivalence checks.
However with file capabilities it becomes possible for an
unprivileged user to execute a file with file capabilities
resulting in a more privileged task with the same uid.
However now that cap_task_kill() always returns 0 (permission
granted) when p->uid==current->uid, the whole hook is worthless,
and only likely to create more subtle problems in the corner cases
where it might still be called but return -EPERM. Those cases
are basically when uids are different but euid/suid is equivalent
as per the check in check_kill_permission().
One example of a still-broken application is 'at' for non-root users.
This patch removes cap_task_kill().
Signed-off-by: Serge Hallyn <serge@hallyn.com>
Acked-by: Andrew G. Morgan <morgan@kernel.org>
---
include/linux/security.h | 3 +--
security/capability.c | 1 -
security/commoncap.c | 40 ----------------------------------------
3 files changed, 1 insertions(+), 43 deletions(-)
diff --git a/include/linux/security.h b/include/linux/security.h
index b07357c..c673dfd 100644
--- a/include/linux/security.h
+++ b/include/linux/security.h
@@ -57,7 +57,6 @@ extern int cap_inode_need_killpriv(struct dentry *dentry);
extern int cap_inode_killpriv(struct dentry *dentry);
extern int cap_task_post_setuid (uid_t old_ruid, uid_t old_euid, uid_t old_suid, int flags);
extern void cap_task_reparent_to_init (struct task_struct *p);
-extern int cap_task_kill(struct task_struct *p, struct siginfo *info, int sig, u32 secid);
extern int cap_task_setscheduler (struct task_struct *p, int policy, struct sched_param *lp);
extern int cap_task_setioprio (struct task_struct *p, int ioprio);
extern int cap_task_setnice (struct task_struct *p, int nice);
@@ -2187,7 +2186,7 @@ static inline int security_task_kill (struct task_struct *p,
struct siginfo *info, int sig,
u32 secid)
{
- return cap_task_kill(p, info, sig, secid);
+ return 0;
}
static inline int security_task_wait (struct task_struct *p)
diff --git a/security/capability.c b/security/capability.c
index 9e99f36..2c6e06d 100644
--- a/security/capability.c
+++ b/security/capability.c
@@ -40,7 +40,6 @@ static struct security_operations capability_ops = {
.inode_need_killpriv = cap_inode_need_killpriv,
.inode_killpriv = cap_inode_killpriv,
- .task_kill = cap_task_kill,
.task_setscheduler = cap_task_setscheduler,
.task_setioprio = cap_task_setioprio,
.task_setnice = cap_task_setnice,
diff --git a/security/commoncap.c b/security/commoncap.c
index bb0c095..06d5c94 100644
--- a/security/commoncap.c
+++ b/security/commoncap.c
@@ -540,41 +540,6 @@ int cap_task_setnice (struct task_struct *p, int nice)
return cap_safe_nice(p);
}
-int cap_task_kill(struct task_struct *p, struct siginfo *info,
- int sig, u32 secid)
-{
- if (info != SEND_SIG_NOINFO && (is_si_special(info) || SI_FROMKERNEL(info)))
- return 0;
-
- /*
- * Running a setuid root program raises your capabilities.
- * Killing your own setuid root processes was previously
- * allowed.
- * We must preserve legacy signal behavior in this case.
- */
- if (p->uid == current->uid)
- return 0;
-
- /* sigcont is permitted within same session */
- if (sig == SIGCONT && (task_session_nr(current) == task_session_nr(p)))
- return 0;
-
- if (secid)
- /*
- * Signal sent as a particular user.
- * Capabilities are ignored. May be wrong, but it's the
- * only thing we can do at the moment.
- * Used only by usb drivers?
- */
- return 0;
- if (cap_issubset(p->cap_permitted, current->cap_permitted))
- return 0;
- if (capable(CAP_KILL))
- return 0;
-
- return -EPERM;
-}
-
/*
* called from kernel/sys.c for prctl(PR_CABSET_DROP)
* done without task_capability_lock() because it introduces
@@ -605,11 +570,6 @@ int cap_task_setnice (struct task_struct *p, int nice)
{
return 0;
}
-int cap_task_kill(struct task_struct *p, struct siginfo *info,
- int sig, u32 secid)
-{
- return 0;
-}
#endif
void cap_task_reparent_to_init (struct task_struct *p)
--
1.5.2.5
^ permalink raw reply related [flat|nested] 10+ messages in thread* Re: [PATCH 1/1] file capabilities: remove cap_task_kill() (-git) 2008-03-19 16:56 [PATCH 1/1] file capabilities: remove cap_task_kill() (-git) Serge E. Hallyn @ 2008-03-19 18:12 ` Luiz Fernando N. Capitulino 2008-03-19 21:11 ` Andrew Morton 2008-03-19 23:46 ` Andrew Morton 2 siblings, 0 replies; 10+ messages in thread From: Luiz Fernando N. Capitulino @ 2008-03-19 18:12 UTC (permalink / raw) To: Serge E. Hallyn Cc: lkml, Linus Torvalds, Andrew Morton, Andrew Morgan, buraphalinuxserver Em Wed, 19 Mar 2008 11:56:35 -0500 "Serge E. Hallyn" <serue@us.ibm.com> escreveu: | (resending once against -git. I had sent against -stable in | http://lkml.org/lkml/2008/2/28/225. Without this patch, | atd is broken at least on some distros.) | | The original justification for cap_task_kill() was as follows: | | check_kill_permission() does appropriate uid equivalence checks. | However with file capabilities it becomes possible for an | unprivileged user to execute a file with file capabilities | resulting in a more privileged task with the same uid. | | However now that cap_task_kill() always returns 0 (permission | granted) when p->uid==current->uid, the whole hook is worthless, | and only likely to create more subtle problems in the corner cases | where it might still be called but return -EPERM. Those cases | are basically when uids are different but euid/suid is equivalent | as per the check in check_kill_permission(). | | One example of a still-broken application is 'at' for non-root users. | | This patch removes cap_task_kill(). | | Signed-off-by: Serge Hallyn <serge@hallyn.com> | Acked-by: Andrew G. Morgan <morgan@kernel.org> I've tested the -stable patch (no time to test this one, but it's exactly the same patch), not sure if this applies to this but... Tested-by: Luiz Fernando N. Capitulino <lcapitulino@mandriva.com.br> -- Luiz Fernando N. Capitulino ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 1/1] file capabilities: remove cap_task_kill() (-git) 2008-03-19 16:56 [PATCH 1/1] file capabilities: remove cap_task_kill() (-git) Serge E. Hallyn 2008-03-19 18:12 ` Luiz Fernando N. Capitulino @ 2008-03-19 21:11 ` Andrew Morton 2008-03-19 21:20 ` Serge E. Hallyn 2008-03-19 23:46 ` Andrew Morton 2 siblings, 1 reply; 10+ messages in thread From: Andrew Morton @ 2008-03-19 21:11 UTC (permalink / raw) To: Serge E. Hallyn Cc: linux-kernel, torvalds, morgan, buraphalinuxserver, lcapitulino, stable On Wed, 19 Mar 2008 11:56:35 -0500 "Serge E. Hallyn" <serue@us.ibm.com> wrote: > (resending once against -git. I had sent against -stable in > http://lkml.org/lkml/2008/2/28/225. Without this patch, > atd is broken at least on some distros.) So this fix is needed in 2.6.24.x? > The original justification for cap_task_kill() was as follows: > > check_kill_permission() does appropriate uid equivalence checks. > However with file capabilities it becomes possible for an > unprivileged user to execute a file with file capabilities > resulting in a more privileged task with the same uid. > > However now that cap_task_kill() always returns 0 (permission > granted) when p->uid==current->uid, the whole hook is worthless, > and only likely to create more subtle problems in the corner cases > where it might still be called but return -EPERM. Those cases > are basically when uids are different but euid/suid is equivalent > as per the check in check_kill_permission(). > > One example of a still-broken application is 'at' for non-root users. This 2.6.25-rc6 patch doesn't apply correctly to 2.6.24. I can't find a *formal* copy of your 2.6.24 patch on stable@kernel.org, so perhaps a resend for -stable is in order. ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 1/1] file capabilities: remove cap_task_kill() (-git) 2008-03-19 21:11 ` Andrew Morton @ 2008-03-19 21:20 ` Serge E. Hallyn 0 siblings, 0 replies; 10+ messages in thread From: Serge E. Hallyn @ 2008-03-19 21:20 UTC (permalink / raw) To: Andrew Morton Cc: Serge E. Hallyn, linux-kernel, torvalds, morgan, buraphalinuxserver, lcapitulino, stable Quoting Andrew Morton (akpm@linux-foundation.org): > On Wed, 19 Mar 2008 11:56:35 -0500 > "Serge E. Hallyn" <serue@us.ibm.com> wrote: > > > (resending once against -git. I had sent against -stable in > > http://lkml.org/lkml/2008/2/28/225. Without this patch, > > atd is broken at least on some distros.) > > So this fix is needed in 2.6.24.x? Yes it is. > > The original justification for cap_task_kill() was as follows: > > > > check_kill_permission() does appropriate uid equivalence checks. > > However with file capabilities it becomes possible for an > > unprivileged user to execute a file with file capabilities > > resulting in a more privileged task with the same uid. > > > > However now that cap_task_kill() always returns 0 (permission > > granted) when p->uid==current->uid, the whole hook is worthless, > > and only likely to create more subtle problems in the corner cases > > where it might still be called but return -EPERM. Those cases > > are basically when uids are different but euid/suid is equivalent > > as per the check in check_kill_permission(). > > > > One example of a still-broken application is 'at' for non-root users. > > This 2.6.25-rc6 patch doesn't apply correctly to 2.6.24. I can't find a > *formal* copy of your 2.6.24 patch on stable@kernel.org, so perhaps a > resend for -stable is in order. Argh, yes, will do. Thanks. -serge ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 1/1] file capabilities: remove cap_task_kill() (-git) 2008-03-19 16:56 [PATCH 1/1] file capabilities: remove cap_task_kill() (-git) Serge E. Hallyn 2008-03-19 18:12 ` Luiz Fernando N. Capitulino 2008-03-19 21:11 ` Andrew Morton @ 2008-03-19 23:46 ` Andrew Morton 2008-03-20 2:13 ` Linus Torvalds 2 siblings, 1 reply; 10+ messages in thread From: Andrew Morton @ 2008-03-19 23:46 UTC (permalink / raw) To: Serge E. Hallyn Cc: linux-kernel, torvalds, morgan, buraphalinuxserver, lcapitulino On Wed, 19 Mar 2008 11:56:35 -0500 "Serge E. Hallyn" <serue@us.ibm.com> wrote: > (resending once against -git. I had sent against -stable in > http://lkml.org/lkml/2008/2/28/225. Without this patch, > atd is broken at least on some distros.) > > The original justification for cap_task_kill() was as follows: > > check_kill_permission() does appropriate uid equivalence checks. > However with file capabilities it becomes possible for an > unprivileged user to execute a file with file capabilities > resulting in a more privileged task with the same uid. > > However now that cap_task_kill() always returns 0 (permission > granted) when p->uid==current->uid, the whole hook is worthless, > and only likely to create more subtle problems in the corner cases > where it might still be called but return -EPERM. Those cases > are basically when uids are different but euid/suid is equivalent > as per the check in check_kill_permission(). > > One example of a still-broken application is 'at' for non-root users. > > This patch removes cap_task_kill(). umm, security/smack/smack_lsm.c: In function 'smack_task_kill': security/smack/smack_lsm.c:1122: error: implicit declaration of function 'cap_task_kill' ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 1/1] file capabilities: remove cap_task_kill() (-git) 2008-03-19 23:46 ` Andrew Morton @ 2008-03-20 2:13 ` Linus Torvalds 2008-03-20 3:18 ` Serge E. Hallyn 0 siblings, 1 reply; 10+ messages in thread From: Linus Torvalds @ 2008-03-20 2:13 UTC (permalink / raw) To: Serge E. Hallyn Cc: Andrew Morton, Linux Kernel Mailing List, morgan, buraphalinuxserver, lcapitulino On Wed, 19 Mar 2008, Andrew Morton wrote: > > umm, > > security/smack/smack_lsm.c: In function 'smack_task_kill': > security/smack/smack_lsm.c:1122: error: implicit declaration of function 'cap_task_kill' Serge, can you resend with that fixed and the tested-by added? Linus ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 1/1] file capabilities: remove cap_task_kill() (-git) 2008-03-20 2:13 ` Linus Torvalds @ 2008-03-20 3:18 ` Serge E. Hallyn 2008-03-20 4:17 ` Linus Torvalds 2008-03-20 15:29 ` Casey Schaufler 0 siblings, 2 replies; 10+ messages in thread From: Serge E. Hallyn @ 2008-03-20 3:18 UTC (permalink / raw) To: Linus Torvalds Cc: Serge E. Hallyn, Andrew Morton, Linux Kernel Mailing List, morgan, buraphalinuxserver, lcapitulino Quoting Linus Torvalds (torvalds@linux-foundation.org): > > > On Wed, 19 Mar 2008, Andrew Morton wrote: > > > > umm, > > > > security/smack/smack_lsm.c: In function 'smack_task_kill': > > security/smack/smack_lsm.c:1122: error: implicit declaration of function 'cap_task_kill' Right, that was against git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6 which doesn't yet have smack. I should've been clear about that. > Serge, can you resend with that fixed and the tested-by added? > > Linus Following is the version against this morning's mmotm with the tested-by added. thanks, -serge >From c50b1c9f7a9e9434c8ddb50cb81e6b342638b8e0 Mon Sep 17 00:00:00 2001 From: Serge Hallyn <serge@hallyn.com> Date: Fri, 29 Feb 2008 15:14:57 +0000 Subject: [PATCH 1/1] file capabilities: remove cap_task_kill() (-mmotm) The original justification for cap_task_kill() was as follows: check_kill_permission() does appropriate uid equivalence checks. However with file capabilities it becomes possible for an unprivileged user to execute a file with file capabilities resulting in a more privileged task with the same uid. However now that cap_task_kill() always returns 0 (permission granted) when p->uid==current->uid, the whole hook is worthless, and only likely to create more subtle problems in the corner cases where it might still be called but return -EPERM. Those cases are basically when uids are different but euid/suid is equivalent as per the check in check_kill_permission(). One example of a still-broken application is 'at' for non-root users. This patch removes cap_task_kill(). Signed-off-by: Serge Hallyn <serge@hallyn.com> Acked-by: Andrew G. Morgan <morgan@kernel.org> Tested-by: Luiz Fernando N. Capitulino <lcapitulino@mandriva.com.br> --- include/linux/security.h | 3 +-- security/capability.c | 1 - security/commoncap.c | 33 --------------------------------- security/smack/smack_lsm.c | 5 ----- 4 files changed, 1 insertions(+), 41 deletions(-) diff --git a/include/linux/security.h b/include/linux/security.h index 2231526..13fd76a 100644 --- a/include/linux/security.h +++ b/include/linux/security.h @@ -59,7 +59,6 @@ extern int cap_inode_need_killpriv(struct dentry *dentry); extern int cap_inode_killpriv(struct dentry *dentry); extern int cap_task_post_setuid (uid_t old_ruid, uid_t old_euid, uid_t old_suid, int flags); extern void cap_task_reparent_to_init (struct task_struct *p); -extern int cap_task_kill(struct task_struct *p, struct siginfo *info, int sig, u32 secid); extern int cap_task_prctl(int option, unsigned long arg2, unsigned long arg3, unsigned long arg4, unsigned long arg5, long *rc_p); extern int cap_task_setscheduler (struct task_struct *p, int policy, struct sched_param *lp); @@ -2276,7 +2275,7 @@ static inline int security_task_kill (struct task_struct *p, struct siginfo *info, int sig, u32 secid) { - return cap_task_kill(p, info, sig, secid); + return 0; } static inline int security_task_wait (struct task_struct *p) diff --git a/security/capability.c b/security/capability.c index 8340655..38ac54e 100644 --- a/security/capability.c +++ b/security/capability.c @@ -40,7 +40,6 @@ static struct security_operations capability_ops = { .inode_need_killpriv = cap_inode_need_killpriv, .inode_killpriv = cap_inode_killpriv, - .task_kill = cap_task_kill, .task_setscheduler = cap_task_setscheduler, .task_setioprio = cap_task_setioprio, .task_setnice = cap_task_setnice, diff --git a/security/commoncap.c b/security/commoncap.c index 200361d..e8c3f5e 100644 --- a/security/commoncap.c +++ b/security/commoncap.c @@ -537,34 +537,6 @@ int cap_task_setnice (struct task_struct *p, int nice) return cap_safe_nice(p); } -int cap_task_kill(struct task_struct *p, struct siginfo *info, - int sig, u32 secid) -{ - /* - * Running a setuid root program raises your capabilities. - * Killing your own setuid root processes was previously - * allowed. - * We must preserve legacy signal behavior in this case. - */ - if (p->uid == current->uid) - return 0; - - if (secid) - /* - * Signal sent as a particular user. - * Capabilities are ignored. May be wrong, but it's the - * only thing we can do at the moment. - * Used only by usb drivers? - */ - return 0; - if (cap_issubset(p->cap_permitted, current->cap_permitted)) - return 0; - if (capable(CAP_KILL)) - return 0; - - return -EPERM; -} - /* * called from kernel/sys.c for prctl(PR_CABSET_DROP) * done without task_capability_lock() because it introduces @@ -596,11 +568,6 @@ int cap_task_setnice (struct task_struct *p, int nice) { return 0; } -int cap_task_kill(struct task_struct *p, struct siginfo *info, - int sig, u32 secid) -{ - return 0; -} #endif int cap_task_prctl(int option, unsigned long arg2, unsigned long arg3, diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c index 4365fad..2a5eb83 100644 --- a/security/smack/smack_lsm.c +++ b/security/smack/smack_lsm.c @@ -1117,11 +1117,6 @@ static int smack_task_movememory(struct task_struct *p) static int smack_task_kill(struct task_struct *p, struct siginfo *info, int sig, u32 secid) { - int rc; - - rc = cap_task_kill(p, info, sig, secid); - if (rc != 0) - return rc; /* * Sending a signal requires that the sender * can write the receiver. -- 1.5.2.5 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH 1/1] file capabilities: remove cap_task_kill() (-git) 2008-03-20 3:18 ` Serge E. Hallyn @ 2008-03-20 4:17 ` Linus Torvalds 2008-03-20 13:25 ` Serge E. Hallyn 2008-03-20 15:29 ` Casey Schaufler 1 sibling, 1 reply; 10+ messages in thread From: Linus Torvalds @ 2008-03-20 4:17 UTC (permalink / raw) To: Serge E. Hallyn Cc: Andrew Morton, Linux Kernel Mailing List, morgan, buraphalinuxserver, lcapitulino On Wed, 19 Mar 2008, Serge E. Hallyn wrote: > > Right, that was against > git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6 > which doesn't yet have smack. I should've been clear about that. Ok, now I'm _really_ confused. I have smack in my tree, it got merged before -rc1. So any patch that is against some version without smack is not a patch against a -git tree for the last several weeks. Me confused. Linus ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 1/1] file capabilities: remove cap_task_kill() (-git) 2008-03-20 4:17 ` Linus Torvalds @ 2008-03-20 13:25 ` Serge E. Hallyn 0 siblings, 0 replies; 10+ messages in thread From: Serge E. Hallyn @ 2008-03-20 13:25 UTC (permalink / raw) To: Linus Torvalds Cc: Serge E. Hallyn, Andrew Morton, Linux Kernel Mailing List, morgan, buraphalinuxserver, lcapitulino Quoting Linus Torvalds (torvalds@linux-foundation.org): > > > On Wed, 19 Mar 2008, Serge E. Hallyn wrote: > > > > Right, that was against > > git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6 > > which doesn't yet have smack. I should've been clear about that. > > Ok, now I'm _really_ confused. I have smack in my tree, it got merged > before -rc1. No clearly I'm the one confused/on drugs. I see it now. I swear I checked my own freshly pulled tree and gitweb several times... > So any patch that is against some version without smack is not a patch > against a -git tree for the last several weeks. > > Me confused. > > Linus New patch against -git attached. thanks, -serge >From a0e56351e00b7b7442723b7ca6247c267c2628fd Mon Sep 17 00:00:00 2001 From: Serge Hallyn <serge@hallyn.com> Date: Fri, 29 Feb 2008 15:14:57 +0000 Subject: [PATCH 1/1] file capabilities: remove cap_task_kill() (-git) The original justification for cap_task_kill() was as follows: check_kill_permission() does appropriate uid equivalence checks. However with file capabilities it becomes possible for an unprivileged user to execute a file with file capabilities resulting in a more privileged task with the same uid. However now that cap_task_kill() always returns 0 (permission granted) when p->uid==current->uid, the whole hook is worthless, and only likely to create more subtle problems in the corner cases where it might still be called but return -EPERM. Those cases are basically when uids are different but euid/suid is equivalent as per the check in check_kill_permission(). One example of a still-broken application is 'at' for non-root users. This patch removes cap_task_kill(). Signed-off-by: Serge Hallyn <serge@hallyn.com> Acked-by: Andrew G. Morgan <morgan@kernel.org> --- include/linux/security.h | 3 +-- security/capability.c | 1 - security/commoncap.c | 40 ---------------------------------------- security/smack/smack_lsm.c | 5 ----- 4 files changed, 1 insertions(+), 48 deletions(-) diff --git a/include/linux/security.h b/include/linux/security.h index b07357c..c673dfd 100644 --- a/include/linux/security.h +++ b/include/linux/security.h @@ -57,7 +57,6 @@ extern int cap_inode_need_killpriv(struct dentry *dentry); extern int cap_inode_killpriv(struct dentry *dentry); extern int cap_task_post_setuid (uid_t old_ruid, uid_t old_euid, uid_t old_suid, int flags); extern void cap_task_reparent_to_init (struct task_struct *p); -extern int cap_task_kill(struct task_struct *p, struct siginfo *info, int sig, u32 secid); extern int cap_task_setscheduler (struct task_struct *p, int policy, struct sched_param *lp); extern int cap_task_setioprio (struct task_struct *p, int ioprio); extern int cap_task_setnice (struct task_struct *p, int nice); @@ -2187,7 +2186,7 @@ static inline int security_task_kill (struct task_struct *p, struct siginfo *info, int sig, u32 secid) { - return cap_task_kill(p, info, sig, secid); + return 0; } static inline int security_task_wait (struct task_struct *p) diff --git a/security/capability.c b/security/capability.c index 9e99f36..2c6e06d 100644 --- a/security/capability.c +++ b/security/capability.c @@ -40,7 +40,6 @@ static struct security_operations capability_ops = { .inode_need_killpriv = cap_inode_need_killpriv, .inode_killpriv = cap_inode_killpriv, - .task_kill = cap_task_kill, .task_setscheduler = cap_task_setscheduler, .task_setioprio = cap_task_setioprio, .task_setnice = cap_task_setnice, diff --git a/security/commoncap.c b/security/commoncap.c index bb0c095..06d5c94 100644 --- a/security/commoncap.c +++ b/security/commoncap.c @@ -540,41 +540,6 @@ int cap_task_setnice (struct task_struct *p, int nice) return cap_safe_nice(p); } -int cap_task_kill(struct task_struct *p, struct siginfo *info, - int sig, u32 secid) -{ - if (info != SEND_SIG_NOINFO && (is_si_special(info) || SI_FROMKERNEL(info))) - return 0; - - /* - * Running a setuid root program raises your capabilities. - * Killing your own setuid root processes was previously - * allowed. - * We must preserve legacy signal behavior in this case. - */ - if (p->uid == current->uid) - return 0; - - /* sigcont is permitted within same session */ - if (sig == SIGCONT && (task_session_nr(current) == task_session_nr(p))) - return 0; - - if (secid) - /* - * Signal sent as a particular user. - * Capabilities are ignored. May be wrong, but it's the - * only thing we can do at the moment. - * Used only by usb drivers? - */ - return 0; - if (cap_issubset(p->cap_permitted, current->cap_permitted)) - return 0; - if (capable(CAP_KILL)) - return 0; - - return -EPERM; -} - /* * called from kernel/sys.c for prctl(PR_CABSET_DROP) * done without task_capability_lock() because it introduces @@ -605,11 +570,6 @@ int cap_task_setnice (struct task_struct *p, int nice) { return 0; } -int cap_task_kill(struct task_struct *p, struct siginfo *info, - int sig, u32 secid) -{ - return 0; -} #endif void cap_task_reparent_to_init (struct task_struct *p) diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c index 38d7075..732ba27 100644 --- a/security/smack/smack_lsm.c +++ b/security/smack/smack_lsm.c @@ -1117,11 +1117,6 @@ static int smack_task_movememory(struct task_struct *p) static int smack_task_kill(struct task_struct *p, struct siginfo *info, int sig, u32 secid) { - int rc; - - rc = cap_task_kill(p, info, sig, secid); - if (rc != 0) - return rc; /* * Special cases where signals really ought to go through * in spite of policy. Stephen Smalley suggests it may -- 1.5.2.5 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH 1/1] file capabilities: remove cap_task_kill() (-git) 2008-03-20 3:18 ` Serge E. Hallyn 2008-03-20 4:17 ` Linus Torvalds @ 2008-03-20 15:29 ` Casey Schaufler 1 sibling, 0 replies; 10+ messages in thread From: Casey Schaufler @ 2008-03-20 15:29 UTC (permalink / raw) To: Serge E. Hallyn, Linus Torvalds Cc: Serge E. Hallyn, Andrew Morton, Linux Kernel Mailing List, morgan, buraphalinuxserver, lcapitulino --- "Serge E. Hallyn" <serue@us.ibm.com> wrote: > Quoting Linus Torvalds (torvalds@linux-foundation.org): > > > > > > On Wed, 19 Mar 2008, Andrew Morton wrote: > > > > > > umm, > > > > > > security/smack/smack_lsm.c: In function 'smack_task_kill': > > > security/smack/smack_lsm.c:1122: error: implicit declaration of function > 'cap_task_kill' > > Right, that was against > git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6 > which doesn't yet have smack. I should've been clear about that. > > > Serge, can you resend with that fixed and the tested-by added? > > > > Linus > > Following is the version against this morning's mmotm with the tested-by > added. > > thanks, > -serge > > > >From c50b1c9f7a9e9434c8ddb50cb81e6b342638b8e0 Mon Sep 17 00:00:00 2001 > From: Serge Hallyn <serge@hallyn.com> > Date: Fri, 29 Feb 2008 15:14:57 +0000 > Subject: [PATCH 1/1] file capabilities: remove cap_task_kill() (-mmotm) > > The original justification for cap_task_kill() was as follows: > > check_kill_permission() does appropriate uid equivalence checks. > However with file capabilities it becomes possible for an > unprivileged user to execute a file with file capabilities > resulting in a more privileged task with the same uid. > > However now that cap_task_kill() always returns 0 (permission > granted) when p->uid==current->uid, the whole hook is worthless, > and only likely to create more subtle problems in the corner cases > where it might still be called but return -EPERM. Those cases > are basically when uids are different but euid/suid is equivalent > as per the check in check_kill_permission(). > > One example of a still-broken application is 'at' for non-root users. > > This patch removes cap_task_kill(). > > Signed-off-by: Serge Hallyn <serge@hallyn.com> > Acked-by: Andrew G. Morgan <morgan@kernel.org> > Tested-by: Luiz Fernando N. Capitulino <lcapitulino@mandriva.com.br> Acked-by: Casey Schaufler <casey@schaufler-ca.com> > --- > include/linux/security.h | 3 +-- > security/capability.c | 1 - > security/commoncap.c | 33 --------------------------------- > security/smack/smack_lsm.c | 5 ----- > 4 files changed, 1 insertions(+), 41 deletions(-) > > diff --git a/include/linux/security.h b/include/linux/security.h > index 2231526..13fd76a 100644 > --- a/include/linux/security.h > +++ b/include/linux/security.h > @@ -59,7 +59,6 @@ extern int cap_inode_need_killpriv(struct dentry *dentry); > extern int cap_inode_killpriv(struct dentry *dentry); > extern int cap_task_post_setuid (uid_t old_ruid, uid_t old_euid, uid_t > old_suid, int flags); > extern void cap_task_reparent_to_init (struct task_struct *p); > -extern int cap_task_kill(struct task_struct *p, struct siginfo *info, int > sig, u32 secid); > extern int cap_task_prctl(int option, unsigned long arg2, unsigned long > arg3, > unsigned long arg4, unsigned long arg5, long *rc_p); > extern int cap_task_setscheduler (struct task_struct *p, int policy, struct > sched_param *lp); > @@ -2276,7 +2275,7 @@ static inline int security_task_kill (struct > task_struct *p, > struct siginfo *info, int sig, > u32 secid) > { > - return cap_task_kill(p, info, sig, secid); > + return 0; > } > > static inline int security_task_wait (struct task_struct *p) > diff --git a/security/capability.c b/security/capability.c > index 8340655..38ac54e 100644 > --- a/security/capability.c > +++ b/security/capability.c > @@ -40,7 +40,6 @@ static struct security_operations capability_ops = { > .inode_need_killpriv = cap_inode_need_killpriv, > .inode_killpriv = cap_inode_killpriv, > > - .task_kill = cap_task_kill, > .task_setscheduler = cap_task_setscheduler, > .task_setioprio = cap_task_setioprio, > .task_setnice = cap_task_setnice, > diff --git a/security/commoncap.c b/security/commoncap.c > index 200361d..e8c3f5e 100644 > --- a/security/commoncap.c > +++ b/security/commoncap.c > @@ -537,34 +537,6 @@ int cap_task_setnice (struct task_struct *p, int nice) > return cap_safe_nice(p); > } > > -int cap_task_kill(struct task_struct *p, struct siginfo *info, > - int sig, u32 secid) > -{ > - /* > - * Running a setuid root program raises your capabilities. > - * Killing your own setuid root processes was previously > - * allowed. > - * We must preserve legacy signal behavior in this case. > - */ > - if (p->uid == current->uid) > - return 0; > - > - if (secid) > - /* > - * Signal sent as a particular user. > - * Capabilities are ignored. May be wrong, but it's the > - * only thing we can do at the moment. > - * Used only by usb drivers? > - */ > - return 0; > - if (cap_issubset(p->cap_permitted, current->cap_permitted)) > - return 0; > - if (capable(CAP_KILL)) > - return 0; > - > - return -EPERM; > -} > - > /* > * called from kernel/sys.c for prctl(PR_CABSET_DROP) > * done without task_capability_lock() because it introduces > @@ -596,11 +568,6 @@ int cap_task_setnice (struct task_struct *p, int nice) > { > return 0; > } > -int cap_task_kill(struct task_struct *p, struct siginfo *info, > - int sig, u32 secid) > -{ > - return 0; > -} > #endif > > int cap_task_prctl(int option, unsigned long arg2, unsigned long arg3, > diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c > index 4365fad..2a5eb83 100644 > --- a/security/smack/smack_lsm.c > +++ b/security/smack/smack_lsm.c > @@ -1117,11 +1117,6 @@ static int smack_task_movememory(struct task_struct > *p) > static int smack_task_kill(struct task_struct *p, struct siginfo *info, > int sig, u32 secid) > { > - int rc; > - > - rc = cap_task_kill(p, info, sig, secid); > - if (rc != 0) > - return rc; > /* > * Sending a signal requires that the sender > * can write the receiver. > -- > 1.5.2.5 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > Please read the FAQ at http://www.tux.org/lkml/ > > > Casey Schaufler casey@schaufler-ca.com ^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2008-03-20 15:29 UTC | newest] Thread overview: 10+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2008-03-19 16:56 [PATCH 1/1] file capabilities: remove cap_task_kill() (-git) Serge E. Hallyn 2008-03-19 18:12 ` Luiz Fernando N. Capitulino 2008-03-19 21:11 ` Andrew Morton 2008-03-19 21:20 ` Serge E. Hallyn 2008-03-19 23:46 ` Andrew Morton 2008-03-20 2:13 ` Linus Torvalds 2008-03-20 3:18 ` Serge E. Hallyn 2008-03-20 4:17 ` Linus Torvalds 2008-03-20 13:25 ` Serge E. Hallyn 2008-03-20 15:29 ` Casey Schaufler
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.