10 Sep, 2010

2 commits

  • Fix a bug in keyctl_session_to_parent() whereby it tries to check the ownership
    of the parent process's session keyring whether or not the parent has a session
    keyring [CVE-2010-2960].

    This results in the following oops:

    BUG: unable to handle kernel NULL pointer dereference at 00000000000000a0
    IP: [] keyctl_session_to_parent+0x251/0x443
    ...
    Call Trace:
    [] ? keyctl_session_to_parent+0x67/0x443
    [] ? __do_fault+0x24b/0x3d0
    [] sys_keyctl+0xb4/0xb8
    [] system_call_fastpath+0x16/0x1b

    if the parent process has no session keyring.

    If the system is using pam_keyinit then it mostly protected against this as all
    processes derived from a login will have inherited the session keyring created
    by pam_keyinit during the log in procedure.

    To test this, pam_keyinit calls need to be commented out in /etc/pam.d/.

    Reported-by: Tavis Ormandy
    Signed-off-by: David Howells
    Acked-by: Tavis Ormandy
    Signed-off-by: Linus Torvalds

    David Howells
     
  • There's an protected access to the parent process's credentials in the middle
    of keyctl_session_to_parent(). This results in the following RCU warning:

    ===================================================
    [ INFO: suspicious rcu_dereference_check() usage. ]
    ---------------------------------------------------
    security/keys/keyctl.c:1291 invoked rcu_dereference_check() without protection!

    other info that might help us debug this:

    rcu_scheduler_active = 1, debug_locks = 0
    1 lock held by keyctl-session-/2137:
    #0: (tasklist_lock){.+.+..}, at: [] keyctl_session_to_parent+0x60/0x236

    stack backtrace:
    Pid: 2137, comm: keyctl-session- Not tainted 2.6.36-rc2-cachefs+ #1
    Call Trace:
    [] lockdep_rcu_dereference+0xaa/0xb3
    [] keyctl_session_to_parent+0xed/0x236
    [] sys_keyctl+0xb4/0xb6
    [] system_call_fastpath+0x16/0x1b

    The code should take the RCU read lock to make sure the parents credentials
    don't go away, even though it's holding a spinlock and has IRQ disabled.

    Signed-off-by: David Howells
    Signed-off-by: Linus Torvalds

    David Howells
     

13 Aug, 2010

1 commit


07 Aug, 2010

1 commit


02 Aug, 2010

4 commits

  • In commit bb952bb98a7e479262c7eb25d5592545a3af147d there was the accidental
    deletion of a statement from call_sbin_request_key() to render the process
    keyring ID to a text string so that it can be passed to /sbin/request-key.

    With gcc 4.6.0 this causes the following warning:

    CC security/keys/request_key.o
    security/keys/request_key.c: In function 'call_sbin_request_key':
    security/keys/request_key.c:102:15: warning: variable 'prkey' set but not used

    This patch reinstates that statement.

    Without this statement, /sbin/request-key will get some random rubbish from the
    stack as that parameter.

    Signed-off-by: Justin P. Mattock
    Signed-off-by: David Howells
    Signed-off-by: James Morris

    Justin P. Mattock
     
  • keyctl_describe_key() turns the key reference it gets into a usable key pointer
    and assigns that to a variable called 'key', which it then ignores in favour of
    recomputing the key pointer each time it needs it. Make it use the precomputed
    pointer instead.

    Without this patch, gcc 4.6 reports that the variable key is set but not used:

    building with gcc 4.6 I'm getting a warning message:
    CC security/keys/keyctl.o
    security/keys/keyctl.c: In function 'keyctl_describe_key':
    security/keys/keyctl.c:472:14: warning: variable 'key' set but not used

    Reported-by: Justin P. Mattock
    Signed-off-by: David Howells
    Signed-off-by: James Morris

    David Howells
     
  • Make /proc/keys check to see if the calling process possesses each key before
    performing the security check. The possession check can be skipped if the key
    doesn't have the possessor-view permission bit set.

    This causes the keys a process possesses to show up in /proc/keys, even if they
    don't have matching user/group/other view permissions.

    Signed-off-by: David Howells
    Signed-off-by: James Morris

    David Howells
     
  • Authorise a process to perform keyctl_set_timeout() on an uninstantiated key if
    that process has the authorisation key for it.

    This allows the instantiator to set the timeout on a key it is instantiating -
    provided it does it before instantiating the key.

    For instance, the test upcall script provided with the keyutils package could
    be modified to set the expiry to an hour hence before instantiating the key:

    [/usr/share/keyutils/request-key-debug.sh]
    if [ "$3" != "neg" ]
    then
    + keyctl timeout $1 3600
    keyctl instantiate $1 "Debug $3" $4 || exit 1
    else

    Signed-off-by: David Howells
    Signed-off-by: James Morris

    David Howells
     

27 Jun, 2010

1 commit

  • This is from a Smatch check I'm writing.

    strncpy_from_user() returns -EFAULT on error so the first change just
    silences a warning but doesn't change how the code works.

    The other change is a bug fix because install_thread_keyring_to_cred()
    can return a variety of errors such as -EINVAL, -EEXIST, -ENOMEM or
    -EKEYREVOKED.

    Signed-off-by: Dan Carpenter
    Signed-off-by: David Howells
    Signed-off-by: Linus Torvalds

    Dan Carpenter
     

28 May, 2010

2 commits

  • No functional changes.

    keyctl_session_to_parent() is the only user of signal->count which needs
    the correct value. Change it to use thread_group_empty() instead, this
    must be strictly equivalent under tasklist, and imho looks better.

    Signed-off-by: Oleg Nesterov
    Acked-by: David Howells
    Cc: Peter Zijlstra
    Acked-by: Roland McGrath
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Oleg Nesterov
     
  • call_usermodehelper_keys() uses call_usermodehelper_setkeys() to change
    subprocess_info->cred in advance. Now that we have info->init() we can
    change this code to set tgcred->session_keyring in context of execing
    kernel thread.

    Note: since currently call_usermodehelper_keys() is never called with
    UMH_NO_WAIT, call_usermodehelper_keys()->key_get() and umh_keys_cleanup()
    are not really needed, we could rely on install_session_keyring_to_cred()
    which does key_get() on success.

    Signed-off-by: Oleg Nesterov
    Acked-by: Neil Horman
    Acked-by: David Howells
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Oleg Nesterov
     

25 May, 2010

1 commit


18 May, 2010

1 commit


06 May, 2010

5 commits


05 May, 2010

5 commits

  • call_sbin_request_key() creates a keyring and then attempts to insert a link to
    the authorisation key into that keyring, but does so without holding a write
    lock on the keyring semaphore.

    It will normally get away with this because it hasn't told anyone that the
    keyring exists yet. The new keyring, however, has had its serial number
    published, which means it can be accessed directly by that handle.

    This was found by a previous patch that adds RCU lockdep checks to the code
    that reads the keyring payload pointer, which includes a check that the keyring
    semaphore is actually locked.

    Without this patch, the following command:

    keyctl request2 user b a @s

    will provoke the following lockdep warning is displayed in dmesg:

    ===================================================
    [ INFO: suspicious rcu_dereference_check() usage. ]
    ---------------------------------------------------
    security/keys/keyring.c:727 invoked rcu_dereference_check() without protection!

    other info that might help us debug this:

    rcu_scheduler_active = 1, debug_locks = 0
    2 locks held by keyctl/2076:
    #0: (key_types_sem){.+.+.+}, at: [] key_type_lookup+0x1c/0x71
    #1: (keyring_serialise_link_sem){+.+.+.}, at: [] __key_link+0x4d/0x3c5

    stack backtrace:
    Pid: 2076, comm: keyctl Not tainted 2.6.34-rc6-cachefs #54
    Call Trace:
    [] lockdep_rcu_dereference+0xaa/0xb2
    [] ? __key_link+0x4d/0x3c5
    [] __key_link+0x19e/0x3c5
    [] ? __key_instantiate_and_link+0xb1/0xdc
    [] ? key_instantiate_and_link+0x42/0x5f
    [] call_sbin_request_key+0xe7/0x33b
    [] ? mutex_unlock+0x9/0xb
    [] ? __key_instantiate_and_link+0xb1/0xdc
    [] ? key_instantiate_and_link+0x42/0x5f
    [] ? request_key_auth_new+0x1c2/0x23c
    [] ? cache_alloc_debugcheck_after+0x108/0x173
    [] ? request_key_and_link+0x146/0x300
    [] ? kmem_cache_alloc+0xe1/0x118
    [] request_key_and_link+0x28b/0x300
    [] sys_request_key+0xf7/0x14a
    [] ? trace_hardirqs_on_caller+0x10c/0x130
    [] ? trace_hardirqs_on_thunk+0x3a/0x3f
    [] system_call_fastpath+0x16/0x1b

    Signed-off-by: David Howells
    Signed-off-by: James Morris

    David Howells
     
  • The keyring key type code should use RCU dereference wrappers, even when it
    holds the keyring's key semaphore.

    Reported-by: Vegard Nossum
    Signed-off-by: David Howells
    Acked-by: Serge Hallyn
    Signed-off-by: James Morris

    David Howells
     
  • find_keyring_by_name() can gain access to a keyring that has had its reference
    count reduced to zero, and is thus ready to be freed. This then allows the
    dead keyring to be brought back into use whilst it is being destroyed.

    The following timeline illustrates the process:

    |(cleaner) (user)
    |
    | free_user(user) sys_keyctl()
    | | |
    | key_put(user->session_keyring) keyctl_get_keyring_ID()
    | || //=> keyring->usage = 0 |
    | |schedule_work(&key_cleanup_task) lookup_user_key()
    | || |
    | kmem_cache_free(,user) |
    | . |[KEY_SPEC_USER_KEYRING]
    | . install_user_keyrings()
    | . ||
    | key_cleanup() [serial_node,) } ||
    | | ||
    | [spin_unlock(&key_serial_lock)] |find_keyring_by_name()
    | | |||
    | keyring_destroy(keyring) ||[read_lock(&keyring_name_lock)]
    | || |||
    | |[write_lock(&keyring_name_lock)] ||atomic_inc(&keyring->usage)
    | |. ||| *** GET freeing keyring ***
    | |. ||[read_unlock(&keyring_name_lock)]
    | || ||
    | |list_del() |[mutex_unlock(&key_user_k..mutex)]
    | || |
    | |[write_unlock(&keyring_name_lock)] ** INVALID keyring is returned **
    | | .
    | kmem_cache_free(,keyring) .
    | .
    | atomic_dec(&keyring->usage)
    v *** DESTROYED ***
    TIME

    If CONFIG_SLUB_DEBUG=y then we may see the following message generated:

    =============================================================================
    BUG key_jar: Poison overwritten
    -----------------------------------------------------------------------------

    INFO: 0xffff880197a7e200-0xffff880197a7e200. First byte 0x6a instead of 0x6b
    INFO: Allocated in key_alloc+0x10b/0x35f age=25 cpu=1 pid=5086
    INFO: Freed in key_cleanup+0xd0/0xd5 age=12 cpu=1 pid=10
    INFO: Slab 0xffffea000592cb90 objects=16 used=2 fp=0xffff880197a7e200 flags=0x200000000000c3
    INFO: Object 0xffff880197a7e200 @offset=512 fp=0xffff880197a7e300

    Bytes b4 0xffff880197a7e1f0: 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a ZZZZZZZZZZZZZZZZ
    Object 0xffff880197a7e200: 6a 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b jkkkkkkkkkkkkkkk

    Alternatively, we may see a system panic happen, such as:

    BUG: unable to handle kernel NULL pointer dereference at 0000000000000001
    IP: [] kmem_cache_alloc+0x5b/0xe9
    PGD 6b2b4067 PUD 6a80d067 PMD 0
    Oops: 0000 [#1] SMP
    last sysfs file: /sys/kernel/kexec_crash_loaded
    CPU 1
    ...
    Pid: 31245, comm: su Not tainted 2.6.34-rc5-nofixed-nodebug #2 D2089/PRIMERGY
    RIP: 0010:[] [] kmem_cache_alloc+0x5b/0xe9
    RSP: 0018:ffff88006af3bd98 EFLAGS: 00010002
    RAX: 0000000000000000 RBX: 0000000000000001 RCX: ffff88007d19900b
    RDX: 0000000100000000 RSI: 00000000000080d0 RDI: ffffffff81828430
    RBP: ffffffff81828430 R08: ffff88000a293750 R09: 0000000000000000
    R10: 0000000000000001 R11: 0000000000100000 R12: 00000000000080d0
    R13: 00000000000080d0 R14: 0000000000000296 R15: ffffffff810f20ce
    FS: 00007f97116bc700(0000) GS:ffff88000a280000(0000) knlGS:0000000000000000
    CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    CR2: 0000000000000001 CR3: 000000006a91c000 CR4: 00000000000006e0
    DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
    Process su (pid: 31245, threadinfo ffff88006af3a000, task ffff8800374414c0)
    Stack:
    0000000512e0958e 0000000000008000 ffff880037f8d180 0000000000000001
    0000000000000000 0000000000008001 ffff88007d199000 ffffffff810f20ce
    0000000000008000 ffff88006af3be48 0000000000000024 ffffffff810face3
    Call Trace:
    [] ? get_empty_filp+0x70/0x12f
    [] ? do_filp_open+0x145/0x590
    [] ? tlb_finish_mmu+0x2a/0x33
    [] ? unmap_region+0xd3/0xe2
    [] ? virt_to_head_page+0x9/0x2d
    [] ? alloc_fd+0x69/0x10e
    [] ? do_sys_open+0x56/0xfc
    [] ? system_call_fastpath+0x16/0x1b
    Code: 0f 1f 44 00 00 49 89 c6 fa 66 0f 1f 44 00 00 65 4c 8b 04 25 60 e8 00 00 48 8b 45 00 49 01 c0 49 8b 18 48 85 db 74 0d 48 63 45 18 8b 04 03 49 89 00 eb 14 4c 89 f9 83 ca ff 44 89 e6 48 89 ef
    RIP [] kmem_cache_alloc+0x5b/0xe9

    This problem is that find_keyring_by_name does not confirm that the keyring is
    valid before accepting it.

    Skipping keyrings that have been reduced to a zero count seems the way to go.
    To this end, use atomic_inc_not_zero() to increment the usage count and skip
    the candidate keyring if that returns false.

    The following script _may_ cause the bug to happen, but there's no guarantee
    as the window of opportunity is small:

    #!/bin/sh
    LOOP=100000
    USER=dummy_user
    /bin/su -c "exit;" $USER || { /usr/sbin/adduser -m $USER; add=1; }
    for ((i=0; i&/dev/null

    as that uses a keyring named "foo" rather than relying on the user and
    user-session named keyrings.

    Reported-by: Toshiyuki Okajima
    Signed-off-by: David Howells
    Tested-by: Toshiyuki Okajima
    Acked-by: Serge Hallyn
    Signed-off-by: James Morris

    Toshiyuki Okajima
     
  • key_gc_keyring() needs to either hold the RCU read lock or hold the keyring
    semaphore if it's going to scan the keyring's list. Given that it only needs
    to read the key list, and it's doing so under a spinlock, the RCU read lock is
    the thing to use.

    Furthermore, the RCU check added in e7b0a61b7929632d36cf052d9e2820ef0a9c1bfe is
    incorrect as holding the spinlock on key_serial_lock is not grounds for
    assuming a keyring's pointer list can be read safely. Instead, a simple
    rcu_dereference() inside of the previously mentioned RCU read lock is what we
    want.

    Reported-by: Serge E. Hallyn
    Signed-off-by: David Howells
    Acked-by: Serge Hallyn
    Acked-by: "Paul E. McKenney"
    Signed-off-by: James Morris

    David Howells
     
  • Fix an RCU warning in the reading of user keys:

    ===================================================
    [ INFO: suspicious rcu_dereference_check() usage. ]
    ---------------------------------------------------
    security/keys/user_defined.c:202 invoked rcu_dereference_check() without protection!

    other info that might help us debug this:

    rcu_scheduler_active = 1, debug_locks = 0
    1 lock held by keyctl/3637:
    #0: (&key->sem){+++++.}, at: [] keyctl_read_key+0x9c/0xcf

    stack backtrace:
    Pid: 3637, comm: keyctl Not tainted 2.6.34-rc5-cachefs #18
    Call Trace:
    [] lockdep_rcu_dereference+0xaa/0xb2
    [] user_read+0x47/0x91
    [] keyctl_read_key+0xac/0xcf
    [] sys_keyctl+0x75/0xb7
    [] system_call_fastpath+0x16/0x1b

    Signed-off-by: David Howells
    Acked-by: Serge Hallyn
    Signed-off-by: James Morris

    David Howells
     

28 Apr, 2010

3 commits

  • …s/security-testing-2.6

    * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/security-testing-2.6:
    keys: don't need to use RCU in keyring_read() as semaphore is held

    Linus Torvalds
     
  • The request_key() system call and request_key_and_link() should make a
    link from an existing key to the destination keyring (if supplied), not
    just from a new key to the destination keyring.

    This can be tested by:

    ring=`keyctl newring fred @s`
    keyctl request2 user debug:a a
    keyctl request user debug:a $ring
    keyctl list $ring

    If it says:

    keyring is empty

    then it didn't work. If it shows something like:

    1 key in keyring:
    1070462727: --alswrv 0 0 user: debug:a

    then it did.

    request_key() system call is meant to recursively search all your keyrings for
    the key you desire, and, optionally, if it doesn't exist, call out to userspace
    to create one for you.

    If request_key() finds or creates a key, it should, optionally, create a link
    to that key from the destination keyring specified.

    Therefore, if, after a successful call to request_key() with a desination
    keyring specified, you see the destination keyring empty, the code didn't work
    correctly.

    If you see the found key in the keyring, then it did - which is what the patch
    is required for.

    Signed-off-by: David Howells
    Cc: James Morris
    Cc:
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    David Howells
     
  • keyring_read() doesn't need to use rcu_dereference() to access the keyring
    payload as the caller holds the key semaphore to prevent modifications
    from happening whilst the data is read out.

    This should solve the following warning:

    ===================================================
    [ INFO: suspicious rcu_dereference_check() usage. ]
    ---------------------------------------------------
    security/keys/keyring.c:204 invoked rcu_dereference_check() without protection!

    other info that might help us debug this:

    rcu_scheduler_active = 1, debug_locks = 0
    1 lock held by keyctl/2144:
    #0: (&key->sem){+++++.}, at: [] keyctl_read_key+0x9c/0xcf

    stack backtrace:
    Pid: 2144, comm: keyctl Not tainted 2.6.34-rc2-cachefs #113
    Call Trace:
    [] lockdep_rcu_dereference+0xaa/0xb2
    [] keyring_read+0x4d/0xe7
    [] keyctl_read_key+0xac/0xcf
    [] sys_keyctl+0x75/0xb9
    [] system_call_fastpath+0x16/0x1b

    Signed-off-by: David Howells
    Cc: Herbert Xu
    Signed-off-by: Andrew Morton
    Signed-off-by: James Morris

    David Howells
     

25 Apr, 2010

1 commit

  • Fix the following RCU warning:

    ===================================================
    [ INFO: suspicious rcu_dereference_check() usage. ]
    ---------------------------------------------------
    security/keys/request_key.c:116 invoked rcu_dereference_check() without protection!

    This was caused by doing:

    [root@andromeda ~]# keyctl newring fred @s
    539196288
    [root@andromeda ~]# keyctl request2 user a a 539196288
    request_key: Required key not available

    Signed-off-by: David Howells
    Acked-by: Eric Dumazet
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    David Howells
     

23 Apr, 2010

1 commit


12 Apr, 2010

1 commit


30 Mar, 2010

1 commit

  • …it slab.h inclusion from percpu.h

    percpu.h is included by sched.h and module.h and thus ends up being
    included when building most .c files. percpu.h includes slab.h which
    in turn includes gfp.h making everything defined by the two files
    universally available and complicating inclusion dependencies.

    percpu.h -> slab.h dependency is about to be removed. Prepare for
    this change by updating users of gfp and slab facilities include those
    headers directly instead of assuming availability. As this conversion
    needs to touch large number of source files, the following script is
    used as the basis of conversion.

    http://userweb.kernel.org/~tj/misc/slabh-sweep.py

    The script does the followings.

    * Scan files for gfp and slab usages and update includes such that
    only the necessary includes are there. ie. if only gfp is used,
    gfp.h, if slab is used, slab.h.

    * When the script inserts a new include, it looks at the include
    blocks and try to put the new include such that its order conforms
    to its surrounding. It's put in the include block which contains
    core kernel includes, in the same order that the rest are ordered -
    alphabetical, Christmas tree, rev-Xmas-tree or at the end if there
    doesn't seem to be any matching order.

    * If the script can't find a place to put a new include (mostly
    because the file doesn't have fitting include block), it prints out
    an error message indicating which .h file needs to be added to the
    file.

    The conversion was done in the following steps.

    1. The initial automatic conversion of all .c files updated slightly
    over 4000 files, deleting around 700 includes and adding ~480 gfp.h
    and ~3000 slab.h inclusions. The script emitted errors for ~400
    files.

    2. Each error was manually checked. Some didn't need the inclusion,
    some needed manual addition while adding it to implementation .h or
    embedding .c file was more appropriate for others. This step added
    inclusions to around 150 files.

    3. The script was run again and the output was compared to the edits
    from #2 to make sure no file was left behind.

    4. Several build tests were done and a couple of problems were fixed.
    e.g. lib/decompress_*.c used malloc/free() wrappers around slab
    APIs requiring slab.h to be added manually.

    5. The script was run on all .h files but without automatically
    editing them as sprinkling gfp.h and slab.h inclusions around .h
    files could easily lead to inclusion dependency hell. Most gfp.h
    inclusion directives were ignored as stuff from gfp.h was usually
    wildly available and often used in preprocessor macros. Each
    slab.h inclusion directive was examined and added manually as
    necessary.

    6. percpu.h was updated not to include slab.h.

    7. Build test were done on the following configurations and failures
    were fixed. CONFIG_GCOV_KERNEL was turned off for all tests (as my
    distributed build env didn't work with gcov compiles) and a few
    more options had to be turned off depending on archs to make things
    build (like ipr on powerpc/64 which failed due to missing writeq).

    * x86 and x86_64 UP and SMP allmodconfig and a custom test config.
    * powerpc and powerpc64 SMP allmodconfig
    * sparc and sparc64 SMP allmodconfig
    * ia64 SMP allmodconfig
    * s390 SMP allmodconfig
    * alpha SMP allmodconfig
    * um on x86_64 SMP allmodconfig

    8. percpu.h modifications were reverted so that it could be applied as
    a separate patch and serve as bisection point.

    Given the fact that I had only a couple of failures from tests on step
    6, I'm fairly confident about the coverage of this conversion patch.
    If there is a breakage, it's likely to be something in one of the arch
    headers which should be easily discoverable easily on most builds of
    the specific arch.

    Signed-off-by: Tejun Heo <tj@kernel.org>
    Guess-its-ok-by: Christoph Lameter <cl@linux-foundation.org>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Lee Schermerhorn <Lee.Schermerhorn@hp.com>

    Tejun Heo
     

10 Mar, 2010

1 commit


05 Mar, 2010

1 commit


25 Feb, 2010

1 commit

  • Apply lockdep-ified RCU primitives to key_gc_keyring() and
    keyring_destroy().

    Cc: David Howells
    Signed-off-by: Paul E. McKenney
    Cc: laijs@cn.fujitsu.com
    Cc: dipankar@in.ibm.com
    Cc: mathieu.desnoyers@polymtl.ca
    Cc: josh@joshtriplett.org
    Cc: dvhltc@us.ibm.com
    Cc: niv@us.ibm.com
    Cc: peterz@infradead.org
    Cc: rostedt@goodmis.org
    Cc: Valdis.Kletnieks@vt.edu
    Cc: dhowells@redhat.com
    LKML-Reference:
    Signed-off-by: Ingo Molnar

    Paul E. McKenney
     

17 Dec, 2009

2 commits

  • As of commit ee18d64c1f632043a02e6f5ba5e045bb26a5465f ("KEYS: Add a keyctl to
    install a process's session keyring on its parent [try #6]"), CONFIG_KEYS=y
    fails to build on architectures that haven't implemented TIF_NOTIFY_RESUME yet:

    security/keys/keyctl.c: In function 'keyctl_session_to_parent':
    security/keys/keyctl.c:1312: error: 'TIF_NOTIFY_RESUME' undeclared (first use in this function)
    security/keys/keyctl.c:1312: error: (Each undeclared identifier is reported only once
    security/keys/keyctl.c:1312: error: for each function it appears in.)

    Make KEYCTL_SESSION_TO_PARENT depend on TIF_NOTIFY_RESUME until
    m68k, and xtensa have implemented it.

    Signed-off-by: Geert Uytterhoeven
    Signed-off-by: James Morris
    Acked-by: Mike Frysinger

    Geert Uytterhoeven
     
  • Return the PTR_ERR of the correct pointer.

    Signed-off-by: Roel Kluin
    Signed-off-by: Andrew Morton
    Acked-by: David Howells
    Signed-off-by: James Morris

    Roel Kluin
     

19 Nov, 2009

1 commit


12 Nov, 2009

1 commit


16 Oct, 2009

1 commit

  • The destination keyring specified to request_key() and co. is made available to
    the process that instantiates the key (the slave process started by
    /sbin/request-key typically). This is passed in the request_key_auth struct as
    the dest_keyring member.

    keyctl_instantiate_key and keyctl_negate_key() call get_instantiation_keyring()
    to get the keyring to attach the newly constructed key to at the end of
    instantiation. This may be given a specific keyring into which a link will be
    made later, or it may be asked to find the keyring passed to request_key(). In
    the former case, it returns a keyring with the refcount incremented by
    lookup_user_key(); in the latter case, it returns the keyring from the
    request_key_auth struct - and does _not_ increment the refcount.

    The latter case will eventually result in an oops when the keyring prematurely
    runs out of references and gets destroyed. The effect may take some time to
    show up as the key is destroyed lazily.

    To fix this, the keyring returned by get_instantiation_keyring() must always
    have its refcount incremented, no matter where it comes from.

    This can be tested by setting /etc/request-key.conf to:

    #OP TYPE DESCRIPTION CALLOUT INFO PROGRAM ARG1 ARG2 ARG3 ...
    #====== ======= =============== =============== ===============================
    create * test:* * |/bin/false %u %g %d %{user:_display}
    negate * * * /bin/keyctl negate %k 10 @u

    and then doing:

    keyctl add user _display aaaaaaaa @u
    while keyctl request2 user test:x test:x @u &&
    keyctl list @u;
    do
    keyctl request2 user test:x test:x @u;
    sleep 31;
    keyctl list @u;
    done

    which will oops eventually. Changing the negate line to have @u rather than
    %S at the end is important as that forces the latter case by passing a special
    keyring ID rather than an actual keyring ID.

    Reported-by: Alexander Zangerl
    Signed-off-by: David Howells
    Tested-by: Alexander Zangerl
    Signed-off-by: Linus Torvalds

    David Howells
     

24 Sep, 2009

1 commit

  • The key garbage collector sets a timer to start a new collection cycle at the
    point the earliest key to expire should be considered garbage. However, it
    currently only does this if the key it is considering hasn't yet expired.

    If the key being considering has expired, but hasn't yet reached the collection
    time then it is ignored, and won't be collected until some other key provokes a
    round of collection.

    Make the garbage collector set the timer for the earliest key that hasn't yet
    passed its collection time, rather than the earliest key that hasn't yet
    expired.

    Signed-off-by: David Howells
    Signed-off-by: James Morris

    David Howells
     

15 Sep, 2009

1 commit

  • Fix a number of problems with the new key garbage collector:

    (1) A rogue semicolon in keyring_gc() was causing the initial count of dead
    keys to be miscalculated.

    (2) A missing return in keyring_gc() meant that under certain circumstances,
    the keyring semaphore would be unlocked twice.

    (3) The key serial tree iterator (key_garbage_collector()) part of the garbage
    collector has been modified to:

    (a) Complete each scan of the keyrings before setting the new timer.

    (b) Only set the new timer for keys that have yet to expire. This means
    that the new timer is now calculated correctly, and the gc doesn't
    get into a loop continually scanning for keys that have expired, and
    preventing other things from happening, like RCU cleaning up the old
    keyring contents.

    (c) Perform an extra scan if any keys were garbage collected in this one
    as a key might become garbage during a scan, and (b) could mean we
    don't set the timer again.

    (4) Made key_schedule_gc() take the time at which to do a collection run,
    rather than the time at which the key expires. This means the collection
    of dead keys (key type unregistered) can happen immediately.

    Signed-off-by: David Howells
    Signed-off-by: James Morris

    David Howells