linux-stable/net
Schspa Shi 73c47b3123 9p: set req refcount to zero to avoid uninitialized usage
commit 26273ade77 upstream.

When a new request is allocated, the refcount will be zero if it is
reused, but if the request is newly allocated from slab, it is not fully
initialized before being added to idr.

If the p9_read_work got a response before the refcount initiated. It will
use a uninitialized req, which will result in a bad request data struct.

Here is the logs from syzbot.

Corrupted memory at 0xffff88807eade00b [ 0xff 0x07 0x00 0x00 0x00 0x00
0x00 0x00 . . . . . . . . ] (in kfence-#110):
 p9_fcall_fini net/9p/client.c:248 [inline]
 p9_req_put net/9p/client.c:396 [inline]
 p9_req_put+0x208/0x250 net/9p/client.c:390
 p9_client_walk+0x247/0x540 net/9p/client.c:1165
 clone_fid fs/9p/fid.h:21 [inline]
 v9fs_fid_xattr_set+0xe4/0x2b0 fs/9p/xattr.c:118
 v9fs_xattr_set fs/9p/xattr.c:100 [inline]
 v9fs_xattr_handler_set+0x6f/0x120 fs/9p/xattr.c:159
 __vfs_setxattr+0x119/0x180 fs/xattr.c:182
 __vfs_setxattr_noperm+0x129/0x5f0 fs/xattr.c:216
 __vfs_setxattr_locked+0x1d3/0x260 fs/xattr.c:277
 vfs_setxattr+0x143/0x340 fs/xattr.c:309
 setxattr+0x146/0x160 fs/xattr.c:617
 path_setxattr+0x197/0x1c0 fs/xattr.c:636
 __do_sys_setxattr fs/xattr.c:652 [inline]
 __se_sys_setxattr fs/xattr.c:648 [inline]
 __ia32_sys_setxattr+0xc0/0x160 fs/xattr.c:648
 do_syscall_32_irqs_on arch/x86/entry/common.c:112 [inline]
 __do_fast_syscall_32+0x65/0xf0 arch/x86/entry/common.c:178
 do_fast_syscall_32+0x33/0x70 arch/x86/entry/common.c:203
 entry_SYSENTER_compat_after_hwframe+0x70/0x82

Below is a similar scenario, the scenario in the syzbot log looks more
complicated than this one, but this patch can fix it.

     T21124                   p9_read_work
======================== second trans =================================
p9_client_walk
  p9_client_rpc
    p9_client_prepare_req
      p9_tag_alloc
        req = kmem_cache_alloc(p9_req_cache, GFP_NOFS);
        tag = idr_alloc
        << preempted >>
        req->tc.tag = tag;
                            /* req->[refcount/tag] == uninitialized */
                            m->rreq = p9_tag_lookup(m->client, m->rc.tag);
                              /* increments uninitalized refcount */

        refcount_set(&req->refcount, 2);
                            /* cb drops one ref */
                            p9_client_cb(req)
                            /* reader thread drops its ref:
                               request is incorrectly freed */
                            p9_req_put(req)
    /* use after free and ref underflow */
    p9_req_put(req)

To fix it, we can initialize the refcount to zero before add to idr.

Link: https://lkml.kernel.org/r/20221201033310.18589-1-schspa@gmail.com
Cc: stable@vger.kernel.org # 6.0+ due to 6cda12864c ("9p: Drop kref usage")
Fixes: 728356dede ("9p: Add refcount to p9_req_t")
Reported-by: syzbot+8f1060e2aaf8ca55220b@syzkaller.appspotmail.com
Signed-off-by: Schspa Shi <schspa@gmail.com>
Reviewed-by: Christian Schoenebeck <linux_oss@crudebyte.com>
Signed-off-by: Dominique Martinet <asmadeus@codewreck.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2022-12-31 13:26:52 +01:00
..
6lowpan
9p 9p: set req refcount to zero to avoid uninitialized usage 2022-12-31 13:26:52 +01:00
802 mrp: introduce active flags to prevent UAF when applicant uninit 2022-12-31 13:26:45 +01:00
8021q net: Remove the obsolte u64_stats_fetch_*_irq() users (net). 2022-12-31 13:26:12 +01:00
appletalk
atm net/atm: fix proc_mpc_write incorrect return value 2022-10-29 10:08:32 +02:00
ax25 net: avoid overflow when rose /proc displays timer information. 2022-08-05 19:00:02 -07:00
batman-adv batman-adv: Fix hang up with small MTU hard-interface 2022-08-20 14:17:45 +02:00
bluetooth Bluetooth: Add quirk to disable MWS Transport Configuration 2022-12-31 13:26:47 +01:00
bpf bpf: Move skb->len == 0 checks into __bpf_redirect 2022-12-31 13:26:00 +01:00
bpfilter
bridge net: Remove the obsolte u64_stats_fetch_*_irq() users (net). 2022-12-31 13:26:12 +01:00
caif net: caif: fix double disconnect client in chnl_net_open() 2022-11-26 09:27:35 +01:00
can can: af_can: fix NULL pointer dereference in can_rcv_filter 2022-12-14 11:40:56 +01:00
ceph libceph: clean up ceph_osdc_start_request prototype 2022-08-03 14:05:39 +02:00
core net: add atomic_long_t to net_device_stats fields 2022-12-31 13:26:44 +01:00
dcb
dccp dccp/tcp: Reset saddr on failure after inet6?_hash_connect(). 2022-12-02 17:43:08 +01:00
decnet dn_route: replace "jiffies-now>0" with "jiffies!=now" 2022-07-29 20:12:49 -07:00
dns_resolver
dsa net: dsa: tag_8021q: avoid leaking ctx on dsa_tag_8021q_register() error path 2022-12-31 13:26:15 +01:00
ethernet
ethtool ethtool: avoiding integer overflow in ethtool_phys_id() 2022-12-31 13:26:45 +01:00
hsr hsr: Synchronize sequence number updates. 2022-12-31 13:26:08 +01:00
ieee802154 net: ieee802154: fix error return code in dgram_bind() 2022-11-04 00:00:25 +09:00
ife
ipv4 net/tunnel: wait until all sk_user_data reader finish before releasing the sock 2022-12-31 13:26:13 +01:00
ipv6 ipv6/sit: use DEV_STATS_INC() to avoid data-races 2022-12-31 13:26:45 +01:00
iucv
kcm kcm: avoid potential race in kcm_tx_work 2022-11-26 09:27:54 +01:00
key xfrm: Fix oops in __xfrm_state_delete() 2022-12-02 17:43:07 +01:00
l2tp l2tp: l2tp_debugfs: fix Clang -Wformat warnings 2022-07-08 12:14:36 +01:00
l3mdev
lapb
llc
mac80211 net: Remove the obsolte u64_stats_fetch_*_irq() users (net). 2022-12-31 13:26:12 +01:00
mac802154 mac802154: fix missing INIT_LIST_HEAD in ieee802154_if_add() 2022-12-14 11:41:00 +01:00
mctp mctp: Remove device type check at unregister 2022-12-31 13:26:39 +01:00
mpls net: Remove the obsolte u64_stats_fetch_*_irq() users (net). 2022-12-31 13:26:12 +01:00
mptcp mptcp: fix sleep in atomic at close time 2022-12-08 11:30:17 +01:00
ncsi
netfilter netfilter: flowtable: really fix NAT IPv6 offload 2022-12-31 13:26:36 +01:00
netlabel netlabel: fix typo in comment 2022-08-10 09:24:41 +01:00
netlink netlink: Bounds-check struct nlmsgerr creation 2022-11-26 09:27:55 +01:00
netrom
nfc NFC: nci: Bounds check struct nfc_target arrays 2022-12-14 11:41:02 +01:00
nsh
openvswitch openvswitch: Fix flow lookup to use unmasked key 2022-12-31 13:26:39 +01:00
packet packet: do not set TP_STATUS_CSUM_VALID on CHECKSUM_COMPLETE 2022-12-08 11:30:18 +01:00
phonet
psample
qrtr net: qrtr: start MHI channel after endpoit creation 2022-08-15 11:21:42 +01:00
rds net: rds: don't hold sock lock when cancelling work from rds_tcp_reset_callbacks() 2022-10-21 12:38:20 +02:00
rfkill
rose rose: Fix NULL pointer dereference in rose_send_frame() 2022-11-10 18:17:19 +01:00
rxrpc rxrpc: Fix missing unlock in rxrpc_do_sendmsg() 2022-12-31 13:26:39 +01:00
sched net_sched: reject TCF_EM_SIMPLE case for complex ematch module 2022-12-31 13:26:39 +01:00
sctp sctp: sysctl: make extra pointers netns aware 2022-12-31 13:26:14 +01:00
smc net/smc: Fix possible leaked pernet namespace in smc_init() 2022-11-10 18:17:22 +01:00
strparser strparser: pad sk_skb_cb to avoid straddling cachelines 2022-07-08 18:38:44 -07:00
sunrpc SUNRPC: Fix missing release socket in rpc_sockname() 2022-12-31 13:26:09 +01:00
switchdev
tipc tipc: call tipc_lxc_xmit without holding node_read_lock 2022-12-14 11:41:04 +01:00
tls bpf, sockmap: Fix missing BPF_F_INGRESS flag when using apply_bytes 2022-12-31 13:26:06 +01:00
unix unix: Fix race in SOCK_SEQPACKET's unix_dgram_sendmsg() 2022-12-31 13:26:38 +01:00
vmw_vsock net: vmw_vsock: vmci: Check memcpy_from_msg() 2022-12-31 13:26:12 +01:00
wireless wifi: cfg80211: Fix not unregister reg_pdev when load_builtin_regdb_keys() fails 2022-12-31 13:26:06 +01:00
x25 net/x25: Fix skb leak in x25_lapb_receive_frame() 2022-11-26 09:27:38 +01:00
xdp xsk: Fix backpressure mechanism on Tx 2022-10-21 12:38:05 +02:00
xfrm xfrm: replay: Fix ESN wrap around for GSO 2022-12-02 17:43:02 +01:00
compat.c net: clear msg_get_inq in __get_compat_msghdr() 2022-09-20 08:23:20 -07:00
devres.c
Kconfig
Kconfig.debug
Makefile
socket.c net: Fix a data-race around sysctl_somaxconn. 2022-08-24 13:46:58 +01:00
sysctl_net.c