* [PATCH] audit: don't attempt to lookup PIDs when changing PID filtering audit rules
@ 2014-12-15 17:14 Paul Moore
2014-12-15 17:29 ` Eric Paris
0 siblings, 1 reply; 11+ messages in thread
From: Paul Moore @ 2014-12-15 17:14 UTC (permalink / raw)
To: linux-audit; +Cc: rgb
Commit f1dc4867 ("audit: anchor all pid references in the initial pid
namespace") introduced a find_vpid() call when adding/removing audit
rules with PID/PPID filters; unfortunately this is problematic as
find_vpid() only works if there is a task with the associated PID
alive on the system. The following commands demonstrate a simple
reproducer.
# auditctl -D
# auditctl -l
# autrace /bin/true
# auditctl -l
This patch resolves the problem by simply using the PID provided by
the user without any additional validation, e.g. no calls to check to
see if the task/PID exists.
Cc: stable@vger.kernel.org # 3.15
Cc: Richard Guy Briggs <rgb@redhat.com>
Signed-off-by: Paul Moore <pmoore@redhat.com>
---
kernel/auditfilter.c | 13 -------------
1 file changed, 13 deletions(-)
diff --git a/kernel/auditfilter.c b/kernel/auditfilter.c
index 8e9bc9c..b2e63ba 100644
--- a/kernel/auditfilter.c
+++ b/kernel/auditfilter.c
@@ -433,19 +433,6 @@ static struct audit_entry *audit_data_to_entry(struct audit_rule_data *data,
f->val = 0;
}
- if ((f->type == AUDIT_PID) || (f->type == AUDIT_PPID)) {
- struct pid *pid;
- rcu_read_lock();
- pid = find_vpid(f->val);
- if (!pid) {
- rcu_read_unlock();
- err = -ESRCH;
- goto exit_free;
- }
- f->val = pid_nr(pid);
- rcu_read_unlock();
- }
-
err = audit_field_valid(entry, f);
if (err)
goto exit_free;
^ permalink raw reply related [flat|nested] 11+ messages in thread* Re: [PATCH] audit: don't attempt to lookup PIDs when changing PID filtering audit rules 2014-12-15 17:14 [PATCH] audit: don't attempt to lookup PIDs when changing PID filtering audit rules Paul Moore @ 2014-12-15 17:29 ` Eric Paris 2014-12-15 18:50 ` Richard Guy Briggs 2014-12-15 19:03 ` Paul Moore 0 siblings, 2 replies; 11+ messages in thread From: Eric Paris @ 2014-12-15 17:29 UTC (permalink / raw) To: Paul Moore; +Cc: rgb, linux-audit Lets say I and in the non-init pid namespace. I run audictl -a exit,always -S all -F pid=1 Is the audit system going to show records for what I think is pid=1 or what the initial pid namespace thinks is pid=1 ? Which is correct? (hint, it's impossible to know pids above my namespace, or even to know what pid the process in question thinks it is, since it could be below my namespace) I won't pretend this is easy to solve. Steve et al. What do you think of maybe having pid= rules automatically removed when the pid goes away? I can't think of another way to handle this (although the perf hit might be so stupidly high....) On Mon, 2014-12-15 at 12:14 -0500, Paul Moore wrote: > Commit f1dc4867 ("audit: anchor all pid references in the initial pid > namespace") introduced a find_vpid() call when adding/removing audit > rules with PID/PPID filters; unfortunately this is problematic as > find_vpid() only works if there is a task with the associated PID > alive on the system. The following commands demonstrate a simple > reproducer. > > # auditctl -D > # auditctl -l > # autrace /bin/true > # auditctl -l > > This patch resolves the problem by simply using the PID provided by > the user without any additional validation, e.g. no calls to check to > see if the task/PID exists. > > Cc: stable@vger.kernel.org # 3.15 > Cc: Richard Guy Briggs <rgb@redhat.com> > Signed-off-by: Paul Moore <pmoore@redhat.com> > --- > kernel/auditfilter.c | 13 ------------- > 1 file changed, 13 deletions(-) > > diff --git a/kernel/auditfilter.c b/kernel/auditfilter.c > index 8e9bc9c..b2e63ba 100644 > --- a/kernel/auditfilter.c > +++ b/kernel/auditfilter.c > @@ -433,19 +433,6 @@ static struct audit_entry *audit_data_to_entry(struct audit_rule_data *data, > f->val = 0; > } > > - if ((f->type == AUDIT_PID) || (f->type == AUDIT_PPID)) { > - struct pid *pid; > - rcu_read_lock(); > - pid = find_vpid(f->val); > - if (!pid) { > - rcu_read_unlock(); > - err = -ESRCH; > - goto exit_free; > - } > - f->val = pid_nr(pid); > - rcu_read_unlock(); > - } > - > err = audit_field_valid(entry, f); > if (err) > goto exit_free; > > -- > Linux-audit mailing list > Linux-audit@redhat.com > https://www.redhat.com/mailman/listinfo/linux-audit ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] audit: don't attempt to lookup PIDs when changing PID filtering audit rules 2014-12-15 17:29 ` Eric Paris @ 2014-12-15 18:50 ` Richard Guy Briggs 2014-12-15 18:51 ` Eric Paris 2014-12-15 19:14 ` Paul Moore 2014-12-15 19:03 ` Paul Moore 1 sibling, 2 replies; 11+ messages in thread From: Richard Guy Briggs @ 2014-12-15 18:50 UTC (permalink / raw) To: Eric Paris; +Cc: linux-audit On 14/12/15, Eric Paris wrote: > Lets say I and in the non-init pid namespace. > > I run audictl -a exit,always -S all -F pid=1 That's easy (for now). Line 675 of kernel/audit.c in audit_netlink_ok() called from audit_receive_msg() will prevent that with: if ((task_active_pid_ns(current) != &init_pid_ns)) return -EPERM; > Is the audit system going to show records for what I think is pid=1 or > what the initial pid namespace thinks is pid=1 ? Longer term this will need to be solved if we want to run commands requiring CAP_AUDIT_CONTROL in a container. I've still got outstanding patches to store PIDs as struct pid rather than pid_t, so this was part of the motivation to start that in this code. > Which is correct? (hint, it's impossible to know pids above my > namespace, or even to know what pid the process in question thinks it > is, since it could be below my namespace) > > I won't pretend this is easy to solve. At the moment, this patch will solve this problem. It is also arguably more necessary on AUDIT_ADD_RULE than for AUDIT_DEL_RULE. > Steve et al. What do you think of maybe having pid= rules automatically > removed when the pid goes away? I can't think of another way to handle > this (although the perf hit might be so stupidly high....) That makes sense, as the same is done for paths that vanish. > On Mon, 2014-12-15 at 12:14 -0500, Paul Moore wrote: > > Commit f1dc4867 ("audit: anchor all pid references in the initial pid > > namespace") introduced a find_vpid() call when adding/removing audit > > rules with PID/PPID filters; unfortunately this is problematic as > > find_vpid() only works if there is a task with the associated PID > > alive on the system. The following commands demonstrate a simple > > reproducer. > > > > # auditctl -D > > # auditctl -l > > # autrace /bin/true > > # auditctl -l > > > > This patch resolves the problem by simply using the PID provided by > > the user without any additional validation, e.g. no calls to check to > > see if the task/PID exists. > > > > Cc: stable@vger.kernel.org # 3.15 > > Cc: Richard Guy Briggs <rgb@redhat.com> > > Signed-off-by: Paul Moore <pmoore@redhat.com> > > --- > > kernel/auditfilter.c | 13 ------------- > > 1 file changed, 13 deletions(-) > > > > diff --git a/kernel/auditfilter.c b/kernel/auditfilter.c > > index 8e9bc9c..b2e63ba 100644 > > --- a/kernel/auditfilter.c > > +++ b/kernel/auditfilter.c > > @@ -433,19 +433,6 @@ static struct audit_entry *audit_data_to_entry(struct audit_rule_data *data, > > f->val = 0; > > } > > > > - if ((f->type == AUDIT_PID) || (f->type == AUDIT_PPID)) { > > - struct pid *pid; > > - rcu_read_lock(); > > - pid = find_vpid(f->val); > > - if (!pid) { > > - rcu_read_unlock(); > > - err = -ESRCH; > > - goto exit_free; > > - } > > - f->val = pid_nr(pid); > > - rcu_read_unlock(); > > - } > > - > > err = audit_field_valid(entry, f); > > if (err) > > goto exit_free; > > > > -- > > Linux-audit mailing list > > Linux-audit@redhat.com > > https://www.redhat.com/mailman/listinfo/linux-audit > > - RGB -- Richard Guy Briggs <rbriggs@redhat.com> Senior Software Engineer, Kernel Security, AMER ENG Base Operating Systems, Red Hat Remote, Ottawa, Canada Voice: +1.647.777.2635, Internal: (81) 32635, Alt: +1.613.693.0684x3545 ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] audit: don't attempt to lookup PIDs when changing PID filtering audit rules 2014-12-15 18:50 ` Richard Guy Briggs @ 2014-12-15 18:51 ` Eric Paris 2014-12-15 19:15 ` Paul Moore 2014-12-15 19:14 ` Paul Moore 1 sibling, 1 reply; 11+ messages in thread From: Eric Paris @ 2014-12-15 18:51 UTC (permalink / raw) To: Richard Guy Briggs; +Cc: linux-audit On Mon, 2014-12-15 at 13:50 -0500, Richard Guy Briggs wrote: > On 14/12/15, Eric Paris wrote: > > Lets say I and in the non-init pid namespace. > > > > I run audictl -a exit,always -S all -F pid=1 > > That's easy (for now). Line 675 of kernel/audit.c in audit_netlink_ok() > called from audit_receive_msg() will prevent that with: > > if ((task_active_pid_ns(current) != &init_pid_ns)) > return -EPERM; > > > Is the audit system going to show records for what I think is pid=1 or > > what the initial pid namespace thinks is pid=1 ? ACK from me then. ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] audit: don't attempt to lookup PIDs when changing PID filtering audit rules 2014-12-15 18:51 ` Eric Paris @ 2014-12-15 19:15 ` Paul Moore 2014-12-15 19:33 ` Richard Guy Briggs 0 siblings, 1 reply; 11+ messages in thread From: Paul Moore @ 2014-12-15 19:15 UTC (permalink / raw) To: Eric Paris; +Cc: Richard Guy Briggs, linux-audit On Monday, December 15, 2014 01:51:52 PM Eric Paris wrote: > On Mon, 2014-12-15 at 13:50 -0500, Richard Guy Briggs wrote: > > On 14/12/15, Eric Paris wrote: > > > Lets say I and in the non-init pid namespace. > > > > > > I run audictl -a exit,always -S all -F pid=1 > > > > That's easy (for now). Line 675 of kernel/audit.c in audit_netlink_ok() > > > > called from audit_receive_msg() will prevent that with: > > if ((task_active_pid_ns(current) != &init_pid_ns)) > > > > return -EPERM; > > > > > Is the audit system going to show records for what I think is pid=1 or > > > what the initial pid namespace thinks is pid=1 ? > > ACK from me then. Okay, thanks. Anybody else want to jump on the Ack/Review bandwagon? -- paul moore security and virtualization @ redhat ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] audit: don't attempt to lookup PIDs when changing PID filtering audit rules 2014-12-15 19:15 ` Paul Moore @ 2014-12-15 19:33 ` Richard Guy Briggs 2014-12-15 19:58 ` Paul Moore 0 siblings, 1 reply; 11+ messages in thread From: Richard Guy Briggs @ 2014-12-15 19:33 UTC (permalink / raw) To: Paul Moore; +Cc: linux-audit On 14/12/15, Paul Moore wrote: > On Monday, December 15, 2014 01:51:52 PM Eric Paris wrote: > > On Mon, 2014-12-15 at 13:50 -0500, Richard Guy Briggs wrote: > > > On 14/12/15, Eric Paris wrote: > > > > Lets say I and in the non-init pid namespace. > > > > > > > > I run audictl -a exit,always -S all -F pid=1 > > > > > > That's easy (for now). Line 675 of kernel/audit.c in audit_netlink_ok() > > > > > > called from audit_receive_msg() will prevent that with: > > > if ((task_active_pid_ns(current) != &init_pid_ns)) > > > > > > return -EPERM; > > > > > > > Is the audit system going to show records for what I think is pid=1 or > > > > what the initial pid namespace thinks is pid=1 ? > > > > ACK from me then. > > Okay, thanks. Anybody else want to jump on the Ack/Review bandwagon? Guess I should have added some text about that... Add whichever you feel is most appropriate (Ack/Review/Signed...) > paul moore - RGB -- Richard Guy Briggs <rbriggs@redhat.com> Senior Software Engineer, Kernel Security, AMER ENG Base Operating Systems, Red Hat Remote, Ottawa, Canada Voice: +1.647.777.2635, Internal: (81) 32635, Alt: +1.613.693.0684x3545 ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] audit: don't attempt to lookup PIDs when changing PID filtering audit rules 2014-12-15 19:33 ` Richard Guy Briggs @ 2014-12-15 19:58 ` Paul Moore 0 siblings, 0 replies; 11+ messages in thread From: Paul Moore @ 2014-12-15 19:58 UTC (permalink / raw) To: Richard Guy Briggs; +Cc: linux-audit On Monday, December 15, 2014 02:33:36 PM Richard Guy Briggs wrote: > On 14/12/15, Paul Moore wrote: > > On Monday, December 15, 2014 01:51:52 PM Eric Paris wrote: > > > On Mon, 2014-12-15 at 13:50 -0500, Richard Guy Briggs wrote: > > > > On 14/12/15, Eric Paris wrote: > > > > > Lets say I and in the non-init pid namespace. > > > > > > > > > > I run audictl -a exit,always -S all -F pid=1 > > > > > > > > That's easy (for now). Line 675 of kernel/audit.c in > > > > audit_netlink_ok() > > > > > > > > called from audit_receive_msg() will prevent that with: > > > > if ((task_active_pid_ns(current) != &init_pid_ns)) > > > > > > > > return -EPERM; > > > > > > > > > Is the audit system going to show records for what I think is pid=1 > > > > > or > > > > > what the initial pid namespace thinks is pid=1 ? > > > > > > ACK from me then. > > > > Okay, thanks. Anybody else want to jump on the Ack/Review bandwagon? > > Guess I should have added some text about that... Add whichever you > feel is most appropriate (Ack/Review/Signed...) I'll add your Reviewed-by tag then. Thanks. I suppose everyone is different, but I *really* like seeing "Reviewed-by" and "Tested-by" tags on a patch since it indicates that someone who is not the patch author has looked at and/or tested the code separately and found it to be good. To me Acked-by usually just means that the maintainer, or someone important to the effort, gave it a passing glance a said "ok". Ack's are important, but I give a higher weight to the reviewed and tested tags. -- paul moore security and virtualization @ redhat ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] audit: don't attempt to lookup PIDs when changing PID filtering audit rules 2014-12-15 18:50 ` Richard Guy Briggs 2014-12-15 18:51 ` Eric Paris @ 2014-12-15 19:14 ` Paul Moore 1 sibling, 0 replies; 11+ messages in thread From: Paul Moore @ 2014-12-15 19:14 UTC (permalink / raw) To: Richard Guy Briggs; +Cc: linux-audit On Monday, December 15, 2014 01:50:57 PM Richard Guy Briggs wrote: > I've still got outstanding patches to store PIDs as struct pid rather > than pid_t, so this was part of the motivation to start that in this > code. Funny you mention this, while I was hunting for the root cause of the problem, I had a patch which did just that, adding a pid struct to the audit_field struct. Eventually we will have to go that route as (sadly) a PID is no longer sufficient to identify a process on the system, you need PID+ns. We'll still have the find_pid() problem then, but there are ways around that by being smarter about how we add/delete/store filtering rules. I opted for the patch I posted here because as you point out we really only work in the init namespace and it didn't muddle the bugfix with new functionality. -- paul moore security and virtualization @ redhat ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] audit: don't attempt to lookup PIDs when changing PID filtering audit rules 2014-12-15 17:29 ` Eric Paris 2014-12-15 18:50 ` Richard Guy Briggs @ 2014-12-15 19:03 ` Paul Moore 2014-12-15 21:14 ` Steve Grubb 1 sibling, 1 reply; 11+ messages in thread From: Paul Moore @ 2014-12-15 19:03 UTC (permalink / raw) To: Eric Paris; +Cc: rgb, linux-audit On Monday, December 15, 2014 12:29:52 PM Eric Paris wrote: > Lets say I and in the non-init pid namespace. > > I run audictl -a exit,always -S all -F pid=1 > > Is the audit system going to show records for what I think is pid=1 or > what the initial pid namespace thinks is pid=1 ? The initial namespace. If we want the executing task's current namespace we should probably change audit_filter_user_rules(). > Which is correct? (hint, it's impossible to know pids above my > namespace, or even to know what pid the process in question thinks it > is, since it could be below my namespace) Heh. I'm sorry, I tend to laugh when I hear the term "correct" during an audit discussion ;) Steve, Richard, Eric - what do you guys want: initial or current namespace? > I won't pretend this is easy to solve. > > Steve et al. What do you think of maybe having pid= rules automatically > removed when the pid goes away? I can't think of another way to handle > this (although the perf hit might be so stupidly high....) I'm personally not super excited about rules disappearing automatically and I also believe that it should be possible to remove a rule regardless (not being able to remove a PID filtering rule due to the status of the associated task is silly). -- paul moore security and virtualization @ redhat ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] audit: don't attempt to lookup PIDs when changing PID filtering audit rules 2014-12-15 19:03 ` Paul Moore @ 2014-12-15 21:14 ` Steve Grubb 2014-12-15 21:24 ` Eric Paris 0 siblings, 1 reply; 11+ messages in thread From: Steve Grubb @ 2014-12-15 21:14 UTC (permalink / raw) To: linux-audit; +Cc: rgb On Monday, December 15, 2014 02:03:05 PM Paul Moore wrote: > > Lets say I and in the non-init pid namespace. > > > > I run audictl -a exit,always -S all -F pid=1 > > > > Is the audit system going to show records for what I think is pid=1 or > > what the initial pid namespace thinks is pid=1 ? > > The initial namespace. If we want the executing task's current namespace > we should probably change audit_filter_user_rules(). > > > Which is correct? (hint, it's impossible to know pids above my > > namespace, or even to know what pid the process in question thinks it > > is, since it could be below my namespace) > > Heh. I'm sorry, I tend to laugh when I hear the term "correct" during an > audit discussion > > Steve, Richard, Eric - what do you guys want: initial or current namespace? To be clear, this pid name space is normally used in conjunction with containers. We don't want any events from within a container unless we also have an audit name space. Everything inside the container is potentially operating out side the security policy of the system. So, I'd be fine with them being on the init namespace since we have a lot more work to do for containers. The autrace use case is likely to be the only user of pid in the audit rules because its useless for nearly anything else. The audit by process name feature is what most people will use as soon as its upstreamed. Thanks, -Steve ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] audit: don't attempt to lookup PIDs when changing PID filtering audit rules 2014-12-15 21:14 ` Steve Grubb @ 2014-12-15 21:24 ` Eric Paris 0 siblings, 0 replies; 11+ messages in thread From: Eric Paris @ 2014-12-15 21:24 UTC (permalink / raw) To: Steve Grubb; +Cc: rgb, linux-audit On Mon, 2014-12-15 at 16:14 -0500, Steve Grubb wrote: > We don't want any events from within a container unless we also > have an audit name space. Everything inside the container is potentially > operating out side the security policy of the system. I am not arguing with any of the substance/meaning of what you intend in any way. However, every time someone uses the word 'container' they are severely mis-characterizing the problem space. There are no containers. It's even worse to say 'container' than it is to say 'the path.' Containers are a userspace construct made out of numerous disjoint kernel primitives (mainly the numerous namespaces). The kernel does not, can not, and will not every know about a 'container.' This MUST be a key concept when we think about how to make audit work in a world where people want to use kernel namespaces. ^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2014-12-15 21:24 UTC | newest] Thread overview: 11+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2014-12-15 17:14 [PATCH] audit: don't attempt to lookup PIDs when changing PID filtering audit rules Paul Moore 2014-12-15 17:29 ` Eric Paris 2014-12-15 18:50 ` Richard Guy Briggs 2014-12-15 18:51 ` Eric Paris 2014-12-15 19:15 ` Paul Moore 2014-12-15 19:33 ` Richard Guy Briggs 2014-12-15 19:58 ` Paul Moore 2014-12-15 19:14 ` Paul Moore 2014-12-15 19:03 ` Paul Moore 2014-12-15 21:14 ` Steve Grubb 2014-12-15 21:24 ` Eric Paris
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).