Received: by 2002:a25:7ec1:0:0:0:0:0 with SMTP id z184csp3169883ybc; Thu, 21 Nov 2019 04:27:40 -0800 (PST) X-Google-Smtp-Source: APXvYqzG79aR6O4xxCS6azQYxzA0b01HyYCRE6qZfrculjsLjGID8SfjiUf+Xviq5MSDVaE2g9Uj X-Received: by 2002:a17:906:3d2:: with SMTP id c18mr13498004eja.111.1574339260682; Thu, 21 Nov 2019 04:27:40 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1574339260; cv=none; d=google.com; s=arc-20160816; b=0e0qSyy8CzFeO9ZHlO9IhdCaTMG+FaEmvBaAPDr33CGZRstmmnWEDuhdZ9VjNM3wBV bDpXwgUp+O8WesZLWn1rXG8qzSgG2NkSCZTAJ4Ilnzaj4kJIHHQMiklQ5YkaIIYdm04w +1DibRtBkq0S50EG6tU/Lr10CjYvSQJEXVDp/vn7JYdAbzdWr/F8QMlk6CNuE88xU+wD EUSFxD/wmi/jc5LHH3caj02UFkA+5uVSJMDijWe8lhHLbHSPdKosdzriDF6klbubmOv1 dmiZVf/iKKcGPpshO2ExgX2hMAGgRRKPh/62pCtIg8w6ycV7pdb5EwxkN2DLOiudItno u6mQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from :dkim-signature; bh=l4zxaX3dCTmnygo5S9CarIvrQkRw+UBri7v/F60fCec=; b=fTmkx5dirZYEP+HakIsVOKAbYLMIzwRsMZBECmZFRqhUKPbPKNW/hYOj2OEmCSY++z icImAlYIN2Xjc5yk7+snD+Ewdhrg0lFjh3d9iNClBz7CtD7sc3YYqbBQxtM0majL39O8 HkjUZgqB7O18s6G5stohvTQZX4N/EZj6A0X4v4MS3s84My2iAemhTTJ62amX1nwXYaP4 JMCfC9muQ1emvSMKeHJ8P+JRO1Yku4SzfPu8lkL6BR3u5nX8dFH2QOss9g7i8FGdm1k2 Bfy5HHYmtWc8jTh501Qz2F5Ra00ex4ofCWoF6nMeVx+oNqYMTcgKt6QvydLYFBcVVuA0 3NaA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=hcl0q7x5; spf=pass (google.com: best guess record for domain of linux-wireless-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-wireless-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id mj25si1639663ejb.198.2019.11.21.04.27.09; Thu, 21 Nov 2019 04:27:40 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-wireless-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=hcl0q7x5; spf=pass (google.com: best guess record for domain of linux-wireless-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-wireless-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726342AbfKUM05 (ORCPT + 99 others); Thu, 21 Nov 2019 07:26:57 -0500 Received: from mail-pj1-f68.google.com ([209.85.216.68]:33704 "EHLO mail-pj1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726197AbfKUM05 (ORCPT ); Thu, 21 Nov 2019 07:26:57 -0500 Received: by mail-pj1-f68.google.com with SMTP id o14so1414059pjr.0 for ; Thu, 21 Nov 2019 04:26:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=l4zxaX3dCTmnygo5S9CarIvrQkRw+UBri7v/F60fCec=; b=hcl0q7x5X1qA35RxcWfoWFvLi9heSUGL+7alt8/6XjJVA6MdDthG8g2d4uPFSbikZA 7YVlbVpP3Z194jpdtJosDIYuDF714KvlkvE1bEWlWp5lKKZ1ZhXcY59LgjBETsXQ8tsW IOTsMzktGlremmz4bWJP0z0ijz7V1bnbJ7Sav3bvRJuNep39iPjtLiEm/JYPBOWeuMk7 bWfMAnLbyEFRMS3MQN1Xcg1qw1T0ZP6i9EFDgJIRo4LbQKmuNkMqpbH0wfnQig8Rde85 jZFvhgXtGvb3rvqtxjR8Zwh0M+Em589eJPagPy0vC+4fpuyfDsp4fdhVnfXilmXCSOeG ZGog== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=l4zxaX3dCTmnygo5S9CarIvrQkRw+UBri7v/F60fCec=; b=sQhxNbrVWD8UKo6DaJl1DMJqZsBtRoFIDLE2ruzvnW5N3g1TtFrnJoNKG7JLEsPbjD GQUCdrAXkDa2jE96brfRNFdwaPKyqD663nWAP2FVoil2hTVEr9EFX+scEqcLeltUmnZt L5mWBX6Y6GoLBGGaEoSgvC4dPUJFQL/hWfI8ckQL5PK1DwxsjMDUFkkZ9rHvfoXYNsXY UBAgOl8l0Kzvdo5nJ5ChUWTJM3Nz4c60+RP13w8V5z7AERIAxERySWK1tvmfReVe0/iH j+bR83LzoORbs98iGGy5LxgmweRnlm7gzqBHTi0YxRj6ycBN9FvbI+L4/+sNqLFgjSgZ FNpg== X-Gm-Message-State: APjAAAVrzW5BDK9kP7Ok1aA/uWf5IVPkW7PBg2sFxluW7n/mVSFPTxxT ybVps/vmFQxNdpindaGg+KLM9fWM X-Received: by 2002:a17:90a:aa8f:: with SMTP id l15mr11225847pjq.52.1574339216458; Thu, 21 Nov 2019 04:26:56 -0800 (PST) Received: from localhost.localdomain ([110.35.161.54]) by smtp.gmail.com with ESMTPSA id t27sm3518671pfq.169.2019.11.21.04.26.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 21 Nov 2019 04:26:55 -0800 (PST) From: Taehee Yoo To: johannes@sipsolutions.net, kvalo@codeaurora.org, linux-wireless@vger.kernel.org Cc: ap420073@gmail.com Subject: [PATCH mac80211] virt_wifi: fix use-after-free in virt_wifi_newlink() Date: Thu, 21 Nov 2019 12:26:45 +0000 Message-Id: <20191121122645.9355-1-ap420073@gmail.com> X-Mailer: git-send-email 2.17.1 Sender: linux-wireless-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org When virt_wifi interface is created, virt_wifi_newlink() is called and it calls register_netdevice(). if register_netdevice() fails, it internally would call ->priv_destructor(), which is virt_wifi_net_device_destructor() and it frees netdev. but virt_wifi_newlink() still use netdev. So, use-after-free would occur in virt_wifi_newlink(). Test commands: ip link add dummy0 type dummy modprobe bonding ip link add bonding_masters link dummy0 type virt_wifi Splat looks like: [ 202.220554] BUG: KASAN: use-after-free in virt_wifi_newlink+0x88b/0x9a0 [virt_wifi] [ 202.221659] Read of size 8 at addr ffff888061629cb8 by task ip/852 [ 202.222896] CPU: 1 PID: 852 Comm: ip Not tainted 5.4.0-rc5 #3 [ 202.223765] Hardware name: innotek GmbH VirtualBox/VirtualBox, BIOS VirtualBox 12/01/2006 [ 202.225073] Call Trace: [ 202.225532] dump_stack+0x7c/0xbb [ 202.226073] ? virt_wifi_newlink+0x88b/0x9a0 [virt_wifi] [ 202.226869] print_address_description.constprop.5+0x1be/0x360 [ 202.227759] ? virt_wifi_newlink+0x88b/0x9a0 [virt_wifi] [ 202.228550] ? virt_wifi_newlink+0x88b/0x9a0 [virt_wifi] [ 202.229362] __kasan_report+0x12a/0x16f [ 202.229980] ? virt_wifi_newlink+0x88b/0x9a0 [virt_wifi] [ 202.230714] kasan_report+0xe/0x20 [ 202.232595] virt_wifi_newlink+0x88b/0x9a0 [virt_wifi] [ 202.233370] __rtnl_newlink+0xb9f/0x11b0 [ 202.233929] ? rtnl_link_unregister+0x220/0x220 [ 202.234668] ? lock_acquire+0x164/0x3b0 [ 202.235344] ? rtnl_newlink+0x4c/0x90 [ 202.235923] ? is_bpf_text_address+0x86/0xf0 [ 202.236588] ? kernel_text_address+0x111/0x120 [ 202.237291] ? __lock_acquire+0xdfe/0x3de0 [ 202.237834] ? __kernel_text_address+0xe/0x30 [ 202.238414] ? unwind_get_return_address+0x5f/0xa0 [ 202.239207] ? create_prof_cpu_mask+0x20/0x20 [ 202.240163] ? arch_stack_walk+0x83/0xb0 [ 202.240916] ? stack_trace_save+0x82/0xb0 [ 202.241640] ? stack_trace_consume_entry+0x160/0x160 [ 202.242595] ? rtnl_newlink+0x4c/0x90 [ 202.243499] ? kasan_unpoison_shadow+0x30/0x40 [ 202.244192] ? kmem_cache_alloc_trace+0x12c/0x320 [ 202.244909] rtnl_newlink+0x65/0x90 [ ... ] Fixes: c7cdba31ed8b ("mac80211-next: rtnetlink wifi simulation device") Signed-off-by: Taehee Yoo --- drivers/net/wireless/virt_wifi.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/net/wireless/virt_wifi.c b/drivers/net/wireless/virt_wifi.c index 7997cc6de334..01305ba2d3aa 100644 --- a/drivers/net/wireless/virt_wifi.c +++ b/drivers/net/wireless/virt_wifi.c @@ -450,7 +450,6 @@ static void virt_wifi_net_device_destructor(struct net_device *dev) */ kfree(dev->ieee80211_ptr); dev->ieee80211_ptr = NULL; - free_netdev(dev); } /* No lock interaction. */ @@ -458,7 +457,7 @@ static void virt_wifi_setup(struct net_device *dev) { ether_setup(dev); dev->netdev_ops = &virt_wifi_ops; - dev->priv_destructor = virt_wifi_net_device_destructor; + dev->needs_free_netdev = true; } /* Called in a RCU read critical section from netif_receive_skb */ @@ -544,6 +543,7 @@ static int virt_wifi_newlink(struct net *src_net, struct net_device *dev, goto unregister_netdev; } + dev->priv_destructor = virt_wifi_net_device_destructor; priv->being_deleted = false; priv->is_connected = false; priv->is_up = false; -- 2.17.1