* [RFC PATCH v1] selinux: Fix security_compute_av() to not return unknown class errors when in permissive mode
@ 2009-12-11 21:42 Paul Moore
2009-12-11 21:59 ` Stephen Smalley
0 siblings, 1 reply; 5+ messages in thread
From: Paul Moore @ 2009-12-11 21:42 UTC (permalink / raw)
To: selinux; +Cc: russell, amworsley
It is possible security_compute_av() to return -EINVAL, even when in
permissive mode, due to unknown object classes. This patch fixes this by
first checking to see if SELinux is in permissive mode or if the subject is
a permissive domain, if either of these are true then security_compute_av()
ignores the unknown class error and allows the operation to proceed.
Andrew: I've tested this patch to ensure it boots and does not regress my
Fedora/Rawhide system but since I don't have a Debian system handy I'm not
able to verify that this fixes your problem; could you please test this
patch and report back?
Reported-by: Andrew Worsley <amworsley@gmail.com>
Signed-off-by: Paul Moore <paul.moore@hp.com>
---
security/selinux/ss/services.c | 21 +++++++++++++++------
1 files changed, 15 insertions(+), 6 deletions(-)
diff --git a/security/selinux/ss/services.c b/security/selinux/ss/services.c
index b3efae2..db88153 100644
--- a/security/selinux/ss/services.c
+++ b/security/selinux/ss/services.c
@@ -940,6 +940,7 @@ int security_compute_av(u32 ssid,
{
u16 tclass;
u32 requested;
+ struct context *scontext;
int rc;
read_lock(&policy_rwlock);
@@ -949,12 +950,8 @@ int security_compute_av(u32 ssid,
requested = unmap_perm(orig_tclass, orig_requested);
tclass = unmap_class(orig_tclass);
- if (unlikely(orig_tclass && !tclass)) {
- if (policydb.allow_unknown)
- goto allow;
- rc = -EINVAL;
- goto out;
- }
+ if (unlikely(orig_tclass && !tclass))
+ goto unknown_class;
rc = security_compute_av_core(ssid, tsid, tclass, requested, avd);
map_decision(orig_tclass, avd, policydb.allow_unknown);
out:
@@ -968,6 +965,18 @@ allow:
avd->flags = 0;
rc = 0;
goto out;
+unknown_class:
+ if (policydb.allow_unknown || !selinux_enforcing)
+ goto allow;
+ scontext = sidtab_search(&sidtab, ssid);
+ if (scontext) {
+ if (ebitmap_get_bit(&policydb.permissive_map, scontext->type))
+ goto allow;
+ } else
+ printk(KERN_ERR "SELinux: %s: unrecognized SID %d\n",
+ __func__, ssid);
+ rc = -EINVAL;
+ goto out;
}
int security_compute_av_user(u32 ssid,
--
This message was distributed to subscribers of the selinux mailing list.
If you no longer wish to subscribe, send mail to majordomo@tycho.nsa.gov with
the words "unsubscribe selinux" without quotes as the message.
^ permalink raw reply related [flat|nested] 5+ messages in thread* Re: [RFC PATCH v1] selinux: Fix security_compute_av() to not return unknown class errors when in permissive mode
2009-12-11 21:42 [RFC PATCH v1] selinux: Fix security_compute_av() to not return unknown class errors when in permissive mode Paul Moore
@ 2009-12-11 21:59 ` Stephen Smalley
2009-12-14 15:45 ` Paul Moore
2009-12-14 22:22 ` Paul Moore
0 siblings, 2 replies; 5+ messages in thread
From: Stephen Smalley @ 2009-12-11 21:59 UTC (permalink / raw)
To: Paul Moore; +Cc: selinux, russell, amworsley
On Fri, 2009-12-11 at 16:42 -0500, Paul Moore wrote:
> It is possible security_compute_av() to return -EINVAL, even when in
> permissive mode, due to unknown object classes. This patch fixes this by
> first checking to see if SELinux is in permissive mode or if the subject is
> a permissive domain, if either of these are true then security_compute_av()
> ignores the unknown class error and allows the operation to proceed.
>
> Andrew: I've tested this patch to ensure it boots and does not regress my
> Fedora/Rawhide system but since I don't have a Debian system handy I'm not
> able to verify that this fixes your problem; could you please test this
> patch and report back?
>
> Reported-by: Andrew Worsley <amworsley@gmail.com>
> Signed-off-by: Paul Moore <paul.moore@hp.com>
> ---
> security/selinux/ss/services.c | 21 +++++++++++++++------
> 1 files changed, 15 insertions(+), 6 deletions(-)
>
> diff --git a/security/selinux/ss/services.c b/security/selinux/ss/services.c
> index b3efae2..db88153 100644
> --- a/security/selinux/ss/services.c
> +++ b/security/selinux/ss/services.c
> @@ -940,6 +940,7 @@ int security_compute_av(u32 ssid,
> {
> u16 tclass;
> u32 requested;
> + struct context *scontext;
> int rc;
>
> read_lock(&policy_rwlock);
> @@ -949,12 +950,8 @@ int security_compute_av(u32 ssid,
>
> requested = unmap_perm(orig_tclass, orig_requested);
> tclass = unmap_class(orig_tclass);
> - if (unlikely(orig_tclass && !tclass)) {
> - if (policydb.allow_unknown)
> - goto allow;
> - rc = -EINVAL;
> - goto out;
> - }
> + if (unlikely(orig_tclass && !tclass))
> + goto unknown_class;
> rc = security_compute_av_core(ssid, tsid, tclass, requested, avd);
> map_decision(orig_tclass, avd, policydb.allow_unknown);
> out:
> @@ -968,6 +965,18 @@ allow:
> avd->flags = 0;
> rc = 0;
> goto out;
> +unknown_class:
> + if (policydb.allow_unknown || !selinux_enforcing)
> + goto allow;
> + scontext = sidtab_search(&sidtab, ssid);
> + if (scontext) {
> + if (ebitmap_get_bit(&policydb.permissive_map, scontext->type))
> + goto allow;
> + } else
> + printk(KERN_ERR "SELinux: %s: unrecognized SID %d\n",
> + __func__, ssid);
> + rc = -EINVAL;
> + goto out;
> }
>
> int security_compute_av_user(u32 ssid,
Can we simplify this at all? For example, I don't really think
sidtab_search() can ever fail anymore (it falls back to the unlabeled
SID, which has to be defined by the initial policy load). I also think
we could just clear avd->allowed and return 0 rather than returning
-EINVAL in this case so that the existing avc_has_perm() logic would
proceed and check permissive mode on its own. We likely should also
move the permissive map test earlier so that it always get applied
unconditionally.
--
Stephen Smalley
National Security Agency
--
This message was distributed to subscribers of the selinux mailing list.
If you no longer wish to subscribe, send mail to majordomo@tycho.nsa.gov with
the words "unsubscribe selinux" without quotes as the message.
^ permalink raw reply [flat|nested] 5+ messages in thread* Re: [RFC PATCH v1] selinux: Fix security_compute_av() to not return unknown class errors when in permissive mode
2009-12-11 21:59 ` Stephen Smalley
@ 2009-12-14 15:45 ` Paul Moore
2009-12-14 22:22 ` Paul Moore
1 sibling, 0 replies; 5+ messages in thread
From: Paul Moore @ 2009-12-14 15:45 UTC (permalink / raw)
To: Stephen Smalley; +Cc: selinux, russell, amworsley
On Friday 11 December 2009 04:59:19 pm Stephen Smalley wrote:
> On Fri, 2009-12-11 at 16:42 -0500, Paul Moore wrote:
> > It is possible security_compute_av() to return -EINVAL, even when in
> > permissive mode, due to unknown object classes. This patch fixes this by
> > first checking to see if SELinux is in permissive mode or if the subject
> > is a permissive domain, if either of these are true then
> > security_compute_av() ignores the unknown class error and allows the
> > operation to proceed.
> >
> > Andrew: I've tested this patch to ensure it boots and does not regress my
> > Fedora/Rawhide system but since I don't have a Debian system handy I'm
> > not able to verify that this fixes your problem; could you please test
> > this patch and report back?
> >
> > Reported-by: Andrew Worsley <amworsley@gmail.com>
> > Signed-off-by: Paul Moore <paul.moore@hp.com>
> > ---
> > security/selinux/ss/services.c | 21 +++++++++++++++------
> > 1 files changed, 15 insertions(+), 6 deletions(-)
...
> Can we simplify this at all? For example, I don't really think
> sidtab_search() can ever fail anymore (it falls back to the unlabeled
> SID, which has to be defined by the initial policy load). I also think
> we could just clear avd->allowed and return 0 rather than returning
> -EINVAL in this case so that the existing avc_has_perm() logic would
> proceed and check permissive mode on its own. We likely should also
> move the permissive map test earlier so that it always get applied
> unconditionally.
Sure, I just wanted to get something out sooner rather than later in case this
turned out to be something which affected a large number of users and we
needed a quick patch for -stable. I'll admit it ain't pretty but it should at
least work in a pinch.
Give me a bit and let me see if I can make it less ugly.
--
paul moore
linux @ hp
--
This message was distributed to subscribers of the selinux mailing list.
If you no longer wish to subscribe, send mail to majordomo@tycho.nsa.gov with
the words "unsubscribe selinux" without quotes as the message.
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [RFC PATCH v1] selinux: Fix security_compute_av() to not return unknown class errors when in permissive mode
2009-12-11 21:59 ` Stephen Smalley
2009-12-14 15:45 ` Paul Moore
@ 2009-12-14 22:22 ` Paul Moore
2009-12-16 14:59 ` Stephen Smalley
1 sibling, 1 reply; 5+ messages in thread
From: Paul Moore @ 2009-12-14 22:22 UTC (permalink / raw)
To: Stephen Smalley; +Cc: selinux, russell, amworsley
On Friday 11 December 2009 04:59:19 pm Stephen Smalley wrote:
> ... For example, I don't really think sidtab_search() can ever fail anymore
> (it falls back to the unlabeled SID, which has to be defined by the initial
> policy load) ...
I just spent a bit of time looking at the policy loading code and can't seem
to find where it is enforced that there must be an initial SID for the
unlabeled case. I don't doubt that it is there, but I just spent an hour
staring at the policydb code and I can't seem to find it ... care to toss a
pointer my way :)
--
paul moore
linux @ hp
--
This message was distributed to subscribers of the selinux mailing list.
If you no longer wish to subscribe, send mail to majordomo@tycho.nsa.gov with
the words "unsubscribe selinux" without quotes as the message.
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [RFC PATCH v1] selinux: Fix security_compute_av() to not return unknown class errors when in permissive mode
2009-12-14 22:22 ` Paul Moore
@ 2009-12-16 14:59 ` Stephen Smalley
0 siblings, 0 replies; 5+ messages in thread
From: Stephen Smalley @ 2009-12-16 14:59 UTC (permalink / raw)
To: Paul Moore; +Cc: selinux, russell, amworsley
On Mon, 2009-12-14 at 17:22 -0500, Paul Moore wrote:
> On Friday 11 December 2009 04:59:19 pm Stephen Smalley wrote:
> > ... For example, I don't really think sidtab_search() can ever fail anymore
> > (it falls back to the unlabeled SID, which has to be defined by the initial
> > policy load) ...
>
> I just spent a bit of time looking at the policy loading code and can't seem
> to find where it is enforced that there must be an initial SID for the
> unlabeled case. I don't doubt that it is there, but I just spent an hour
> staring at the policydb code and I can't seem to find it ... care to toss a
> pointer my way :)
Hmmm...I think you are correct, although the system would not work very
well if you did in fact omit such a definition from the policy. Initial
SIDs handling needs an overhaul, that's already noted on the todo list.
So I guess sidtab_search() can possibly fail still, although it won't
with any correctly configured policy.
--
Stephen Smalley
National Security Agency
--
This message was distributed to subscribers of the selinux mailing list.
If you no longer wish to subscribe, send mail to majordomo@tycho.nsa.gov with
the words "unsubscribe selinux" without quotes as the message.
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2009-12-16 14:59 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-12-11 21:42 [RFC PATCH v1] selinux: Fix security_compute_av() to not return unknown class errors when in permissive mode Paul Moore
2009-12-11 21:59 ` Stephen Smalley
2009-12-14 15:45 ` Paul Moore
2009-12-14 22:22 ` Paul Moore
2009-12-16 14:59 ` Stephen Smalley
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.