Received: by 2002:a05:6a10:9848:0:0:0:0 with SMTP id x8csp3425387pxf; Mon, 22 Mar 2021 06:15:52 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwP0XZtstboG/4BMZc9ht8p8H5FHGiydn+6mPuyGtpWAE/3UTRJnVBHzp7FpOf0qnFziQlV X-Received: by 2002:a17:906:cecc:: with SMTP id si12mr19346801ejb.461.1616418952007; Mon, 22 Mar 2021 06:15:52 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1616418952; cv=none; d=google.com; s=arc-20160816; b=wa+vKvw7YomJVWRw9I97B0zoBAGRQbxm013EAYOt+7O4F4FrtMWX+7Z1eu+bQ8ij3d HrrxyyNI2zU9k5Xyiv3V6AFQcmT1Iv3WU/MeJRTCzwnPa/hjn8tai/hvMNlASogm/cjh BmJaac76s7s3GwektGMUywcqzyAcH1rPsHnzswJoQeEkuegkEuguXng+tnObFao6LOEx S6QbUMSu1yJb0pL11cI9bLIjij3IWlxb7r7vHr2ZuD6eRdxZpcFJVBVzA/PyHPhYC43I qTRv6TSnnvt4wi18fmnDwSLh1xQcVslw05LcHz1UmOCX91ynpm4VE4XZPmM746yvw8tn OFXQ== 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=RJ4drr9Me2pbfnc1MjdNLstqz64XQZLO0AHKp3pzyY0=; b=wEwti5LOEzNLrTp8+8OT8DMzFMoq40+49ATc4eoTrigjHlV8UWJnLs+gvH9HgNXqT+ eMh3c7oR2dSv/pD5Un7Fd01cxQ31Xg89iIy6S2a3dHZWxTMGFeeZrqNpCZOHZFKt39pq JV+M+SyzOEWmWuzlz1ym46xlOePWn/RhmrPjGkq10qtuWwUfjGD1LSBgwv125A/QWtvQ CUjTM85Z9vE9RyS2l0F/sA7xe9qfRtzkwklf8pNeLlQ2rWjSRh029nq0unt0MaxgmFYa tm9RF5eDWnl9FWaxV4am/yulKQVq3mzN8MxUd5vEToLRY6Ev2awTuLBUq6FZ2mL5SaG1 +XsA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=rB7wgB2r; 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 q9si11217537edd.324.2021.03.22.06.15.29; Mon, 22 Mar 2021 06:15:51 -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=rB7wgB2r; 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 S233362AbhCVNMw (ORCPT + 99 others); Mon, 22 Mar 2021 09:12:52 -0400 Received: from mail.kernel.org ([198.145.29.99]:50788 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233139AbhCVM5u (ORCPT ); Mon, 22 Mar 2021 08:57:50 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 8A2BD619CE; Mon, 22 Mar 2021 12:49:31 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1616417372; bh=4pFxx4rMxuBoUPuVMrFp0AgtI8un1hBGqp/YItu6Fzg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=rB7wgB2rNZAOkobn9shqPzaAEy6TaCH5OZvtmSXXXamp5AMha+9LJjZlrIXAzKaZx +iFpPCBdsXB5jeasiRACVGJ2vRHxcTEqhDoMTyTxF+R1m2akXO7e3uY+6IJI62lEZn tEKosEcDPpq7ERTFKYFr4u8VegoF36OpAdgaeu44= 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.14 26/43] usb: gadget: configfs: Fix KASAN use-after-free Date: Mon, 22 Mar 2021 13:29:07 +0100 Message-Id: <20210322121920.875820228@linuxfoundation.org> X-Mailer: git-send-email 2.31.0 In-Reply-To: <20210322121920.053255560@linuxfoundation.org> References: <20210322121920.053255560@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 @@ -108,6 +108,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; @@ -117,12 +119,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; }