Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2631BC433EF for ; Wed, 8 Dec 2021 09:35:07 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230272AbhLHJih (ORCPT ); Wed, 8 Dec 2021 04:38:37 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57196 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229449AbhLHJig (ORCPT ); Wed, 8 Dec 2021 04:38:36 -0500 Received: from mail-oi1-x22f.google.com (mail-oi1-x22f.google.com [IPv6:2607:f8b0:4864:20::22f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A862AC061746 for ; Wed, 8 Dec 2021 01:35:04 -0800 (PST) Received: by mail-oi1-x22f.google.com with SMTP id q25so3462252oiw.0 for ; Wed, 08 Dec 2021 01:35:04 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=K4h8BNPE5Daxrg+r8GD8bDmKBbuZ/lfdXaIzv9x6f8s=; b=Rd8OE1d+TXrV8PEo0x3cJPjD0IZ+NgfQ4rTH1KI9bYmyEylK+w6dsmOGH6/LB32wVk XVDcsBqgnMqLSeKingfjnSsjL+Nqe/Dz+uxaOECegTK2KJqA2YMTQyDd3iGSjacJxw8e QyNG6ZR9sokoyIYKr7kz5LkIWkkYLdMXeOSlqEG3OVAmnutXrIMU0lKVV27QYZZSnnmQ Odq5ghW7V31yfVZoDhwohqsr2df814A6XIQPgJqgI89L3cRum5fbSvF8g+A6LGKZGgSs cTq5wnatwGXHAQM/orChkksHUAdI9xi7Qf13Ff+dyb5IqGFKWmmmYT0brNQKTWKYFGi7 3xrg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=K4h8BNPE5Daxrg+r8GD8bDmKBbuZ/lfdXaIzv9x6f8s=; b=hrXLtNES8qQNERaBJjJKQLvbk3uwv8qsREKROSYVDiiqpmIhb4QBD2JYJhrYpysjmQ ThJ4dvt0xpn6+cEYpLIFEP5Sf9ZfUxlUBXut+yjx5K+QXx9iVrJfp/8B/HtusKeDNu43 r+FFMkf/xpD+Cy+KpG1hIdJ0Qry91M6X3Ha0zi2aiIBub97K4M4LjMmU0v+cnRXM6UM1 Ggy+WbzRbr2wzLntOf+MdQc+3iBHIAy8X2esXsc2zGsXN7luepZICx/H/ydHm1NoKZCO v2NqD3Zeu7ni7K1GLNZDmcIfOvXPXNRyMkQcsvZnU+k7KoyhobQe8fd+szLp5pclTjlf x/lw== X-Gm-Message-State: AOAM532wY26HRtPl0UeI+JIU24c8lE8oAUZyyeF2bQuGVEH67IJ1yMqS YIxcMg3FN8LTeHhgr8fHQf9Sf+8xiuQ0C4H+dgkeqg== X-Google-Smtp-Source: ABdhPJxGRWzQ61Nu5mi3BAMA70mJOk2GPQbwnH1PfNkGi2oCFHiNW4WHkD1qoadUaJzqSyKlASX7gSHxWaDZqP3qwMs= X-Received: by 2002:a05:6808:ec9:: with SMTP id q9mr10252468oiv.160.1638956103721; Wed, 08 Dec 2021 01:35:03 -0800 (PST) MIME-Version: 1.0 References: <20211208044808.872554-1-pcc@google.com> <20211208044808.872554-4-pcc@google.com> In-Reply-To: <20211208044808.872554-4-pcc@google.com> From: Dmitry Vyukov Date: Wed, 8 Dec 2021 10:34:52 +0100 Message-ID: Subject: Re: [PATCH v3 3/6] fs: use copy_from_user_nolog() to copy mount() data To: Peter Collingbourne Cc: Catalin Marinas , Will Deacon , Ingo Molnar , Peter Zijlstra , Juri Lelli , Vincent Guittot , Dietmar Eggemann , Steven Rostedt , Ben Segall , Mel Gorman , Daniel Bristot de Oliveira , Thomas Gleixner , Andy Lutomirski , Kees Cook , Andrew Morton , Masahiro Yamada , Sami Tolvanen , YiFei Zhu , Mark Rutland , Frederic Weisbecker , Viresh Kumar , Andrey Konovalov , Gabriel Krisman Bertazi , Chris Hyser , Daniel Vetter , Chris Wilson , Arnd Bergmann , Christian Brauner , "Eric W. Biederman" , Alexey Gladkov , Ran Xiaokai , David Hildenbrand , Xiaofeng Cao , Cyrill Gorcunov , Thomas Cedeno , Marco Elver , Alexander Potapenko , linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Evgenii Stepanov Content-Type: text/plain; charset="UTF-8" Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, 8 Dec 2021 at 05:48, Peter Collingbourne wrote: > > With uaccess logging the contract is that the kernel must not report > accessing more data than necessary, as this can lead to false positive > reports in downstream consumers. This generally works out of the box > when instrumenting copy_{from,to}_user(), but with the data argument > to mount() we use copy_from_user() to copy PAGE_SIZE bytes (or as > much as we can, if the PAGE_SIZE sized access failed) and figure out > later how much we actually need. > > To prevent this from leading to a false positive report, use > copy_from_user_nolog(), which will prevent the access from being logged. > Recall that it is valid for the kernel to report accessing less > data than it actually accessed, as uaccess logging is a best-effort > mechanism for reporting uaccesses. > > Link: https://linux-review.googlesource.com/id/I5629b92a725c817acd9a861288338dd605cafee6 > Signed-off-by: Peter Collingbourne > --- > fs/namespace.c | 8 +++++++- > 1 file changed, 7 insertions(+), 1 deletion(-) > > diff --git a/fs/namespace.c b/fs/namespace.c > index 659a8f39c61a..8f5f2aaca64e 100644 > --- a/fs/namespace.c > +++ b/fs/namespace.c > @@ -31,6 +31,7 @@ > #include > #include > #include > +#include > > #include "pnode.h" > #include "internal.h" > @@ -3197,7 +3198,12 @@ static void *copy_mount_options(const void __user * data) > if (!copy) > return ERR_PTR(-ENOMEM); > > - left = copy_from_user(copy, data, PAGE_SIZE); > + /* > + * Use copy_from_user_nolog to avoid reporting overly large accesses in > + * the uaccess buffer, as this can lead to false positive reports in > + * downstream consumers. > + */ > + left = copy_from_user_nolog(copy, data, PAGE_SIZE); A late idea... Maybe it's better to log them with a new UACCESS_BUFFER_FLAG_OVERREAD flag. Better for user-space, at least can detect UAFs by checking the first byte. And a more logical kernel annotation (maybe will be used in some other tools? or if we ever check user tags in the kernel). Probably not too important today since we use this only in 2 places, but longer term may be better. Btw, what's the story with BPF accesses? Can we log them theoretically? Previously the comment said: + /* + * Avoid copy_from_user() here as it may leak information about the BPF + * program to userspace via the uaccess buffer. + */ but now it says something very generic: /* * Avoid logging uaccesses here as the BPF program may not be following * the uaccess log rules. */ > /* > * Not all architectures have an exact copy_from_user(). Resort to > -- > 2.34.1.173.g76aa8bc2d0-goog