Skip to content
Snippets Groups Projects
  1. Feb 22, 2023
    • Mike Christie's avatar
      scsi: iscsi_tcp: Fix UAF during login when accessing the shost ipaddress · 6abd4698
      Mike Christie authored
      [ Upstream commit f484a794 ]
      
      If during iscsi_sw_tcp_session_create() iscsi_tcp_r2tpool_alloc() fails,
      userspace could be accessing the host's ipaddress attr. If we then free the
      session via iscsi_session_teardown() while userspace is still accessing the
      session we will hit a use after free bug.
      
      Set the tcp_sw_host->session after we have completed session creation and
      can no longer fail.
      
      Link: https://lore.kernel.org/r/20230117193937.21244-3-michael.christie@oracle.com
      
      
      Signed-off-by: default avatarMike Christie <michael.christie@oracle.com>
      Reviewed-by: default avatarLee Duncan <lduncan@suse.com>
      Acked-by: default avatarDing Hui <dinghui@sangfor.com.cn>
      Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      6abd4698
    • Maurizio Lombardi's avatar
      scsi: target: core: Fix warning on RT kernels · b228bd36
      Maurizio Lombardi authored
      
      [ Upstream commit 84ed64b1 ]
      
      Calling spin_lock_irqsave() does not disable the interrupts on realtime
      kernels, remove the warning and replace assert_spin_locked() with
      lockdep_assert_held().
      
      Signed-off-by: default avatarMaurizio Lombardi <mlombard@redhat.com>
      Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
      Link: https://lore.kernel.org/r/20230110125310.55884-1-mlombard@redhat.com
      
      
      Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      b228bd36
    • Fedor Pchelkin's avatar
      net: openvswitch: fix flow memory leak in ovs_flow_cmd_new · af4e720b
      Fedor Pchelkin authored
      
      [ Upstream commit 0c598aed ]
      
      Syzkaller reports a memory leak of new_flow in ovs_flow_cmd_new() as it is
      not freed when an allocation of a key fails.
      
      BUG: memory leak
      unreferenced object 0xffff888116668000 (size 632):
        comm "syz-executor231", pid 1090, jiffies 4294844701 (age 18.871s)
        hex dump (first 32 bytes):
          00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
          00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
        backtrace:
          [<00000000defa3494>] kmem_cache_zalloc include/linux/slab.h:654 [inline]
          [<00000000defa3494>] ovs_flow_alloc+0x19/0x180 net/openvswitch/flow_table.c:77
          [<00000000c67d8873>] ovs_flow_cmd_new+0x1de/0xd40 net/openvswitch/datapath.c:957
          [<0000000010a539a8>] genl_family_rcv_msg_doit+0x22d/0x330 net/netlink/genetlink.c:739
          [<00000000dff3302d>] genl_family_rcv_msg net/netlink/genetlink.c:783 [inline]
          [<00000000dff3302d>] genl_rcv_msg+0x328/0x590 net/netlink/genetlink.c:800
          [<000000000286dd87>] netlink_rcv_skb+0x153/0x430 net/netlink/af_netlink.c:2515
          [<0000000061fed410>] genl_rcv+0x24/0x40 net/netlink/genetlink.c:811
          [<000000009dc0f111>] netlink_unicast_kernel net/netlink/af_netlink.c:1313 [inline]
          [<000000009dc0f111>] netlink_unicast+0x545/0x7f0 net/netlink/af_netlink.c:1339
          [<000000004a5ee816>] netlink_sendmsg+0x8e7/0xde0 net/netlink/af_netlink.c:1934
          [<00000000482b476f>] sock_sendmsg_nosec net/socket.c:651 [inline]
          [<00000000482b476f>] sock_sendmsg+0x152/0x190 net/socket.c:671
          [<00000000698574ba>] ____sys_sendmsg+0x70a/0x870 net/socket.c:2356
          [<00000000d28d9e11>] ___sys_sendmsg+0xf3/0x170 net/socket.c:2410
          [<0000000083ba9120>] __sys_sendmsg+0xe5/0x1b0 net/socket.c:2439
          [<00000000c00628f8>] do_syscall_64+0x30/0x40 arch/x86/entry/common.c:46
          [<000000004abfdcf4>] entry_SYSCALL_64_after_hwframe+0x61/0xc6
      
      To fix this the patch rearranges the goto labels to reflect the order of
      object allocations and adds appropriate goto statements on the error
      paths.
      
      Found by Linux Verification Center (linuxtesting.org) with Syzkaller.
      
      Fixes: 68bb1010 ("openvswitch: Fix flow lookup to use unmasked key")
      Signed-off-by: default avatarFedor Pchelkin <pchelkin@ispras.ru>
      Signed-off-by: default avatarAlexey Khoroshilov <khoroshilov@ispras.ru>
      Acked-by: default avatarEelco Chaudron <echaudro@redhat.com>
      Reviewed-by: default avatarSimon Horman <simon.horman@corigine.com>
      Link: https://lore.kernel.org/r/20230201210218.361970-1-pchelkin@ispras.ru
      
      
      Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      af4e720b
    • Damien Le Moal's avatar
      ata: libata: Fix sata_down_spd_limit() when no link speed is reported · 15402e0e
      Damien Le Moal authored
      
      [ Upstream commit 69f2c934 ]
      
      Commit 2dc0b46b ("libata: sata_down_spd_limit should return if
      driver has not recorded sstatus speed") changed the behavior of
      sata_down_spd_limit() to return doing nothing if a drive does not report
      a current link speed, to avoid reducing the link speed to the lowest 1.5
      Gbps speed.
      
      However, the change assumed that a speed was recorded before probing
      (e.g. before a suspend/resume) and set in link->sata_spd. This causes
      problems with adapters/drives combination failing to establish a link
      speed during probe autonegotiation. One example reported of this problem
      is an mvebu adapter with a 3Gbps port-multiplier box: autonegotiation
      fails, leaving no recorded link speed and no reported current link
      speed. Probe retries also fail as no action is taken by sata_set_spd()
      after each retry.
      
      Fix this by returning early in sata_down_spd_limit() only if we do have
      a recorded link speed, that is, if link->sata_spd is not 0. With this
      fix, a failed probe not leading to a recorded link speed is retried at
      the lower 1.5 Gbps speed, with the link speed potentially increased
      later on the second revalidate of the device if the device reports
      that it supports higher link speeds.
      
      Reported-by: default avatarMarius Dinu <marius@psihoexpert.ro>
      Fixes: 2dc0b46b ("libata: sata_down_spd_limit should return if driver has not recorded sstatus speed")
      Reviewed-by: default avatarNiklas Cassel <niklas.cassel@wdc.com>
      Tested-by: default avatarMarius Dinu <marius@psihoexpert.ro>
      Signed-off-by: default avatarDamien Le Moal <damien.lemoal@opensource.wdc.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      15402e0e
    • Fedor Pchelkin's avatar
      squashfs: harden sanity check in squashfs_read_xattr_id_table · b30a74f8
      Fedor Pchelkin authored
      [ Upstream commit 72e544b1 ]
      
      While mounting a corrupted filesystem, a signed integer '*xattr_ids' can
      become less than zero.  This leads to the incorrect computation of 'len'
      and 'indexes' values which can cause null-ptr-deref in copy_bio_to_actor()
      or out-of-bounds accesses in the next sanity checks inside
      squashfs_read_xattr_id_table().
      
      Found by Linux Verification Center (linuxtesting.org) with Syzkaller.
      
      Link: https://lkml.kernel.org/r/20230117105226.329303-2-pchelkin@ispras.ru
      
      
      Fixes: 506220d2 ("squashfs: add more sanity checks in xattr id lookup")
      Reported-by: default avatar <syzbot+082fa4af80a5bb1a9843@syzkaller.appspotmail.com>
      Signed-off-by: default avatarFedor Pchelkin <pchelkin@ispras.ru>
      Signed-off-by: default avatarAlexey Khoroshilov <khoroshilov@ispras.ru>
      Cc: Phillip Lougher <phillip@squashfs.org.uk>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      b30a74f8
    • Hyunwoo Kim's avatar
      netrom: Fix use-after-free caused by accept on already connected socket · 2c1984d1
      Hyunwoo Kim authored
      
      [ Upstream commit 61179292 ]
      
      If you call listen() and accept() on an already connect()ed
      AF_NETROM socket, accept() can successfully connect.
      This is because when the peer socket sends data to sendmsg,
      the skb with its own sk stored in the connected socket's
      sk->sk_receive_queue is connected, and nr_accept() dequeues
      the skb waiting in the sk->sk_receive_queue.
      
      As a result, nr_accept() allocates and returns a sock with
      the sk of the parent AF_NETROM socket.
      
      And here use-after-free can happen through complex race conditions:
      ```
                        cpu0                                                     cpu1
                                                                     1. socket_2 = socket(AF_NETROM)
                                                                              .
                                                                              .
                                                                        listen(socket_2)
                                                                        accepted_socket = accept(socket_2)
             2. socket_1 = socket(AF_NETROM)
                  nr_create()    // sk refcount : 1
                connect(socket_1)
                                                                     3. write(accepted_socket)
                                                                          nr_sendmsg()
                                                                          nr_output()
                                                                          nr_kick()
                                                                          nr_send_iframe()
                                                                          nr_transmit_buffer()
                                                                          nr_route_frame()
                                                                          nr_loopback_queue()
                                                                          nr_loopback_timer()
                                                                          nr_rx_frame()
                                                                          nr_process_rx_frame(sk, skb);    // sk : socket_1's sk
                                                                          nr_state3_machine()
                                                                          nr_queue_rx_frame()
                                                                          sock_queue_rcv_skb()
                                                                          sock_queue_rcv_skb_reason()
                                                                          __sock_queue_rcv_skb()
                                                                          __skb_queue_tail(list, skb);    // list : socket_1's sk->sk_receive_queue
             4. listen(socket_1)
                  nr_listen()
                uaf_socket = accept(socket_1)
                  nr_accept()
                  skb_dequeue(&sk->sk_receive_queue);
                                                                     5. close(accepted_socket)
                                                                          nr_release()
                                                                          nr_write_internal(sk, NR_DISCREQ)
                                                                          nr_transmit_buffer()    // NR_DISCREQ
                                                                          nr_route_frame()
                                                                          nr_loopback_queue()
                                                                          nr_loopback_timer()
                                                                          nr_rx_frame()    // sk : socket_1's sk
                                                                          nr_process_rx_frame()  // NR_STATE_3
                                                                          nr_state3_machine()    // NR_DISCREQ
                                                                          nr_disconnect()
                                                                          nr_sk(sk)->state = NR_STATE_0;
             6. close(socket_1)    // sk refcount : 3
                  nr_release()    // NR_STATE_0
                  sock_put(sk);    // sk refcount : 0
                  sk_free(sk);
                close(uaf_socket)
                  nr_release()
                  sock_hold(sk);    // UAF
      ```
      
      KASAN report by syzbot:
      ```
      BUG: KASAN: use-after-free in nr_release+0x66/0x460 net/netrom/af_netrom.c:520
      Write of size 4 at addr ffff8880235d8080 by task syz-executor564/5128
      
      Call Trace:
       <TASK>
       __dump_stack lib/dump_stack.c:88 [inline]
       dump_stack_lvl+0xd1/0x138 lib/dump_stack.c:106
       print_address_description mm/kasan/report.c:306 [inline]
       print_report+0x15e/0x461 mm/kasan/report.c:417
       kasan_report+0xbf/0x1f0 mm/kasan/report.c:517
       check_region_inline mm/kasan/generic.c:183 [inline]
       kasan_check_range+0x141/0x190 mm/kasan/generic.c:189
       instrument_atomic_read_write include/linux/instrumented.h:102 [inline]
       atomic_fetch_add_relaxed include/linux/atomic/atomic-instrumented.h:116 [inline]
       __refcount_add include/linux/refcount.h:193 [inline]
       __refcount_inc include/linux/refcount.h:250 [inline]
       refcount_inc include/linux/refcount.h:267 [inline]
       sock_hold include/net/sock.h:775 [inline]
       nr_release+0x66/0x460 net/netrom/af_netrom.c:520
       __sock_release+0xcd/0x280 net/socket.c:650
       sock_close+0x1c/0x20 net/socket.c:1365
       __fput+0x27c/0xa90 fs/file_table.c:320
       task_work_run+0x16f/0x270 kernel/task_work.c:179
       exit_task_work include/linux/task_work.h:38 [inline]
       do_exit+0xaa8/0x2950 kernel/exit.c:867
       do_group_exit+0xd4/0x2a0 kernel/exit.c:1012
       get_signal+0x21c3/0x2450 kernel/signal.c:2859
       arch_do_signal_or_restart+0x79/0x5c0 arch/x86/kernel/signal.c:306
       exit_to_user_mode_loop kernel/entry/common.c:168 [inline]
       exit_to_user_mode_prepare+0x15f/0x250 kernel/entry/common.c:203
       __syscall_exit_to_user_mode_work kernel/entry/common.c:285 [inline]
       syscall_exit_to_user_mode+0x1d/0x50 kernel/entry/common.c:296
       do_syscall_64+0x46/0xb0 arch/x86/entry/common.c:86
       entry_SYSCALL_64_after_hwframe+0x63/0xcd
      RIP: 0033:0x7f6c19e3c9b9
      Code: Unable to access opcode bytes at 0x7f6c19e3c98f.
      RSP: 002b:00007fffd4ba2ce8 EFLAGS: 00000246 ORIG_RAX: 0000000000000133
      RAX: 0000000000000116 RBX: 0000000000000003 RCX: 00007f6c19e3c9b9
      RDX: 0000000000000318 RSI: 00000000200bd000 RDI: 0000000000000006
      RBP: 0000000000000003 R08: 000000000000000d R09: 000000000000000d
      R10: 0000000000000000 R11: 0000000000000246 R12: 000055555566a2c0
      R13: 0000000000000011 R14: 0000000000000000 R15: 0000000000000000
       </TASK>
      
      Allocated by task 5128:
       kasan_save_stack+0x22/0x40 mm/kasan/common.c:45
       kasan_set_track+0x25/0x30 mm/kasan/common.c:52
       ____kasan_kmalloc mm/kasan/common.c:371 [inline]
       ____kasan_kmalloc mm/kasan/common.c:330 [inline]
       __kasan_kmalloc+0xa3/0xb0 mm/kasan/common.c:380
       kasan_kmalloc include/linux/kasan.h:211 [inline]
       __do_kmalloc_node mm/slab_common.c:968 [inline]
       __kmalloc+0x5a/0xd0 mm/slab_common.c:981
       kmalloc include/linux/slab.h:584 [inline]
       sk_prot_alloc+0x140/0x290 net/core/sock.c:2038
       sk_alloc+0x3a/0x7a0 net/core/sock.c:2091
       nr_create+0xb6/0x5f0 net/netrom/af_netrom.c:433
       __sock_create+0x359/0x790 net/socket.c:1515
       sock_create net/socket.c:1566 [inline]
       __sys_socket_create net/socket.c:1603 [inline]
       __sys_socket_create net/socket.c:1588 [inline]
       __sys_socket+0x133/0x250 net/socket.c:1636
       __do_sys_socket net/socket.c:1649 [inline]
       __se_sys_socket net/socket.c:1647 [inline]
       __x64_sys_socket+0x73/0xb0 net/socket.c:1647
       do_syscall_x64 arch/x86/entry/common.c:50 [inline]
       do_syscall_64+0x39/0xb0 arch/x86/entry/common.c:80
       entry_SYSCALL_64_after_hwframe+0x63/0xcd
      
      Freed by task 5128:
       kasan_save_stack+0x22/0x40 mm/kasan/common.c:45
       kasan_set_track+0x25/0x30 mm/kasan/common.c:52
       kasan_save_free_info+0x2b/0x40 mm/kasan/generic.c:518
       ____kasan_slab_free mm/kasan/common.c:236 [inline]
       ____kasan_slab_free+0x13b/0x1a0 mm/kasan/common.c:200
       kasan_slab_free include/linux/kasan.h:177 [inline]
       __cache_free mm/slab.c:3394 [inline]
       __do_kmem_cache_free mm/slab.c:3580 [inline]
       __kmem_cache_free+0xcd/0x3b0 mm/slab.c:3587
       sk_prot_free net/core/sock.c:2074 [inline]
       __sk_destruct+0x5df/0x750 net/core/sock.c:2166
       sk_destruct net/core/sock.c:2181 [inline]
       __sk_free+0x175/0x460 net/core/sock.c:2192
       sk_free+0x7c/0xa0 net/core/sock.c:2203
       sock_put include/net/sock.h:1991 [inline]
       nr_release+0x39e/0x460 net/netrom/af_netrom.c:554
       __sock_release+0xcd/0x280 net/socket.c:650
       sock_close+0x1c/0x20 net/socket.c:1365
       __fput+0x27c/0xa90 fs/file_table.c:320
       task_work_run+0x16f/0x270 kernel/task_work.c:179
       exit_task_work include/linux/task_work.h:38 [inline]
       do_exit+0xaa8/0x2950 kernel/exit.c:867
       do_group_exit+0xd4/0x2a0 kernel/exit.c:1012
       get_signal+0x21c3/0x2450 kernel/signal.c:2859
       arch_do_signal_or_restart+0x79/0x5c0 arch/x86/kernel/signal.c:306
       exit_to_user_mode_loop kernel/entry/common.c:168 [inline]
       exit_to_user_mode_prepare+0x15f/0x250 kernel/entry/common.c:203
       __syscall_exit_to_user_mode_work kernel/entry/common.c:285 [inline]
       syscall_exit_to_user_mode+0x1d/0x50 kernel/entry/common.c:296
       do_syscall_64+0x46/0xb0 arch/x86/entry/common.c:86
       entry_SYSCALL_64_after_hwframe+0x63/0xcd
      ```
      
      To fix this issue, nr_listen() returns -EINVAL for sockets that
      successfully nr_connect().
      
      Reported-by: default avatar <syzbot+caa188bdfc1eeafeb418@syzkaller.appspotmail.com>
      Fixes: 1da177e4 ("Linux-2.6.12-rc2")
      Signed-off-by: default avatarHyunwoo Kim <v4bel@theori.io>
      Reviewed-by: default avatarKuniyuki Iwashima <kuniyu@amazon.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      2c1984d1
    • Artemii Karasev's avatar
      ALSA: hda/via: Avoid potential array out-of-bound in add_secret_dac_path() · 6e1f586d
      Artemii Karasev authored
      
      [ Upstream commit b9cee506 ]
      
      snd_hda_get_connections() can return a negative error code.
      It may lead to accessing 'conn' array at a negative index.
      
      Found by Linux Verification Center (linuxtesting.org) with SVACE.
      
      Signed-off-by: default avatarArtemii Karasev <karasev@ispras.ru>
      Fixes: 30b45033 ("ALSA: hda - Expose secret DAC-AA connection of some VIA codecs")
      Link: https://lore.kernel.org/r/20230119082259.3634-1-karasev@ispras.ru
      
      
      Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      6e1f586d
    • Yuan Can's avatar
      bus: sunxi-rsb: Fix error handling in sunxi_rsb_init() · f7c9e58c
      Yuan Can authored
      
      [ Upstream commit f71eaf27 ]
      
      The sunxi_rsb_init() returns the platform_driver_register() directly
      without checking its return value, if platform_driver_register() failed,
      the sunxi_rsb_bus is not unregistered.
      Fix by unregister sunxi_rsb_bus when platform_driver_register() failed.
      
      Fixes: d787dcdb ("bus: sunxi-rsb: Add driver for Allwinner Reduced Serial Bus")
      Signed-off-by: default avatarYuan Can <yuancan@huawei.com>
      Reviewed-by: default avatarJernej Skrabec <jernej.skrabec@gmail.com>
      Link: https://lore.kernel.org/r/20221123094200.12036-1-yuancan@huawei.com
      
      
      Signed-off-by: default avatarJernej Skrabec <jernej.skrabec@gmail.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      f7c9e58c
    • Takashi Sakamoto's avatar
      firewire: fix memory leak for payload of request subaction to IEC 61883-1 FCP region · 356ff89a
      Takashi Sakamoto authored
      
      commit 531390a2 upstream.
      
      This patch is fix for Linux kernel v2.6.33 or later.
      
      For request subaction to IEC 61883-1 FCP region, Linux FireWire subsystem
      have had an issue of use-after-free. The subsystem allows multiple
      user space listeners to the region, while data of the payload was likely
      released before the listeners execute read(2) to access to it for copying
      to user space.
      
      The issue was fixed by a commit 281e2032 ("firewire: core: fix
      use-after-free regression in FCP handler"). The object of payload is
      duplicated in kernel space for each listener. When the listener executes
      ioctl(2) with FW_CDEV_IOC_SEND_RESPONSE request, the object is going to
      be released.
      
      However, it causes memory leak since the commit relies on call of
      release_request() in drivers/firewire/core-cdev.c. Against the
      expectation, the function is never called due to the design of
      release_client_resource(). The function delegates release task
      to caller when called with non-NULL fourth argument. The implementation
      of ioctl_send_response() is the case. It should release the object
      explicitly.
      
      This commit fixes the bug.
      
      Cc: <stable@vger.kernel.org>
      Fixes: 281e2032 ("firewire: core: fix use-after-free regression in FCP handler")
      Signed-off-by: default avatarTakashi Sakamoto <o-takashi@sakamocchi.jp>
      Link: https://lore.kernel.org/r/20230117090610.93792-2-o-takashi@sakamocchi.jp
      
      
      Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      356ff89a
  2. Feb 06, 2023
Loading