Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp4025770ybl; Mon, 3 Feb 2020 11:05:53 -0800 (PST) X-Google-Smtp-Source: APXvYqz1IvkCy5RJ+9wK7PLfBwAcZRCGHpFhRrLE7DdMVWYj6zy99F8vP1MEsPvRkbvDPYwKgINI X-Received: by 2002:a9d:32f:: with SMTP id 44mr18402142otv.234.1580756753056; Mon, 03 Feb 2020 11:05:53 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1580756753; cv=none; d=google.com; s=arc-20160816; b=Kfx/Aj814Ddvz7USVcfK+h8Dpx3I67PLsWrXYbw5+t/in2egzRc/jS5JFTYZAKcqVv pRBOKGvvey5VrTKCKLU/Rj/N8jzBymsGe3JmDjuAk4KxuhPYkzkBm3bkuq6VgO7Ttbp0 bIk6slejSAhJnR+4P/GCkpr+xIs6SCTq96cv7/i/m4mnNe3aKUWkHUEr6vpOjhBqP1HT GCk7G2Iza+Jf3mdNhoaeypwWFYXsjHoEAU5hcZwodDooJFmi2yQCDY7fMVLSXzg4m73a c4EPV7dvHOyVMSgSTcvQbXQQzVTEyw1+KgV3ONwcrppJU/Oezpy6UExOVG+40V9Esmv8 4S9w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=cVXdQDf87IDQTwMf6cwNbXCZdApSmET9Loab70LkFDU=; b=kxTLi1R93K60xyGFH3IkpDfl1Cip56tz3/9BoP9Aj+HEh9shIyQb6+GpNniYtHNvtx Tkk7OgINN9GXr2zPV/zv/dIZ4gCH94ITMRDGTKhf2FLdpfohssCrdqGjL8xsOjMKtUe8 SaAkhhwbrUFg/uu7sPzk8lcD2PEs5kMu25bkgrn/h3DpJKm5UKse+3IbpESlNkuuNrYv J8Lb1lhtp3vXobw7zxtDyr32U2nXBS87pHjOh/KvMB5qYUwLzc5f3mBUYBR5XmEOULvO 6piHiMPHp4ivP0aGaYZOZePmF+w1fK9/IWGvKACzLCqoCM+4DuSTdyUcHSwus/esF30j xgRg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=ufIo+vaY; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id e23si5738648oii.173.2020.02.03.11.05.41; Mon, 03 Feb 2020 11:05:53 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-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=@kernel.org header.s=default header.b=ufIo+vaY; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730200AbgBCQbX (ORCPT + 99 others); Mon, 3 Feb 2020 11:31:23 -0500 Received: from mail.kernel.org ([198.145.29.99]:44414 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730192AbgBCQbT (ORCPT ); Mon, 3 Feb 2020 11:31:19 -0500 Received: from localhost (unknown [104.132.45.99]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id A792121741; Mon, 3 Feb 2020 16:31:17 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1580747478; bh=/nOdczqKjWmmQm4bHY76A4S/KlufdHVq5oohak6Mrto=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ufIo+vaY5Bv1f3STLQAcjk0HGDT15u/5F5LkV+jUC4yDnh5GEzgEeZVv9UI7w23qr KwCF2UpjLH9QMU7QQxGhHunejSc2jutQrhP3D1OR+kj0cmYUbaET4A7VAID8GXUKN0 SsKzdFH0zfQL7mL73TOnwjgmSlZsP2mMe6y/obg0= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Reinette Chatre , Xiaochen Shen , Borislav Petkov , Tony Luck , Thomas Gleixner , Sasha Levin Subject: [PATCH 4.19 03/70] x86/resctrl: Fix use-after-free due to inaccurate refcount of rdtgroup Date: Mon, 3 Feb 2020 16:19:15 +0000 Message-Id: <20200203161912.772712580@linuxfoundation.org> X-Mailer: git-send-email 2.25.0 In-Reply-To: <20200203161912.158976871@linuxfoundation.org> References: <20200203161912.158976871@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Xiaochen Shen commit 074fadee59ee7a9d2b216e9854bd4efb5dad679f upstream. There is a race condition in the following scenario which results in an use-after-free issue when reading a monitoring file and deleting the parent ctrl_mon group concurrently: Thread 1 calls atomic_inc() to take refcount of rdtgrp and then calls kernfs_break_active_protection() to drop the active reference of kernfs node in rdtgroup_kn_lock_live(). In Thread 2, kernfs_remove() is a blocking routine. It waits on all sub kernfs nodes to drop the active reference when removing all subtree kernfs nodes recursively. Thread 2 could block on kernfs_remove() until Thread 1 calls kernfs_break_active_protection(). Only after kernfs_remove() completes the refcount of rdtgrp could be trusted. Before Thread 1 calls atomic_inc() and kernfs_break_active_protection(), Thread 2 could call kfree() when the refcount of rdtgrp (sentry) is 0 instead of 1 due to the race. In Thread 1, in rdtgroup_kn_unlock(), referring to earlier rdtgrp memory (rdtgrp->waitcount) which was already freed in Thread 2 results in use-after-free issue. Thread 1 (rdtgroup_mondata_show) Thread 2 (rdtgroup_rmdir) -------------------------------- ------------------------- rdtgroup_kn_lock_live /* * kn active protection until * kernfs_break_active_protection(kn) */ rdtgrp = kernfs_to_rdtgroup(kn) rdtgroup_kn_lock_live atomic_inc(&rdtgrp->waitcount) mutex_lock rdtgroup_rmdir_ctrl free_all_child_rdtgrp /* * sentry->waitcount should be 1 * but is 0 now due to the race. */ kfree(sentry)*[1] /* * Only after kernfs_remove() * completes, the refcount of * rdtgrp could be trusted. */ atomic_inc(&rdtgrp->waitcount) /* kn->active-- */ kernfs_break_active_protection(kn) rdtgroup_ctrl_remove rdtgrp->flags = RDT_DELETED /* * Blocking routine, wait for * all sub kernfs nodes to drop * active reference in * kernfs_break_active_protection. */ kernfs_remove(rdtgrp->kn) rdtgroup_kn_unlock mutex_unlock atomic_dec_and_test( &rdtgrp->waitcount) && (flags & RDT_DELETED) kernfs_unbreak_active_protection(kn) kfree(rdtgrp) mutex_lock mon_event_read rdtgroup_kn_unlock mutex_unlock /* * Use-after-free: refer to earlier rdtgrp * memory which was freed in [1]. */ atomic_dec_and_test(&rdtgrp->waitcount) && (flags & RDT_DELETED) /* kn->active++ */ kernfs_unbreak_active_protection(kn) kfree(rdtgrp) Fix it by moving free_all_child_rdtgrp() to after kernfs_remove() in rdtgroup_rmdir_ctrl() to ensure it has the accurate refcount of rdtgrp. Backporting notes: Since upstream commit fa7d949337cc ("x86/resctrl: Rename and move rdt files to a separate directory"), the file arch/x86/kernel/cpu/intel_rdt_rdtgroup.c has been renamed and moved to arch/x86/kernel/cpu/resctrl/rdtgroup.c. Apply the change against file arch/x86/kernel/cpu/intel_rdt_rdtgroup.c for older stable trees. Fixes: f3cbeacaa06e ("x86/intel_rdt/cqm: Add rmdir support") Suggested-by: Reinette Chatre Signed-off-by: Xiaochen Shen Signed-off-by: Borislav Petkov Reviewed-by: Reinette Chatre Reviewed-by: Tony Luck Acked-by: Thomas Gleixner Cc: stable@vger.kernel.org Link: https://lkml.kernel.org/r/1578500886-21771-3-git-send-email-xiaochen.shen@intel.com Signed-off-by: Sasha Levin --- arch/x86/kernel/cpu/intel_rdt_rdtgroup.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/x86/kernel/cpu/intel_rdt_rdtgroup.c b/arch/x86/kernel/cpu/intel_rdt_rdtgroup.c index db22ba0bf9167..77770caeea242 100644 --- a/arch/x86/kernel/cpu/intel_rdt_rdtgroup.c +++ b/arch/x86/kernel/cpu/intel_rdt_rdtgroup.c @@ -2877,13 +2877,13 @@ static int rdtgroup_rmdir_ctrl(struct kernfs_node *kn, struct rdtgroup *rdtgrp, closid_free(rdtgrp->closid); free_rmid(rdtgrp->mon.rmid); + rdtgroup_ctrl_remove(kn, rdtgrp); + /* * Free all the child monitor group rmids. */ free_all_child_rdtgrp(rdtgrp); - rdtgroup_ctrl_remove(kn, rdtgrp); - return 0; } -- 2.20.1