Received: by 2002:a05:6a10:9848:0:0:0:0 with SMTP id x8csp3411198pxf; Mon, 22 Mar 2021 05:59:48 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxKh49Tx/D1IiM2evC5f/edLCZxYHbmq7luLavc0mkbtdf6rmE+zDuR9KOeILNBY+0HUSgp X-Received: by 2002:a17:907:2d24:: with SMTP id gs36mr19080707ejc.344.1616417988252; Mon, 22 Mar 2021 05:59:48 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1616417988; cv=none; d=google.com; s=arc-20160816; b=RJxK5kCi/xC1mW1JDpKg8W16pQ7u+rNM7da/I2tBYqzEPxARexg/yKVv9esInW+hTP Mea8mQjDRWBsbLuWI+Mxk/o4FK0sdfOcFNx/RHTH9crbbhttSYxCz1fxDAT2GPDatdYQ sWd5/xonBXmnDj0E0KXnNfAowPHG9IloC9ZOdDVSOgUnCEX7dxvOj5iFM4hykbitq1dg GQc74F5EPbcJNFLbAaWf3FfF14GLVu8izWi4bpBARgUNswZWmz74ksYk7q8Bji8AtTUv X4uyeJK+J9WKRHzU01Uf/aOIr1o297MpkSLmG2wzoyhd6x4BvlPe19h8zAqVOkdWjOdS sqgw== 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=sCIBwiy8SOyvQE0qjGIiq1HpZ5tvNofqv6FJ9aaXyWMh41c361GjpoksfJgCI8ut08 aOH+vOXNF3rSsMg5NqEz2jnOzOwpwxpZUMfXl+n0Sdmc9YWVVNxrKw1IQiHvhlRcr+EB DB2Yj/kgWsMmcFOR7mJGBMgXbtawqRvUXOgiQwD1V0vpv1B4m9KqhTnT1/l6o4ecizQG nlNaslHzg7BijzuLVfnAikrxCyrynyGeKA2pSs7dRUzGuFTycSTB0mlxqfRQdoch2SvT 9hKiFzWOSTlhbo8SxP25I3BQ+9z6AqXdCGk+0K0My6D+oBCSJOA2cwWKeG5beqeiq+lQ bbtg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=TpXIa7iE; 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 m5si11168620ejn.599.2021.03.22.05.59.25; Mon, 22 Mar 2021 05:59:48 -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=TpXIa7iE; 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 S233082AbhCVM5n (ORCPT + 99 others); Mon, 22 Mar 2021 08:57:43 -0400 Received: from mail.kernel.org ([198.145.29.99]:40974 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230053AbhCVMqy (ORCPT ); Mon, 22 Mar 2021 08:46:54 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 649F9619AC; Mon, 22 Mar 2021 12:42:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1616416970; bh=5CLMZ6hsQslgJCuiwHVZOGTlk0Bs8K3PYaGdmWMkCpE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=TpXIa7iEvdByyJBjYRJreUZSh351lYdXDs1sgHafM4lMQlorqPGpNUXXs7rJ4z3f6 Erx6Ma4+MS1rYEv1uKZFR8y+QKtt0xoJusbxot0gr59yrxzcrnLPS3z6ELJUDrnOcz M2Ay2d8FRC7TAr9kFIO6kB1CXEU8C2PuqCI5X9n4= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Jim Lin , Macpaul Lin Subject: [PATCH 5.4 37/60] usb: gadget: configfs: Fix KASAN use-after-free Date: Mon, 22 Mar 2021 13:28:25 +0100 Message-Id: <20210322121923.614953633@linuxfoundation.org> X-Mailer: git-send-email 2.31.0 In-Reply-To: <20210322121922.372583154@linuxfoundation.org> References: <20210322121922.372583154@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; }