Received: by 2002:a05:6a10:9848:0:0:0:0 with SMTP id x8csp3416809pxf; Mon, 22 Mar 2021 06:06:03 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwh32EDsruqIDhRcZyHsp9u9A+RX2Kap6YBQo24G/zGm+qE2SYrwFzdVYiq/uv2MW8DIl3p X-Received: by 2002:a17:906:789:: with SMTP id l9mr19133920ejc.161.1616418363687; Mon, 22 Mar 2021 06:06:03 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1616418363; cv=none; d=google.com; s=arc-20160816; b=gCq6Am70de69m5E2A1bFPp5WOqfhO898hcz3KeDOEhDgTEtgCyJweCcvPxC43qyDYL sRewx9C/+9IN77ms0WpvT65Bhv8uFePS2bzwtoTrjdKcoOOSmlinxVieNzkRALkcDhKB Vpm70VLs5Tg18ovdMAIIcUEQDO+oK9Ye1gsCPo4p+qub/RisTP4aEQ8BCs3ClpZQOf1f kiRaIt33ZAGoqhtSV0KUOtVkWinJOiNsxlwFnbrjNV10FmpAvO9EUHLOR/K4/1EPctKl kRqgoY6F3BBOlm+u8ZQ45RjVcSYjX0WBmeTgUEjIXYqUTSQcJ6Q03jPYQT+pZrKiXFz8 1Cfw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=cDKRF+G+T2pw+zxgMcnlEALsxqQp178l8FXtsw/mvvM=; b=oCnp3PUdzY4VEcQsukaRNjOfYTXPN0EouRWIJAYnpPv4NlzCvfNYXV5pnAJupDS8SZ V+jWilms9lDC6JLtlrKQjnF+y1rKdc8KJAisp9zozDNERVl9wt6gbejZMHOvn4+v+t3u D+OT+Hke1Bq6UDQaMamvjgrqtD+5F5mV/FrhkuSQmQVXRxCZoC9VMzo3qSXsLP4HCym4 +qxJSCpV79Gshm3frXyM2AtyGo9z4XSD33lukThOrU1MFI60VqaN4nS1cfLSspsJTi58 JGcobWzqo6PwOx+xKHgOHM3hmuCpUDz/Uy6xq0p3f/zxcOJ596KyGb/37QaukCI5xOCn lCOA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=mU64tzOE; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id n19si10827376edd.382.2021.03.22.06.05.40; Mon, 22 Mar 2021 06:06:03 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=mU64tzOE; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233100AbhCVNCb (ORCPT + 99 others); Mon, 22 Mar 2021 09:02:31 -0400 Received: from mail.kernel.org ([198.145.29.99]:42228 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232079AbhCVMtM (ORCPT ); Mon, 22 Mar 2021 08:49:12 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 146CA619BB; Mon, 22 Mar 2021 12:44:54 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1616417095; bh=5CLMZ6hsQslgJCuiwHVZOGTlk0Bs8K3PYaGdmWMkCpE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=mU64tzOEZbrulFxCN3IRQ8mVMe+FkWBywI4AXI+H09jbjEjxOOmAWquId4DbitXbv etalmbsEoJ5rG74cQogGLcxd2hTfGQ2gqETXzTBbs/qFagiOncg3c1IZaWh2wfgjmr +PFyjGCIRoizGtLSWLV/QbrS3X+WKmU/xPZzWrxY= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Jim Lin , Macpaul Lin Subject: [PATCH 4.19 25/43] usb: gadget: configfs: Fix KASAN use-after-free Date: Mon, 22 Mar 2021 13:28:39 +0100 Message-Id: <20210322121920.736064792@linuxfoundation.org> X-Mailer: git-send-email 2.31.0 In-Reply-To: <20210322121919.936671417@linuxfoundation.org> References: <20210322121919.936671417@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Jim Lin commit 98f153a10da403ddd5e9d98a3c8c2bb54bb5a0b6 upstream. When gadget is disconnected, running sequence is like this. . composite_disconnect . Call trace: usb_string_copy+0xd0/0x128 gadget_config_name_configuration_store+0x4 gadget_config_name_attr_store+0x40/0x50 configfs_write_file+0x198/0x1f4 vfs_write+0x100/0x220 SyS_write+0x58/0xa8 . configfs_composite_unbind . configfs_composite_bind In configfs_composite_bind, it has "cn->strings.s = cn->configuration;" When usb_string_copy is invoked. it would allocate memory, copy input string, release previous pointed memory space, and use new allocated memory. When gadget is connected, host sends down request to get information. Call trace: usb_gadget_get_string+0xec/0x168 lookup_string+0x64/0x98 composite_setup+0xa34/0x1ee8 If gadget is disconnected and connected quickly, in the failed case, cn->configuration memory has been released by usb_string_copy kfree but configfs_composite_bind hasn't been run in time to assign new allocated "cn->configuration" pointer to "cn->strings.s". When "strlen(s->s) of usb_gadget_get_string is being executed, the dangling memory is accessed, "BUG: KASAN: use-after-free" error occurs. Cc: stable@vger.kernel.org Signed-off-by: Jim Lin Signed-off-by: Macpaul Lin Link: https://lore.kernel.org/r/1615444961-13376-1-git-send-email-macpaul.lin@mediatek.com Signed-off-by: Greg Kroah-Hartman --- drivers/usb/gadget/configfs.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) --- a/drivers/usb/gadget/configfs.c +++ b/drivers/usb/gadget/configfs.c @@ -109,6 +109,8 @@ struct gadget_config_name { struct list_head list; }; +#define USB_MAX_STRING_WITH_NULL_LEN (USB_MAX_STRING_LEN+1) + static int usb_string_copy(const char *s, char **s_copy) { int ret; @@ -118,12 +120,16 @@ static int usb_string_copy(const char *s if (ret > USB_MAX_STRING_LEN) return -EOVERFLOW; - str = kstrdup(s, GFP_KERNEL); - if (!str) - return -ENOMEM; + if (copy) { + str = copy; + } else { + str = kmalloc(USB_MAX_STRING_WITH_NULL_LEN, GFP_KERNEL); + if (!str) + return -ENOMEM; + } + strcpy(str, s); if (str[ret - 1] == '\n') str[ret - 1] = '\0'; - kfree(copy); *s_copy = str; return 0; }