Skip to content
Snippets Groups Projects
  1. Jan 05, 2025
    • Thiébaud Weksteen's avatar
      selinux: match extended permissions to their base permissions · 5e7f0efd
      Thiébaud Weksteen authored
      
      In commit d1d991ef ("selinux: Add netlink xperm support") a new
      extended permission was added ("nlmsg"). This was the second extended
      permission implemented in selinux ("ioctl" being the first one).
      
      Extended permissions are associated with a base permission. It was found
      that, in the access vector cache (avc), the extended permission did not
      keep track of its base permission. This is an issue for a domain that is
      using both extended permissions (i.e., a domain calling ioctl() on a
      netlink socket). In this case, the extended permissions were
      overlapping.
      
      Keep track of the base permission in the cache. A new field "base_perm"
      is added to struct extended_perms_decision to make sure that the
      extended permission refers to the correct policy permission. A new field
      "base_perms" is added to struct extended_perms to quickly decide if
      extended permissions apply.
      
      While it is in theory possible to retrieve the base permission from the
      access vector, the same base permission may not be mapped to the same
      bit for each class (e.g., "nlmsg" is mapped to a different bit for
      "netlink_route_socket" and "netlink_audit_socket"). Instead, use a
      constant (AVC_EXT_IOCTL or AVC_EXT_NLMSG) provided by the caller.
      
      Fixes: d1d991ef ("selinux: Add netlink xperm support")
      Signed-off-by: default avatarThiébaud Weksteen <tweek@google.com>
      Signed-off-by: default avatarPaul Moore <paul@paul-moore.com>
      5e7f0efd
  2. Jan 03, 2025
  3. Dec 24, 2024
    • Breno Leitao's avatar
      ima: kexec: silence RCU list traversal warning · 68af44a7
      Breno Leitao authored
      
      The ima_measurements list is append-only and doesn't require
      rcu_read_lock() protection. However, lockdep issues a warning when
      traversing RCU lists without the read lock:
      
        security/integrity/ima/ima_kexec.c:40 RCU-list traversed in non-reader section!!
      
      Fix this by using the variant of list_for_each_entry_rcu() with the last
      argument set to true. This tells the RCU subsystem that traversing this
      append-only list without the read lock is intentional and safe.
      
      This change silences the lockdep warning while maintaining the correct
      semantics for the append-only list traversal.
      
      Signed-off-by: default avatarBreno Leitao <leitao@debian.org>
      Signed-off-by: default avatarMimi Zohar <zohar@linux.ibm.com>
      68af44a7
  4. Dec 22, 2024
  5. Dec 16, 2024
  6. Dec 11, 2024
    • Stefan Berger's avatar
      ima: Suspend PCR extends and log appends when rebooting · 254ef954
      Stefan Berger authored
      
      To avoid the following types of error messages due to a failure by the TPM
      driver to use the TPM, suspend TPM PCR extensions and the appending of
      entries to the IMA log once IMA's reboot notifier has been called. This
      avoids trying to use the TPM after the TPM subsystem has been shut down.
      
      [111707.685315][    T1] ima: Error Communicating to TPM chip, result: -19
      [111707.685960][    T1] ima: Error Communicating to TPM chip, result: -19
      
      Synchronization with the ima_extend_list_mutex to set
      ima_measurements_suspended ensures that the TPM subsystem is not shut down
      when IMA holds the mutex while appending to the log and extending the PCR.
      The alternative of reading the system_state variable would not provide this
      guarantee.
      
      This error could be observed on a ppc64 machine running SuSE Linux where
      processes are still accessing files after devices have been shut down.
      
      Suspending the IMA log and PCR extensions shortly before reboot does not
      seem to open a significant measurement gap since neither TPM quoting would
      work for attestation nor that new log entries could be written to anywhere
      after devices have been shut down. However, there's a time window between
      the invocation of the reboot notifier and the shutdown of devices. This
      includes all subsequently invoked reboot notifiers as well as
      kernel_restart_prepare() where __usermodehelper_disable() waits for all
      running_helpers to exit. During this time window IMA could now miss log
      entries even though attestation would still work. The reboot of the system
      shortly after may make this small gap insignificant.
      
      Signed-off-by: default avatarTushar Sugandhi <tusharsu@linux.microsoft.com>
      Signed-off-by: default avatarStefan Berger <stefanb@linux.ibm.com>
      Reviewed-by: default avatarJarkko Sakkinen <jarkko@kernel.org>
      Signed-off-by: default avatarMimi Zohar <zohar@linux.ibm.com>
      254ef954
  7. Dec 02, 2024
  8. Nov 30, 2024
    • Eric Dumazet's avatar
      selinux: use sk_to_full_sk() in selinux_ip_output() · eedcad2f
      Eric Dumazet authored
      
      In blamed commit, TCP started to attach timewait sockets to
      some skbs.
      
      syzbot reported that selinux_ip_output() was not expecting them yet.
      
      Note that using sk_to_full_sk() is still allowing the
      following sk_listener() check to work as before.
      
      BUG: KASAN: slab-out-of-bounds in selinux_sock security/selinux/include/objsec.h:207 [inline]
      BUG: KASAN: slab-out-of-bounds in selinux_ip_output+0x1e0/0x1f0 security/selinux/hooks.c:5761
      Read of size 8 at addr ffff88804e86e758 by task syz-executor347/5894
      
      CPU: 0 UID: 0 PID: 5894 Comm: syz-executor347 Not tainted 6.12.0-syzkaller-05480-gfcc79e1714e8 #0
      Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 10/30/2024
      Call Trace:
       <IRQ>
        __dump_stack lib/dump_stack.c:94 [inline]
        dump_stack_lvl+0x116/0x1f0 lib/dump_stack.c:120
        print_address_description mm/kasan/report.c:377 [inline]
        print_report+0xc3/0x620 mm/kasan/report.c:488
        kasan_report+0xd9/0x110 mm/kasan/report.c:601
        selinux_sock security/selinux/include/objsec.h:207 [inline]
        selinux_ip_output+0x1e0/0x1f0 security/selinux/hooks.c:5761
        nf_hook_entry_hookfn include/linux/netfilter.h:154 [inline]
        nf_hook_slow+0xbb/0x200 net/netfilter/core.c:626
        nf_hook+0x386/0x6d0 include/linux/netfilter.h:269
        __ip_local_out+0x339/0x640 net/ipv4/ip_output.c:119
        ip_local_out net/ipv4/ip_output.c:128 [inline]
        ip_send_skb net/ipv4/ip_output.c:1505 [inline]
        ip_push_pending_frames+0xa0/0x5b0 net/ipv4/ip_output.c:1525
        ip_send_unicast_reply+0xd0e/0x1650 net/ipv4/ip_output.c:1672
        tcp_v4_send_ack+0x976/0x13f0 net/ipv4/tcp_ipv4.c:1024
        tcp_v4_timewait_ack net/ipv4/tcp_ipv4.c:1077 [inline]
        tcp_v4_rcv+0x2f96/0x4390 net/ipv4/tcp_ipv4.c:2428
        ip_protocol_deliver_rcu+0xba/0x4c0 net/ipv4/ip_input.c:205
        ip_local_deliver_finish+0x316/0x570 net/ipv4/ip_input.c:233
        NF_HOOK include/linux/netfilter.h:314 [inline]
        NF_HOOK include/linux/netfilter.h:308 [inline]
        ip_local_deliver+0x18e/0x1f0 net/ipv4/ip_input.c:254
        dst_input include/net/dst.h:460 [inline]
        ip_rcv_finish net/ipv4/ip_input.c:447 [inline]
        NF_HOOK include/linux/netfilter.h:314 [inline]
        NF_HOOK include/linux/netfilter.h:308 [inline]
        ip_rcv+0x2c3/0x5d0 net/ipv4/ip_input.c:567
        __netif_receive_skb_one_core+0x199/0x1e0 net/core/dev.c:5672
        __netif_receive_skb+0x1d/0x160 net/core/dev.c:5785
        process_backlog+0x443/0x15f0 net/core/dev.c:6117
        __napi_poll.constprop.0+0xb7/0x550 net/core/dev.c:6877
        napi_poll net/core/dev.c:6946 [inline]
        net_rx_action+0xa94/0x1010 net/core/dev.c:7068
        handle_softirqs+0x213/0x8f0 kernel/softirq.c:554
        do_softirq kernel/softirq.c:455 [inline]
        do_softirq+0xb2/0xf0 kernel/softirq.c:442
       </IRQ>
       <TASK>
        __local_bh_enable_ip+0x100/0x120 kernel/softirq.c:382
        local_bh_enable include/linux/bottom_half.h:33 [inline]
        rcu_read_unlock_bh include/linux/rcupdate.h:919 [inline]
        __dev_queue_xmit+0x8af/0x43e0 net/core/dev.c:4461
        dev_queue_xmit include/linux/netdevice.h:3168 [inline]
        neigh_hh_output include/net/neighbour.h:523 [inline]
        neigh_output include/net/neighbour.h:537 [inline]
        ip_finish_output2+0xc6c/0x2150 net/ipv4/ip_output.c:236
        __ip_finish_output net/ipv4/ip_output.c:314 [inline]
        __ip_finish_output+0x49e/0x950 net/ipv4/ip_output.c:296
        ip_finish_output+0x35/0x380 net/ipv4/ip_output.c:324
        NF_HOOK_COND include/linux/netfilter.h:303 [inline]
        ip_output+0x13b/0x2a0 net/ipv4/ip_output.c:434
        dst_output include/net/dst.h:450 [inline]
        ip_local_out+0x33e/0x4a0 net/ipv4/ip_output.c:130
        __ip_queue_xmit+0x777/0x1970 net/ipv4/ip_output.c:536
        __tcp_transmit_skb+0x2b39/0x3df0 net/ipv4/tcp_output.c:1466
        tcp_transmit_skb net/ipv4/tcp_output.c:1484 [inline]
        tcp_write_xmit+0x12b1/0x8560 net/ipv4/tcp_output.c:2827
        __tcp_push_pending_frames+0xaf/0x390 net/ipv4/tcp_output.c:3010
        tcp_send_fin+0x154/0xc70 net/ipv4/tcp_output.c:3616
        __tcp_close+0x96b/0xff0 net/ipv4/tcp.c:3130
        tcp_close+0x28/0x120 net/ipv4/tcp.c:3221
        inet_release+0x13c/0x280 net/ipv4/af_inet.c:435
        __sock_release net/socket.c:640 [inline]
        sock_release+0x8e/0x1d0 net/socket.c:668
        smc_clcsock_release+0xb7/0xe0 net/smc/smc_close.c:34
        __smc_release+0x5c2/0x880 net/smc/af_smc.c:301
        smc_release+0x1fc/0x5f0 net/smc/af_smc.c:344
        __sock_release+0xb0/0x270 net/socket.c:640
        sock_close+0x1c/0x30 net/socket.c:1408
        __fput+0x3f8/0xb60 fs/file_table.c:450
        __fput_sync+0xa1/0xc0 fs/file_table.c:535
        __do_sys_close fs/open.c:1550 [inline]
        __se_sys_close fs/open.c:1535 [inline]
        __x64_sys_close+0x86/0x100 fs/open.c:1535
        do_syscall_x64 arch/x86/entry/common.c:52 [inline]
        do_syscall_64+0xcd/0x250 arch/x86/entry/common.c:83
       entry_SYSCALL_64_after_hwframe+0x77/0x7f
      RIP: 0033:0x7f6814c9ae10
      Code: ff f7 d8 64 89 02 48 c7 c0 ff ff ff ff c3 66 2e 0f 1f 84 00 00 00 00 00 66 90 80 3d b1 e2 07 00 00 74 17 b8 03 00 00 00 0f 05 <48> 3d 00 f0 ff ff 77 48 c3 0f 1f 80 00 00 00 00 48 83 ec 18 89 7c
      RSP: 002b:00007fffb2389758 EFLAGS: 00000202 ORIG_RAX: 0000000000000003
      RAX: ffffffffffffffda RBX: 0000000000000004 RCX: 00007f6814c9ae10
      RDX: 0000000000000010 RSI: 0000000020000000 RDI: 0000000000000003
      RBP: 00000000000f4240 R08: 0000000000000001 R09: 0000000000000001
      R10: 0000000000000001 R11: 0000000000000202 R12: 00007fffb23897b0
      R13: 00000000000141c3 R14: 00007fffb238977c R15: 00007fffb2389790
       </TASK>
      
      Fixes: 79636038 ("ipv4: tcp: give socket pointer to control skbs")
      Reported-by: default avatar <syzbot+2d9f5f948c31dcb7745e@syzkaller.appspotmail.com>
      Closes: https://lore.kernel.org/lkml/6745e1a2.050a0220.1286eb.001c.GAE@google.com/T/#u
      
      
      Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
      Acked-by: default avatarPaul Moore <paul@paul-moore.com>
      Reviewed-by: default avatarKuniyuki Iwashima <kuniyu@amazon.com>
      Link: https://patch.msgid.link/20241126145911.4187198-1-edumazet@google.com
      
      
      Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      eedcad2f
  9. Nov 27, 2024
  10. Nov 09, 2024
  11. Nov 06, 2024
    • Yafang Shao's avatar
      security: replace memcpy() with get_task_comm() · d4ee4ac3
      Yafang Shao authored
      Quoted from Linus [0]:
      
        selinux never wanted a lock, and never wanted any kind of *consistent*
        result, it just wanted a *stable* result.
      
      Using get_task_comm() to read the task comm ensures that the name is
      always NUL-terminated, regardless of the source string. This approach also
      facilitates future extensions to the task comm.
      
      Link: https://lkml.kernel.org/r/20241007144911.27693-4-laoar.shao@gmail.com
      
      
      Signed-off-by: default avatarYafang Shao <laoar.shao@gmail.com>
      Link: https://lore.kernel.org/all/CAHk-=wivfrF0_zvf+oj6==Sh=-npJooP8chLPEfaFV0oNYTTBA@mail.gmail.com/
      
       [0]
      Acked-by: default avatarPaul Moore <paul@paul-moore.com>
      Cc: James Morris <jmorris@namei.org>
      Cc: "Serge E. Hallyn" <serge@hallyn.com>
      Cc: Stephen Smalley <stephen.smalley.work@gmail.com>
      Cc: Ondrej Mosnacek <omosnace@redhat.com>
      Cc: Alejandro Colomar <alx@kernel.org>
      Cc: Alexander Viro <viro@zeniv.linux.org.uk>
      Cc: Alexei Starovoitov <alexei.starovoitov@gmail.com>
      Cc: Andy Shevchenko <andy.shevchenko@gmail.com>
      Cc: Catalin Marinas <catalin.marinas@arm.com>
      Cc: Christian Brauner <brauner@kernel.org>
      Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
      Cc: David Airlie <airlied@gmail.com>
      Cc: Eric Biederman <ebiederm@xmission.com>
      Cc: Eric Paris <eparis@redhat.com>
      Cc: Jan Kara <jack@suse.cz>
      Cc: Justin Stitt <justinstitt@google.com>
      Cc: Kees Cook <keescook@chromium.org>
      Cc: Linus Torvalds <torvalds@linux-foundation.org>
      Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
      Cc: Matthew Wilcox <willy@infradead.org>
      Cc: Matus Jokay <matus.jokay@stuba.sk>
      Cc: Maxime Ripard <mripard@kernel.org>
      Cc: Quentin Monnet <qmo@kernel.org>
      Cc: Simon Horman <horms@kernel.org>
      Cc: Steven Rostedt (Google) <rostedt@goodmis.org>
      Cc: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
      Cc: Thomas Zimmermann <tzimmermann@suse.de>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      d4ee4ac3
  12. Nov 04, 2024
    • David Gstir's avatar
      KEYS: trusted: dcp: fix NULL dereference in AEAD crypto operation · 04de7589
      David Gstir authored
      
      When sealing or unsealing a key blob we currently do not wait for
      the AEAD cipher operation to finish and simply return after submitting
      the request. If there is some load on the system we can exit before
      the cipher operation is done and the buffer we read from/write to
      is already removed from the stack. This will e.g. result in NULL
      pointer dereference errors in the DCP driver during blob creation.
      
      Fix this by waiting for the AEAD cipher operation to finish before
      resuming the seal and unseal calls.
      
      Cc: stable@vger.kernel.org # v6.10+
      Fixes: 0e28bf61 ("KEYS: trusted: dcp: fix leak of blob encryption key")
      Reported-by: default avatarParthiban N <parthiban@linumiz.com>
      Closes: https://lore.kernel.org/keyrings/254d3bb1-6dbc-48b4-9c08-77df04baee2f@linumiz.com/
      
      
      Signed-off-by: default avatarDavid Gstir <david@sigma-star.at>
      Reviewed-by: default avatarJarkko Sakkinen <jarkko@kernel.org>
      Signed-off-by: default avatarJarkko Sakkinen <jarkko@kernel.org>
      04de7589
    • Chen Ridong's avatar
      security/keys: fix slab-out-of-bounds in key_task_permission · 4a74da04
      Chen Ridong authored
      KASAN reports an out of bounds read:
      BUG: KASAN: slab-out-of-bounds in __kuid_val include/linux/uidgid.h:36
      BUG: KASAN: slab-out-of-bounds in uid_eq include/linux/uidgid.h:63 [inline]
      BUG: KASAN: slab-out-of-bounds in key_task_permission+0x394/0x410
      security/keys/permission.c:54
      Read of size 4 at addr ffff88813c3ab618 by task stress-ng/4362
      
      CPU: 2 PID: 4362 Comm: stress-ng Not tainted 5.10.0-14930-gafbffd6c3ede #15
      Call Trace:
       __dump_stack lib/dump_stack.c:82 [inline]
       dump_stack+0x107/0x167 lib/dump_stack.c:123
       print_address_description.constprop.0+0x19/0x170 mm/kasan/report.c:400
       __kasan_report.cold+0x6c/0x84 mm/kasan/report.c:560
       kasan_report+0x3a/0x50 mm/kasan/report.c:585
       __kuid_val include/linux/uidgid.h:36 [inline]
       uid_eq include/linux/uidgid.h:63 [inline]
       key_task_permission+0x394/0x410 security/keys/permission.c:54
       search_nested_keyrings+0x90e/0xe90 security/keys/keyring.c:793
      
      This issue was also reported by syzbot.
      
      It can be reproduced by following these steps(more details [1]):
      1. Obtain more than 32 inputs that have similar hashes, which ends with the
         pattern '0xxxxxxxe6'.
      2. Reboot and add the keys obtained in step 1.
      
      The reproducer demonstrates how this issue happened:
      1. In the search_nested_keyrings function, when it iterates through the
         slots in a node(below tag ascend_to_node), if the slot pointer is meta
         and node->back_pointer != NULL(it means a root), it will proceed to
         descend_to_node. However, there is an exception. If node is the root,
         and one of the slots points to a shortcut, it will be treated as a
         keyring.
      2. Whether the ptr is keyring decided by keyring_ptr_is_keyring function.
         However, KEYRING_PTR_SUBTYPE is 0x2UL, the same as
         ASSOC_ARRAY_PTR_SUBTYPE_MASK.
      3. When 32 keys with the similar hashes are added to the tree, the ROOT
         has keys with hashes that are not similar (e.g. slot 0) and it splits
         NODE A without using a shortcut. When NODE A is filled with keys that
         all hashes are xxe6, the keys are similar, NODE A will split with a
         shortcut. Finally, it forms the tree as shown below, where slot 6 points
         to a shortcut.
      
                            NODE A
                    +------>+---+
            ROOT    |       | 0 | xxe6
            +---+   |       +---+
       xxxx | 0 | shortcut  :   : xxe6
            +---+   |       +---+
       xxe6 :   :   |       |   | xxe6
            +---+   |       +---+
            | 6 |---+       :   : xxe6
            +---+           +---+
       xxe6 :   :           | f | xxe6
            +---+           +---+
       xxe6 | f |
            +---+
      
      4. As mentioned above, If a slot(slot 6) of the root points to a shortcut,
         it may be mistakenly transferred to a key*, leading to a read
         out-of-bounds read.
      
      To fix this issue, one should jump to descend_to_node if the ptr is a
      shortcut, regardless of whether the node is root or not.
      
      [1] https://lore.kernel.org/linux-kernel/1cfa878e-8c7b-4570-8606-21daf5e13ce7@huaweicloud.com/
      
      
      
      [jarkko: tweaked the commit message a bit to have an appropriate closes
       tag.]
      Fixes: b2a4df20 ("KEYS: Expand the capacity of a keyring")
      Reported-by: default avatar <syzbot+5b415c07907a2990d1a3@syzkaller.appspotmail.com>
      Closes: https://lore.kernel.org/all/000000000000cbb7860611f61147@google.com/T/
      
      
      Signed-off-by: default avatarChen Ridong <chenridong@huawei.com>
      Reviewed-by: default avatarJarkko Sakkinen <jarkko@kernel.org>
      Signed-off-by: default avatarJarkko Sakkinen <jarkko@kernel.org>
      4a74da04
  13. Nov 03, 2024
  14. Oct 18, 2024
  15. Oct 17, 2024
    • Luca Boccassi's avatar
      ipe: allow secondary and platform keyrings to install/update policies · 02e2f9aa
      Luca Boccassi authored
      
      The current policy management makes it impossible to use IPE
      in a general purpose distribution. In such cases the users are not
      building the kernel, the distribution is, and access to the private
      key included in the trusted keyring is, for obvious reason, not
      available.
      This means that users have no way to enable IPE, since there will
      be no built-in generic policy, and no access to the key to sign
      updates validated by the trusted keyring.
      
      Just as we do for dm-verity, kernel modules and more, allow the
      secondary and platform keyrings to also validate policies. This
      allows users enrolling their own keys in UEFI db or MOK to also
      sign policies, and enroll them. This makes it sensible to enable
      IPE in general purpose distributions, as it becomes usable by
      any user wishing to do so. Keys in these keyrings can already
      load kernels and kernel modules, so there is no security
      downgrade.
      
      Add a kconfig each, like dm-verity does, but default to enabled if
      the dependencies are available.
      
      Signed-off-by: default avatarLuca Boccassi <bluca@debian.org>
      Reviewed-by: default avatarSerge Hallyn <serge@hallyn.com>
      [FW: fixed some style issues]
      Signed-off-by: default avatarFan Wu <wufan@kernel.org>
      02e2f9aa
    • Luca Boccassi's avatar
      ipe: also reject policy updates with the same version · 5ceecb30
      Luca Boccassi authored
      
      Currently IPE accepts an update that has the same version as the policy
      being updated, but it doesn't make it a no-op nor it checks that the
      old and new policyes are the same. So it is possible to change the
      content of a policy, without changing its version. This is very
      confusing from userspace when managing policies.
      Instead change the update logic to reject updates that have the same
      version with ESTALE, as that is much clearer and intuitive behaviour.
      
      Signed-off-by: default avatarLuca Boccassi <bluca@debian.org>
      Reviewed-by: default avatarSerge Hallyn <serge@hallyn.com>
      Signed-off-by: default avatarFan Wu <wufan@kernel.org>
      5ceecb30
    • Luca Boccassi's avatar
      ipe: return -ESTALE instead of -EINVAL on update when new policy has a lower version · 57994189
      Luca Boccassi authored
      
      When loading policies in userspace we want a recognizable error when an
      update attempts to use an old policy, as that is an error that needs
      to be treated differently from an invalid policy. Use -ESTALE as it is
      clear enough for an update mechanism.
      
      Signed-off-by: default avatarLuca Boccassi <bluca@debian.org>
      Reviewed-by: default avatarSerge Hallyn <serge@hallyn.com>
      Signed-off-by: default avatarFan Wu <wufan@kernel.org>
      57994189
Loading