Received: by 2002:a05:6a10:6744:0:0:0:0 with SMTP id w4csp666156pxu; Wed, 7 Oct 2020 12:35:07 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwnPf9OWduz79Llzpu7pCHdpcfA9bRbL6kufBB6OnO55Wij3O1CiulP7lkfuKILrGb0N05h X-Received: by 2002:aa7:d690:: with SMTP id d16mr5383462edr.301.1602099307216; Wed, 07 Oct 2020 12:35:07 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1602099307; cv=none; d=google.com; s=arc-20160816; b=0nsmBk+LmV/0uyk+XLDFzUG1C1KEaT9E84w1vGmyl3dlVu2R1EljCg01Kk7e1UzcnH 62ZqMfBXEw7X+rHJ05IuVkYNdIDx1M3IdA/ZuR5WNF97O7q/d8mW3z2zMGALtE25WN+x Tr0PYevfa6FJcxyo5Q6IbTVwyn5NTowg7lY8WZNz40PW6eaqYxGSnogEs6bawXOOvpqm Wh24C82pTkRg+9Q/VDGD+MsolURD/Mk+W9hz6fpyIT1joSQ0UGvhPhpZ6zzgPnGFDWb+ D3SOm3DM/J4A3JH9GBu9hTkh50/f3OjWF5kRadwRJ4DlgxX4BHwL+uKRuTMB5YMNRchW 1OKQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:cc:to:subject :message-id:date:from:in-reply-to:references:mime-version :dkim-signature; bh=xxzMWzZDg+VcRWGQ/c2kzQrjqzz9Zr/vQmYEu/FEsRY=; b=mhbk8YUFNEwnx6EDaTiF/ZYeOBD0GUt44UY/sUTsgIO8FRqMgVZy3nAAwAHTGYVYPJ wnNnxoEbXQZdoYmseOkhnX53F9XvSjLFFRZtGOzgrz7WnDp9f094lSfiO+UH1k/kktYt QdlC/mueFVyVp8a9CULnoxT8vw9tWH5TtdUZvaY2d9FD63a2IQIXH6RKu16c5C0z8Dok Q3CBGeKSVnYYGNSeVlMLgSh4edZvFjQeCOyuxaizJSFlSKjijFcqKT0oJCqJnlP6mOA6 22Qfh2ZM9RKziLVRHh6q/YraI13HZZDyBUANvGajUntLHfScAWWB+9k1zaLWLTXlXS54 zLug== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@ffwll.ch header.s=google header.b=JHHbdSa3; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id l13si2030898eja.131.2020.10.07.12.34.44; Wed, 07 Oct 2020 12:35:07 -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=@ffwll.ch header.s=google header.b=JHHbdSa3; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728734AbgJGSKs (ORCPT + 99 others); Wed, 7 Oct 2020 14:10:48 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38028 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728656AbgJGSKr (ORCPT ); Wed, 7 Oct 2020 14:10:47 -0400 Received: from mail-ot1-x342.google.com (mail-ot1-x342.google.com [IPv6:2607:f8b0:4864:20::342]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E08BBC0613D4 for ; Wed, 7 Oct 2020 11:10:45 -0700 (PDT) Received: by mail-ot1-x342.google.com with SMTP id m13so3073480otl.9 for ; Wed, 07 Oct 2020 11:10:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ffwll.ch; s=google; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=xxzMWzZDg+VcRWGQ/c2kzQrjqzz9Zr/vQmYEu/FEsRY=; b=JHHbdSa3yjRCRnWpyNRhKKiSEOBUKxgo2tfjYtBvhCHpORb0ALeU5M+5x5K5yNzCHm lADTYYQR32EHxoVtfzUaalEzZmnDh6DAaDz8LEVrvhIFw/92GoGYNABw2nQYniRBDjZZ trEXtjVKX20MlR66/aUzrdTZc9L9Ye/bFneWk= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=xxzMWzZDg+VcRWGQ/c2kzQrjqzz9Zr/vQmYEu/FEsRY=; b=sI0zZYSKskN91wQsc9EXtKKXw183YGuu3SEse3JoyXPUQ7zUTA4FwYV/NtlPhGvLAY 8k6cUfUoUufe/TRl9hWL0yuYIpjGabFABD2JRfV39V/8ovMg2af0S7dOTkE2tICp/pqW TVAsDRAhWvdpREY56A9IWsJ6Uk1kfl4OkfxeLxAhycdZnImWRDvKyzIL4V8RRZ0AyotL xCZUfDffGgNXbp0oOhauoHckQD6d2S0InlecR4nEFDh0EFn3C/GXFKarg3YzNcbdSmQA 3Gqc7pWt7rBsmpYr/M5xUfKYttqZd4Z1/SYacSeVPbZYFZsj/lMy7iWEdioxy2PNesFg IPyw== X-Gm-Message-State: AOAM532xVOWHNtyR53GTICWutUFqoJNQQ5WLpg2MIZdu6ssfcT6nRJNI 9WQktIbzf0XwEDsdwv/ibVc6lGcxQYDY3jg7Q5w4jQ== X-Received: by 2002:a05:6830:1e56:: with SMTP id e22mr2510412otj.303.1602094245171; Wed, 07 Oct 2020 11:10:45 -0700 (PDT) MIME-Version: 1.0 References: <20201007164426.1812530-1-daniel.vetter@ffwll.ch> <20201007164426.1812530-12-daniel.vetter@ffwll.ch> <20201007173647.GW5177@ziepe.ca> In-Reply-To: <20201007173647.GW5177@ziepe.ca> From: Daniel Vetter Date: Wed, 7 Oct 2020 20:10:34 +0200 Message-ID: Subject: Re: [PATCH 11/13] mm: add unsafe_follow_pfn To: Jason Gunthorpe Cc: DRI Development , LKML , kvm@vger.kernel.org, Linux MM , Linux ARM , linux-samsung-soc , "open list:DMA BUFFER SHARING FRAMEWORK" , linux-s390@vger.kernel.org, Daniel Vetter , Kees Cook , Dan Williams , Andrew Morton , John Hubbard , =?UTF-8?B?SsOpcsO0bWUgR2xpc3Nl?= , Jan Kara Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, Oct 7, 2020 at 7:36 PM Jason Gunthorpe wrote: > > On Wed, Oct 07, 2020 at 06:44:24PM +0200, Daniel Vetter wrote: > > Way back it was a reasonable assumptions that iomem mappings never > > change the pfn range they point at. But this has changed: > > > > - gpu drivers dynamically manage their memory nowadays, invalidating > > ptes with unmap_mapping_range when buffers get moved > > > > - contiguous dma allocations have moved from dedicated carvetouts to > > cma regions. This means if we miss the unmap the pfn might contain > > pagecache or anon memory (well anything allocated with GFP_MOVEABLE) > > > > - even /dev/mem now invalidates mappings when the kernel requests that > > iomem region when CONFIG_IO_STRICT_DEVMEM is set, see 3234ac664a87 > > ("/dev/mem: Revoke mappings when a driver claims the region") > > > > Accessing pfns obtained from ptes without holding all the locks is > > therefore no longer a good idea. > > > > Unfortunately there's some users where this is not fixable (like v4l > > userptr of iomem mappings) or involves a pile of work (vfio type1 > > iommu). For now annotate these as unsafe and splat appropriately. > > > > This patch adds an unsafe_follow_pfn, which later patches will then > > roll out to all appropriate places. > > > > Signed-off-by: Daniel Vetter > > Cc: Jason Gunthorpe > > Cc: Kees Cook > > Cc: Dan Williams > > Cc: Andrew Morton > > Cc: John Hubbard > > Cc: J=C3=A9r=C3=B4me Glisse > > Cc: Jan Kara > > Cc: Dan Williams > > Cc: linux-mm@kvack.org > > Cc: linux-arm-kernel@lists.infradead.org > > Cc: linux-samsung-soc@vger.kernel.org > > Cc: linux-media@vger.kernel.org > > Cc: kvm@vger.kernel.org > > --- > > include/linux/mm.h | 2 ++ > > mm/memory.c | 32 +++++++++++++++++++++++++++++++- > > mm/nommu.c | 17 +++++++++++++++++ > > security/Kconfig | 13 +++++++++++++ > > 4 files changed, 63 insertions(+), 1 deletion(-) > > Makes sense to me. > > I wonder if we could change the original follow_pfn to require the > ptep and then lockdep_assert_held() it against the page table lock? The safe variant with the pagetable lock is follow_pte_pmd. The only way to make follow_pfn safe is if you have an mmu notifier and corresponding retry logic. That is not covered by lockdep (it would splat if we annotate the retry side), so I'm not sure how you'd check for that? Checking for ptep lock doesn't work here, since the one leftover safe user of this (kvm) doesn't need that at all, because it has the mmu notifier. Also follow_pte_pmd will splat with lockdep if you get it wrong, since the function leaves you with the right ptlock lock when it returns. If you forget to unlock that, lockdep will complain. So I think we're as good as it gets, since I really have no idea how to make sure follow_pfn callers do have an mmu notifier registered. > > +int unsafe_follow_pfn(struct vm_area_struct *vma, unsigned long addres= s, > > + unsigned long *pfn) > > +{ > > +#ifdef CONFIG_STRICT_FOLLOW_PFN > > + pr_info("unsafe follow_pfn usage rejected, see > > CONFIG_STRICT_FOLLOW_PFN\n"); > > Wonder if we can print something useful here, like the current > PID/process name? Yeah adding comm/pid here makes sense. > > diff --git a/security/Kconfig b/security/Kconfig > > index 7561f6f99f1d..48945402e103 100644 > > --- a/security/Kconfig > > +++ b/security/Kconfig > > @@ -230,6 +230,19 @@ config STATIC_USERMODEHELPER_PATH > > If you wish for all usermode helper programs to be disabled, > > specify an empty string here (i.e. ""). > > > > +config STRICT_FOLLOW_PFN > > + bool "Disable unsafe use of follow_pfn" > > + depends on MMU > > I would probably invert this CONFIG_ALLOW_UNSAFE_FOLLOW_PFN > default n I've followed the few other CONFIG_STRICT_FOO I've seen, which are all explicit enables and default to "do not break uapi, damn the (security) bugs". Which is I think how this should be done. It is in the security section though, so hopefully competent distros will enable this all. -Daniel --=20 Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch