Received: by 2002:a05:7412:8d10:b0:f3:1519:9f41 with SMTP id bj16csp5231709rdb; Wed, 13 Dec 2023 02:58:11 -0800 (PST) X-Google-Smtp-Source: AGHT+IHUYJ2UmE4ixtp59KYlrDh1N0kNhPb5R91GA63dsMJjmohKcBok/lHaBl3ayYOZeahoMQ/Q X-Received: by 2002:a05:6871:54c:b0:1fa:fee1:6f1e with SMTP id t12-20020a056871054c00b001fafee16f1emr7839631oal.10.1702465091169; Wed, 13 Dec 2023 02:58:11 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1702465091; cv=none; d=google.com; s=arc-20160816; b=E96zp3cOFWr5NdiGGllYvJSqs3oyYjuiGQDq0/eTTZ908BawiPRPcHK9K14dTYHRdM 4EqbVjhuqlpzGqfNGG+UYndP4ERfh3lzYo15Kk3B+5PJG5f5jrmUXXUb/tGh9ZQauebJ 1CdANtUXp/0olSz/Jyxh97n/zLE585iwfOha/3eZEKKcnTOeQRiD9M+ff+gwyXZ3kdaE hfzDM0n6cD+meWNA4Bmte2cjGuqFD+yrE+O5zB/K95SvSIEXMLBcV8YPTzMP44VLjEJg DWq252rJU+58kjCWcE5oMqzIWiGR0969jPR6JKDlqWeWhedKDXIT2yE/frCUrgCs+5xh zmrg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:message-id:date:subject:cc:to:from; bh=bw/Q0cX8QAQiKRzIaA4RDiYJIdMLzpFrnLOb/4iZuTc=; fh=pVMoaus5yz0JjShlAqwCGxUcQhZI/lEVhurRolFZIhU=; b=AtALiuv2EYFsHZ8RO/p5YkYiTOmwsvFkYgVGkxtWN1B5/tHjxQW+tYWtbGA5rTqh/O ISzq3XjM0SYYHWap0TFi8pnulEOXY30lh3Vywy8TuBpOL+J+vRY+tv8hO6laskgnSfWM AXzTBzLr99ijMxtK4IFFOzKd+/M7FuYq8j6nGgI7aruWYDn7kzYsQLzHOP2+O6X1L234 iofybWsXU4zC05iO+Ue5pC0/QMmZwHtl1UBz/V0hciqATd69yAaD1NDC7bmfpF66VzwJ JCTxWle+m2IRRCl9aABiTkvuUiKfrZ9K6WKmTFdnxgw3bF1yPTNj3SK52gI3HiljUQmy uKZg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:2 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=sangfor.com.cn Return-Path: Received: from agentk.vger.email (agentk.vger.email. [2620:137:e000::3:2]) by mx.google.com with ESMTPS id y3-20020a17090a86c300b0028649cc70b2si10740091pjv.14.2023.12.13.02.58.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 13 Dec 2023 02:58:11 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:2 as permitted sender) client-ip=2620:137:e000::3:2; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:2 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=sangfor.com.cn Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by agentk.vger.email (Postfix) with ESMTP id 9BF1380B31F6; Wed, 13 Dec 2023 02:58:05 -0800 (PST) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.11 at agentk.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1377992AbjLMK5m (ORCPT + 99 others); Wed, 13 Dec 2023 05:57:42 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54362 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1377980AbjLMK5l (ORCPT ); Wed, 13 Dec 2023 05:57:41 -0500 X-Greylist: delayed 468 seconds by postgrey-1.37 at lindbergh.monkeyblade.net; Wed, 13 Dec 2023 02:57:45 PST Received: from mail-m49225.qiye.163.com (mail-m49225.qiye.163.com [45.254.49.225]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1F88E9C; Wed, 13 Dec 2023 02:57:44 -0800 (PST) Received: from localhost.localdomain (unknown [IPV6:240e:3b7:3270:b440:d83b:6c2e:b6f:d27e]) by mail-m12741.qiye.163.com (Hmail) with ESMTPA id 66C609E05CD; Wed, 13 Dec 2023 18:49:29 +0800 (CST) From: Ke Xiao To: jesse.brandeburg@intel.com, anthony.l.nguyen@intel.com, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com Cc: dinghui@sangfor.com.cn, zhudi2@huawei.com, intel-wired-lan@lists.osuosl.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Ke Xiao Subject: [net PATCH] i40e: fix use-after-free in i40e_aqc_add_filters() Date: Wed, 13 Dec 2023 18:49:11 +0800 Message-Id: <20231213104912.16153-1-xiaoke@sangfor.com.cn> X-Mailer: git-send-email 2.17.1 X-HM-Spam-Status: e1kfGhgUHx5ZQUpXWQgPGg8OCBgUHx5ZQUlOS1dZFg8aDwILHllBWSg2Ly tZV1koWUFITzdXWS1ZQUlXWQ8JGhUIEh9ZQVkZGh4ZVklOQhlMGE5JGhlCSFUTARMWGhIXJBQOD1 lXWRgSC1lBWUlPSx5BSBlMQUhJTEtBGU9PS0EfQ0gZQU0YSR5BGU0dQR9JTB5ZV1kWGg8SFR0UWU FZT0tIVUpNT0lMTlVKS0tVSkJLS1kG X-HM-Tid: 0a8c62cbc175b214kuuu66c609e05cd X-HM-MType: 1 X-HM-Sender-Digest: e1kMHhlZQR0aFwgeV1kSHx4VD1lBWUc6N006ERw5GDw3Sj1DDgwjDR9N EzowCyNVSlVKTEtJT01PTkxLT0lLVTMWGhIXVQMSGhQQHjsIGhUcHRQJVRgUFlUYFUVZV1kSC1lB WUlPSx5BSBlMQUhJTEtBGU9PS0EfQ0gZQU0YSR5BGU0dQR9JTB5ZV1kIAVlBT05PTjcG X-Spam-Status: No, score=-0.8 required=5.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on agentk.vger.email Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (agentk.vger.email [0.0.0.0]); Wed, 13 Dec 2023 02:58:05 -0800 (PST) Commit 3116f59c12bd ("i40e: fix use-after-free in i40e_sync_filters_subtask()") avoided use-after-free issues, by increasing refcount during update the VSI filter list to the HW. However, it missed the unicast situation. When deleting an unicast FDB entry, the i40e driver will release the mac_filter, and i40e_service_task will concurrently request firmware to add the mac_filter, which will lead to the following use-after-free issue. Fix again for both netdev->uc and netdev->mc. BUG: KASAN: use-after-free in i40e_aqc_add_filters+0x55c/0x5b0 [i40e] Read of size 2 at addr ffff888eb3452d60 by task kworker/8:7/6379 CPU: 8 PID: 6379 Comm: kworker/8:7 Kdump: loaded Tainted: G Workqueue: i40e i40e_service_task [i40e] Call Trace: dump_stack+0x71/0xab print_address_description+0x6b/0x290 kasan_report+0x14a/0x2b0 i40e_aqc_add_filters+0x55c/0x5b0 [i40e] i40e_sync_vsi_filters+0x1676/0x39c0 [i40e] i40e_service_task+0x1397/0x2bb0 [i40e] process_one_work+0x56a/0x11f0 worker_thread+0x8f/0xf40 kthread+0x2a0/0x390 ret_from_fork+0x1f/0x40 Allocated by task 21948: kasan_kmalloc+0xa6/0xd0 kmem_cache_alloc_trace+0xdb/0x1c0 i40e_add_filter+0x11e/0x520 [i40e] i40e_addr_sync+0x37/0x60 [i40e] __hw_addr_sync_dev+0x1f5/0x2f0 i40e_set_rx_mode+0x61/0x1e0 [i40e] dev_uc_add_excl+0x137/0x190 i40e_ndo_fdb_add+0x161/0x260 [i40e] rtnl_fdb_add+0x567/0x950 rtnetlink_rcv_msg+0x5db/0x880 netlink_rcv_skb+0x254/0x380 netlink_unicast+0x454/0x610 netlink_sendmsg+0x747/0xb00 sock_sendmsg+0xe2/0x120 __sys_sendto+0x1ae/0x290 __x64_sys_sendto+0xdd/0x1b0 do_syscall_64+0xa0/0x370 entry_SYSCALL_64_after_hwframe+0x65/0xca Freed by task 21948: __kasan_slab_free+0x137/0x190 kfree+0x8b/0x1b0 __i40e_del_filter+0x116/0x1e0 [i40e] i40e_del_mac_filter+0x16c/0x300 [i40e] i40e_addr_unsync+0x134/0x1b0 [i40e] __hw_addr_sync_dev+0xff/0x2f0 i40e_set_rx_mode+0x61/0x1e0 [i40e] dev_uc_del+0x77/0x90 rtnl_fdb_del+0x6a5/0x860 rtnetlink_rcv_msg+0x5db/0x880 netlink_rcv_skb+0x254/0x380 netlink_unicast+0x454/0x610 netlink_sendmsg+0x747/0xb00 sock_sendmsg+0xe2/0x120 __sys_sendto+0x1ae/0x290 __x64_sys_sendto+0xdd/0x1b0 do_syscall_64+0xa0/0x370 entry_SYSCALL_64_after_hwframe+0x65/0xca Fixes: 3116f59c12bd ("i40e: fix use-after-free in i40e_sync_filters_subtask()") Fixes: 41c445ff0f48 ("i40e: main driver core") Signed-off-by: Ke Xiao Signed-off-by: Ding Hui Cc: Di Zhu --- drivers/net/ethernet/intel/i40e/i40e_main.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c index 1ab8dbe2d880..16b574d69843 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_main.c +++ b/drivers/net/ethernet/intel/i40e/i40e_main.c @@ -108,11 +108,17 @@ static void netdev_hw_addr_refcnt(struct i40e_mac_filter *f, struct net_device *netdev, int delta) { struct netdev_hw_addr *ha; + struct netdev_hw_addr_list *ha_list; if (!f || !netdev) return; - netdev_for_each_mc_addr(ha, netdev) { + if (is_unicast_ether_addr(f->macaddr) || is_link_local_ether_addr(f->macaddr)) + ha_list = &netdev->uc; + else + ha_list = &netdev->mc; + + netdev_hw_addr_list_for_each(ha, ha_list) { if (ether_addr_equal(ha->addr, f->macaddr)) { ha->refcount += delta; if (ha->refcount <= 0) -- 2.17.1