lkml.org 
[lkml]   [2013]   [May]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[091/126] Add file_ns_capable() helper function for open-time capability checking
    3.6.11.3 stable review patch.
    If anyone has any objections, please let me know.

    ------------------

    From: Linus Torvalds <torvalds@linux-foundation.org>

    [ Upstream commit 935d8aabd4331f47a89c3e1daa5779d23cf244ee ]

    Nothing is using it yet, but this will allow us to delay the open-time
    checks to use time, without breaking the normal UNIX permission
    semantics where permissions are determined by the opener (and the file
    descriptor can then be passed to a different process, or the process can
    drop capabilities).

    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
    ---
    include/linux/capability.h | 2 ++
    kernel/capability.c | 24 ++++++++++++++++++++++++
    2 files changed, 26 insertions(+)

    diff --git a/include/linux/capability.h b/include/linux/capability.h
    index d10b7ed..19e11d4 100644
    --- a/include/linux/capability.h
    +++ b/include/linux/capability.h
    @@ -377,6 +377,7 @@ struct cpu_vfs_cap_data {

    #ifdef __KERNEL__

    +struct file;
    struct inode;
    struct dentry;
    struct user_namespace;
    @@ -553,6 +554,7 @@ extern bool capable(int cap);
    extern bool ns_capable(struct user_namespace *ns, int cap);
    extern bool nsown_capable(int cap);
    extern bool inode_capable(const struct inode *inode, int cap);
    +extern bool file_ns_capable(const struct file *file, struct user_namespace *ns, int cap);

    /* audit system wants to get cap info from files as well */
    extern int get_vfs_caps_from_disk(const struct dentry *dentry, struct cpu_vfs_cap_data *cpu_caps);
    diff --git a/kernel/capability.c b/kernel/capability.c
    index 493d972..f6c2ce5 100644
    --- a/kernel/capability.c
    +++ b/kernel/capability.c
    @@ -393,6 +393,30 @@ bool ns_capable(struct user_namespace *ns, int cap)
    EXPORT_SYMBOL(ns_capable);

    /**
    + * file_ns_capable - Determine if the file's opener had a capability in effect
    + * @file: The file we want to check
    + * @ns: The usernamespace we want the capability in
    + * @cap: The capability to be tested for
    + *
    + * Return true if task that opened the file had a capability in effect
    + * when the file was opened.
    + *
    + * This does not set PF_SUPERPRIV because the caller may not
    + * actually be privileged.
    + */
    +bool file_ns_capable(const struct file *file, struct user_namespace *ns, int cap)
    +{
    + if (WARN_ON_ONCE(!cap_valid(cap)))
    + return false;
    +
    + if (security_capable(file->f_cred, ns, cap) == 0)
    + return true;
    +
    + return false;
    +}
    +EXPORT_SYMBOL(file_ns_capable);
    +
    +/**
    * capable - Determine if the current task has a superior capability in effect
    * @cap: The capability to be tested for
    *
    --
    1.7.10.4



    \
     
     \ /
      Last update: 2013-05-07 08:05    [W:4.127 / U:0.076 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site