15 Aug, 2015

1 commit


14 Jul, 2015

2 commits

  • Ensure that we catch any cases where tclass == 0.

    Signed-off-by: Stephen Smalley
    Signed-off-by: Paul Moore

    Stephen Smalley
     
  • Add extended permissions logic to selinux. Extended permissions
    provides additional permissions in 256 bit increments. Extend the
    generic ioctl permission check to use the extended permissions for
    per-command filtering. Source/target/class sets including the ioctl
    permission may additionally include a set of commands. Example:

    allowxperm : ioctl unpriv_app_socket_cmds
    auditallowxperm : ioctl priv_gpu_cmds

    Where unpriv_app_socket_cmds and priv_gpu_cmds are macros
    representing commonly granted sets of ioctl commands.

    When ioctl commands are omitted only the permissions are checked.
    This feature is intended to provide finer granularity for the ioctl
    permission that may be too imprecise. For example, the same driver
    may use ioctls to provide important and benign functionality such as
    driver version or socket type as well as dangerous capabilities such
    as debugging features, read/write/execute to physical memory or
    access to sensitive data. Per-command filtering provides a mechanism
    to reduce the attack surface of the kernel, and limit applications
    to the subset of commands required.

    The format of the policy binary has been modified to include ioctl
    commands, and the policy version number has been incremented to
    POLICYDB_VERSION_XPERMS_IOCTL=30 to account for the format
    change.

    The extended permissions logic is deliberately generic to allow
    components to be reused e.g. netlink filters

    Signed-off-by: Jeff Vander Stoep
    Acked-by: Nick Kralevich
    Signed-off-by: Paul Moore

    Jeff Vander Stoep
     

11 May, 2015

1 commit


07 Apr, 2015

1 commit


05 Feb, 2015

1 commit


04 Jun, 2014

1 commit


05 Oct, 2013

2 commits


28 Feb, 2013

1 commit

  • I'm not sure why, but the hlist for each entry iterators were conceived

    list_for_each_entry(pos, head, member)

    The hlist ones were greedy and wanted an extra parameter:

    hlist_for_each_entry(tpos, pos, head, member)

    Why did they need an extra pos parameter? I'm not quite sure. Not only
    they don't really need it, it also prevents the iterator from looking
    exactly like the list iterator, which is unfortunate.

    Besides the semantic patch, there was some manual work required:

    - Fix up the actual hlist iterators in linux/list.h
    - Fix up the declaration of other iterators based on the hlist ones.
    - A very small amount of places were using the 'node' parameter, this
    was modified to use 'obj->member' instead.
    - Coccinelle didn't handle the hlist_for_each_entry_safe iterator
    properly, so those had to be fixed up manually.

    The semantic patch which is mostly the work of Peter Senna Tschudin is here:

    @@
    iterator name hlist_for_each_entry, hlist_for_each_entry_continue, hlist_for_each_entry_from, hlist_for_each_entry_rcu, hlist_for_each_entry_rcu_bh, hlist_for_each_entry_continue_rcu_bh, for_each_busy_worker, ax25_uid_for_each, ax25_for_each, inet_bind_bucket_for_each, sctp_for_each_hentry, sk_for_each, sk_for_each_rcu, sk_for_each_from, sk_for_each_safe, sk_for_each_bound, hlist_for_each_entry_safe, hlist_for_each_entry_continue_rcu, nr_neigh_for_each, nr_neigh_for_each_safe, nr_node_for_each, nr_node_for_each_safe, for_each_gfn_indirect_valid_sp, for_each_gfn_sp, for_each_host;

    type T;
    expression a,c,d,e;
    identifier b;
    statement S;
    @@

    -T b;

    [akpm@linux-foundation.org: drop bogus change from net/ipv4/raw.c]
    [akpm@linux-foundation.org: drop bogus hunk from net/ipv6/raw.c]
    [akpm@linux-foundation.org: checkpatch fixes]
    [akpm@linux-foundation.org: fix warnings]
    [akpm@linux-foudnation.org: redo intrusive kvm changes]
    Tested-by: Peter Senna Tschudin
    Acked-by: Paul E. McKenney
    Signed-off-by: Sasha Levin
    Cc: Wu Fengguang
    Cc: Marcelo Tosatti
    Cc: Gleb Natapov
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Sasha Levin
     

01 Aug, 2012

1 commit

  • Failing to allocate a cache entry will only harm performance not
    correctness. Do not consume valuable reserve pages for something like
    that.

    Signed-off-by: Peter Zijlstra
    Signed-off-by: Mel Gorman
    Acked-by: Eric Paris
    Acked-by: Rik van Riel
    Cc: James Morris
    Cc: Christoph Hellwig
    Cc: David S. Miller
    Cc: Eric B Munson
    Cc: Mel Gorman
    Cc: Mike Christie
    Cc: Neil Brown
    Cc: Sebastian Andrzej Siewior
    Cc: Trond Myklebust
    Cc: Xiaotian Feng
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Mel Gorman
     

10 Apr, 2012

6 commits


04 Apr, 2012

4 commits


01 Apr, 2012

2 commits

  • Now that all the slow-path code is gone from these functions, we can
    inline them into the main caller - avc_has_perm_flags().

    Now the compiler can see that 'avc' is allocated on the stack for this
    case, which helps register pressure a bit. It also actually shrinks the
    total stack frame, because the stack frame that avc_has_perm_flags()
    always needed (for that 'avc' allocation) is now sufficient for the
    inlined functions too.

    Inlining isn't bad - but mindless inlining of cold code (see the
    previous commit) is.

    Signed-off-by: Linus Torvalds

    Linus Torvalds
     
  • The selinux AVC paths remain some of the hottest (and deepest) codepaths
    at filename lookup time, and we make it worse by having the slow path
    cases take up I$ and stack space even when they don't trigger. Gcc
    tends to always want to inline functions that are just called once -
    never mind that this might make for slower and worse code in the caller.

    So this tries to improve on it a bit by making the slow-path cases
    explicitly separate functions that are marked noinline, causing gcc to
    at least no longer allocate stack space for them unless they are
    actually called. It also seems to help register allocation a tiny bit,
    since gcc now doesn't take the slow case code into account.

    Uninlining the slow path may also allow us to inline the remaining hot
    path into the one caller that actually matters: avc_has_perm_flags().
    I'll have to look at that separately, but both avc_audit() and
    avc_has_perm_noaudit() are now small and lean enough that inlining them
    may make sense.

    Signed-off-by: Linus Torvalds

    Linus Torvalds
     

23 Mar, 2012

1 commit

  • avc_audit() did a lot of jumping around and had a big stack frame, all
    for the uncommon case.

    Split up the uncommon case (which we really can't make go fast anyway)
    into its own slow function, and mark the conditional branches
    appropriately for the common likely case.

    This causes avc_audit() to no longer show up as one of the hottest
    functions on the branch profiles (the new "perf -b" thing), and makes
    the cycle profiles look really nice and dense too.

    The whole audit path is still annoyingly very much one of the biggest
    costs of name lookup, so these things are worth optimizing for. I wish
    we could just tell people to turn it off, but realistically we do need
    it: we just need to make sure that the overhead of the necessary evil is
    as low as possible.

    Signed-off-by: Linus Torvalds

    Linus Torvalds
     

20 Jul, 2011

1 commit


27 May, 2011

1 commit

  • Right now security_get_user_sids() will pass in a NULL avd pointer to
    avc_has_perm_noaudit(), which then forces that function to have a dummy
    entry for that case and just generally test it.

    Don't do it. The normal callers all pass a real avd pointer, and this
    helper function is incredibly hot. So don't make avc_has_perm_noaudit()
    do conditional stuff that isn't needed for the common case.

    This also avoids some duplicated stack space.

    Signed-off-by: Linus Torvalds

    Linus Torvalds
     

24 May, 2011

1 commit


20 May, 2011

2 commits

  • There is no point in counting hits - we can calculate it from the number
    of lookups and misses.

    This makes the avc statistics a bit smaller, and makes the code
    generation better too.

    Signed-off-by: Linus Torvalds

    Linus Torvalds
     
  • You can turn off the avc cache stats, but distributions seem to not do
    that (perhaps because several performance tuning how-to's talk about the
    avc cache statistics).

    Which is sad, because the code it generates is truly horrendous, with
    the statistics update being sandwitched between get_cpu/put_cpu which in
    turn causes preemption disables etc. We're talking ten+ instructions
    just to increment a per-cpu variable in some pretty hot code.

    Fix the craziness by just using 'this_cpu_inc()' instead. Suddenly we
    only need a single 'inc' instruction to increment the statistics. This
    is quite noticeable in the incredibly hot avc_has_perm_noaudit()
    function (which triggers all the statistics by virtue of doing an
    avc_lookup() call).

    Signed-off-by: Linus Torvalds

    Linus Torvalds
     

26 Apr, 2011

3 commits

  • Now that the security modules can decide whether they support the
    dcache RCU walk or not it's possible to make selinux a bit more
    RCU friendly. The SELinux AVC and security server access decision
    code is RCU safe. A specific piece of the LSM audit code may not
    be RCU safe.

    This patch makes the VFS RCU walk retry if it would hit the non RCU
    safe chunk of code. It will normally just work under RCU. This is
    done simply by passing the VFS RCU state as a flag down into the
    avc_audit() code and returning ECHILD there if it would have an issue.

    Based-on-patch-by: Andi Kleen
    Signed-off-by: Eric Paris
    Signed-off-by: Linus Torvalds

    Eric Paris
     
  • The lsm common audit code has wacky contortions making sure which pieces
    of information are set based on if it was given a path, dentry, or
    inode. Split this into path and inode to get rid of some of the code
    complexity.

    Signed-off-by: Eric Paris
    Acked-by: Casey Schaufler

    Eric Paris
     
  • Now that the security modules can decide whether they support the
    dcache RCU walk or not it's possible to make selinux a bit more
    RCU friendly. The SELinux AVC and security server access decision
    code is RCU safe. A specific piece of the LSM audit code may not
    be RCU safe.

    This patch makes the VFS RCU walk retry if it would hit the non RCU
    safe chunk of code. It will normally just work under RCU. This is
    done simply by passing the VFS RCU state as a flag down into the
    avc_audit() code and returning ECHILD there if it would have an issue.

    Based-on-patch-by: Andi Kleen
    Signed-off-by: Eric Paris

    Eric Paris
     

02 Aug, 2010

2 commits

  • Currently there are a number of applications (nautilus being the main one) which
    calls access() on files in order to determine how they should be displayed. It
    is normal and expected that nautilus will want to see if files are executable
    or if they are really read/write-able. access() should return the real
    permission. SELinux policy checks are done in access() and can result in lots
    of AVC denials as policy denies RWX on files which DAC allows. Currently
    SELinux must dontaudit actual attempts to read/write/execute a file in
    order to silence these messages (and not flood the logs.) But dontaudit rules
    like that can hide real attacks. This patch addes a new common file
    permission audit_access. This permission is special in that it is meaningless
    and should never show up in an allow rule. Instead the only place this
    permission has meaning is in a dontaudit rule like so:

    dontaudit nautilus_t sbin_t:file audit_access

    With such a rule if nautilus just checks access() we will still get denied and
    thus userspace will still get the correct answer but we will not log the denial.
    If nautilus attempted to actually perform one of the forbidden actions
    (rather than just querying access(2) about it) we would still log a denial.
    This type of dontaudit rule should be used sparingly, as it could be a
    method for an attacker to probe the system permissions without detection.

    Signed-off-by: Eric Paris
    Acked-by: Stephen D. Smalley
    Signed-off-by: James Morris

    Eric Paris
     
  • Remove all rcu head inits. We don't care about the RCU head state before passing
    it to call_rcu() anyway. Only leave the "on_stack" variants so debugobjects can
    keep track of objects on stack.

    Signed-off-by: Mathieu Desnoyers
    Signed-off-by: Paul E. McKenney
    Cc: Stephen Smalley
    Reviewed-by: James Morris
    Cc: Eric Paris
    Signed-off-by: James Morris

    Paul E. McKenney
     

28 Apr, 2010

1 commit


08 Mar, 2010

1 commit


05 Feb, 2010

1 commit


03 Feb, 2010

1 commit

  • Only audit the permissions specified by the policy rules.

    Before:
    type=AVC msg=audit(01/28/2010 14:30:46.690:3250) : avc: denied { read
    append } for pid=14092 comm=foo name=test_file dev=dm-1 ino=132932
    scontext=unconfined_u:unconfined_r:load_policy_t:s0-s0:c0.c1023
    tcontext=unconfined_u:object_r:rpm_tmp_t:s0 tclass=file

    After:
    type=AVC msg=audit(01/28/2010 14:52:37.448:26) : avc: denied
    { append } for pid=1917 comm=foo name=test_file dev=dm-1 ino=132932
    scontext=unconfined_u:unconfined_r:load_policy_t:s0-s0:c0.c1023
    tcontext=unconfined_u:object_r:rpm_tmp_t:s0 tclass=file

    Reference:
    https://bugzilla.redhat.com/show_bug.cgi?id=558499

    Reported-by: Tom London
    Signed-off-by: Stephen D. Smalley
    Signed-off-by: James Morris

    Stephen Smalley
     

18 Jan, 2010

1 commit

  • If allow_unknown==deny, SELinux treats an undefined kernel security
    class as an error condition rather than as a typical permission denial
    and thus does not allow permissions on undefined classes even when in
    permissive mode. Change the SELinux logic so that this case is handled
    as a typical permission denial, subject to the usual permissive mode and
    permissive domain handling.

    Also drop the 'requested' argument from security_compute_av() and
    helpers as it is a legacy of the original security server interface and
    is unused.

    Changes:
    - Handle permissive domains consistently by moving up the test for a
    permissive domain.
    - Make security_compute_av_user() consistent with security_compute_av();
    the only difference now is that security_compute_av() performs mapping
    between the kernel-private class and permission indices and the policy
    values. In the userspace case, this mapping is handled by libselinux.
    - Moved avd_init inside the policy lock.

    Based in part on a patch by Paul Moore .

    Reported-by: Andrew Worsley
    Signed-off-by: Stephen D. Smalley
    Reviewed-by: Paul Moore
    Signed-off-by: James Morris

    Stephen Smalley
     

24 Nov, 2009

1 commit

  • Historically we've seen cases where permissions are requested for classes
    where they do not exist. In particular we have seen CIFS forget to set
    i_mode to indicate it is a directory so when we later check something like
    remove_name we have problems since it wasn't defined in tclass file. This
    used to result in a avc which included the permission 0x2000 or something.
    Currently the kernel will deny the operations (good thing) but will not
    print ANY information (bad thing). First the auditdeny field is no
    extended to include unknown permissions. After that is fixed the logic in
    avc_dump_query to output this information isn't right since it will remove
    the permission from the av and print the phrase "". This takes us
    back to the behavior before the classmap rewrite.

    Signed-off-by: Eric Paris
    Signed-off-by: James Morris

    Eric Paris