All of lore.kernel.org
 help / color / mirror / Atom feed
From: George Kennedy <george.kennedy@oracle.com>
To: Andrey Konovalov <andreyknvl@google.com>
Cc: David Hildenbrand <david@redhat.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	Catalin Marinas <catalin.marinas@arm.com>,
	Vincenzo Frascino <vincenzo.frascino@arm.com>,
	Dmitry Vyukov <dvyukov@google.com>,
	Konrad Rzeszutek Wilk <konrad@darnok.org>,
	Will Deacon <will.deacon@arm.com>,
	Andrey Ryabinin <aryabinin@virtuozzo.com>,
	Alexander Potapenko <glider@google.com>,
	Marco Elver <elver@google.com>,
	Peter Collingbourne <pcc@google.com>,
	Evgenii Stepanov <eugenis@google.com>,
	Branislav Rankov <Branislav.Rankov@arm.com>,
	Kevin Brodsky <kevin.brodsky@arm.com>,
	Christoph Hellwig <hch@infradead.org>,
	kasan-dev <kasan-dev@googlegroups.com>,
	Linux ARM <linux-arm-kernel@lists.infradead.org>,
	Linux Memory Management List <linux-mm@kvack.org>,
	LKML <linux-kernel@vger.kernel.org>,
	Dhaval Giani <dhaval.giani@oracle.com>
Subject: Re: [PATCH] mm, kasan: don't poison boot memory
Date: Fri, 19 Feb 2021 18:04:23 -0500	[thread overview]
Message-ID: <797fae72-e3ea-c0b0-036a-9283fa7f2317@oracle.com> (raw)
In-Reply-To: <c7166cae-bf89-8bdd-5849-72b5949fc6cc@oracle.com>



On 2/19/2021 11:45 AM, George Kennedy wrote:
>
>
> On 2/18/2021 7:09 PM, Andrey Konovalov wrote:
>> On Fri, Feb 19, 2021 at 1:06 AM George Kennedy
>> <george.kennedy@oracle.com> wrote:
>>>
>>>
>>> On 2/18/2021 3:55 AM, David Hildenbrand wrote:
>>>> On 17.02.21 21:56, Andrey Konovalov wrote:
>>>>> During boot, all non-reserved memblock memory is exposed to the buddy
>>>>> allocator. Poisoning all that memory with KASAN lengthens boot time,
>>>>> especially on systems with large amount of RAM. This patch makes
>>>>> page_alloc to not call kasan_free_pages() on all new memory.
>>>>>
>>>>> __free_pages_core() is used when exposing fresh memory during system
>>>>> boot and when onlining memory during hotplug. This patch adds a new
>>>>> FPI_SKIP_KASAN_POISON flag and passes it to __free_pages_ok() through
>>>>> free_pages_prepare() from __free_pages_core().
>>>>>
>>>>> This has little impact on KASAN memory tracking.
>>>>>
>>>>> Assuming that there are no references to newly exposed pages 
>>>>> before they
>>>>> are ever allocated, there won't be any intended (but buggy) 
>>>>> accesses to
>>>>> that memory that KASAN would normally detect.
>>>>>
>>>>> However, with this patch, KASAN stops detecting wild and large
>>>>> out-of-bounds accesses that happen to land on a fresh memory page 
>>>>> that
>>>>> was never allocated. This is taken as an acceptable trade-off.
>>>>>
>>>>> All memory allocated normally when the boot is over keeps getting
>>>>> poisoned as usual.
>>>>>
>>>>> Signed-off-by: Andrey Konovalov <andreyknvl@google.com>
>>>>> Change-Id: Iae6b1e4bb8216955ffc14af255a7eaaa6f35324d
>>>> Not sure this is the right thing to do, see
>>>>
>>>> https://lkml.kernel.org/r/bcf8925d-0949-3fe1-baa8-cc536c529860@oracle.com 
>>>>
>>>>
>>>> Reversing the order in which memory gets allocated + used during boot
>>>> (in a patch by me) might have revealed an invalid memory access during
>>>> boot.
>>>>
>>>> I suspect that that issue would no longer get detected with your
>>>> patch, as the invalid memory access would simply not get detected.
>>>> Now, I cannot prove that :)
>>> Since David's patch we're having trouble with the iBFT ACPI table, 
>>> which
>>> is mapped in via kmap() - see acpi_map() in "drivers/acpi/osl.c". KASAN
>>> detects that it is being used after free when ibft_init() accesses the
>>> iBFT table, but as of yet we can't find where it get's freed (we've
>>> instrumented calls to kunmap()).
>> Maybe it doesn't get freed, but what you see is a wild or a large
>> out-of-bounds access. Since KASAN marks all memory as freed during the
>> memblock->page_alloc transition, such bugs can manifest as
>> use-after-frees.
>
> It gets freed and re-used. By the time the iBFT table is accessed by 
> ibft_init() the page has been over-written.
>
> Setting page flags like the following before the call to kmap() 
> prevents the iBFT table page from being freed:

Cleaned up version:

diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c
index 0418feb..8f0a8e7 100644
--- a/drivers/acpi/osl.c
+++ b/drivers/acpi/osl.c
@@ -287,9 +287,12 @@ static void __iomem *acpi_map(acpi_physical_address 
pg_off, unsigned long pg_sz)

      pfn = pg_off >> PAGE_SHIFT;
      if (should_use_kmap(pfn)) {
+        struct page *page = pfn_to_page(pfn);
+
          if (pg_sz > PAGE_SIZE)
              return NULL;
-        return (void __iomem __force *)kmap(pfn_to_page(pfn));
+        SetPageReserved(page);
+        return (void __iomem __force *)kmap(page);
      } else
          return acpi_os_ioremap(pg_off, pg_sz);
  }
@@ -299,9 +302,12 @@ static void acpi_unmap(acpi_physical_address 
pg_off, void __iomem *vaddr)
      unsigned long pfn;

      pfn = pg_off >> PAGE_SHIFT;
-    if (should_use_kmap(pfn))
-        kunmap(pfn_to_page(pfn));
-    else
+    if (should_use_kmap(pfn)) {
+        struct page *page = pfn_to_page(pfn);
+
+        ClearPageReserved(page);
+        kunmap(page);
+    } else
          iounmap(vaddr);
  }

David, the above works, but wondering why it is now necessary. kunmap() 
is not hit. What other ways could a page mapped via kmap() be unmapped?

Thank you,
George

>
> diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c
> index 0418feb..41c1bbd 100644
> --- a/drivers/acpi/osl.c
> +++ b/drivers/acpi/osl.c
> @@ -287,9 +287,14 @@ static void __iomem 
> *acpi_map(acpi_physical_address pg_off, unsigned long pg_sz)
>
>         pfn = pg_off >> PAGE_SHIFT;
>         if (should_use_kmap(pfn)) {
> +               struct page *page =  pfn_to_page(pfn);
> +
>                 if (pg_sz > PAGE_SIZE)
>                         return NULL;
> -               return (void __iomem __force *)kmap(pfn_to_page(pfn));
> +
> +               page->flags |= ((1UL << PG_unevictable) | (1UL << 
> PG_reserved) | (1UL << PG_locked));
> +
> +               return (void __iomem __force *)kmap(page);
>         } else
>                 return acpi_os_ioremap(pg_off, pg_sz);
>  }
>
> Just not sure of the correct way to set the page flags.
>
> George
>


WARNING: multiple messages have this Message-ID (diff)
From: George Kennedy <george.kennedy@oracle.com>
To: Andrey Konovalov <andreyknvl@google.com>
Cc: Linux ARM <linux-arm-kernel@lists.infradead.org>,
	Marco Elver <elver@google.com>,
	Dhaval Giani <dhaval.giani@oracle.com>,
	David Hildenbrand <david@redhat.com>,
	Catalin Marinas <catalin.marinas@arm.com>,
	Kevin Brodsky <kevin.brodsky@arm.com>,
	Will Deacon <will.deacon@arm.com>,
	Branislav Rankov <Branislav.Rankov@arm.com>,
	kasan-dev <kasan-dev@googlegroups.com>,
	LKML <linux-kernel@vger.kernel.org>,
	Christoph Hellwig <hch@infradead.org>,
	Linux Memory Management List <linux-mm@kvack.org>,
	Alexander Potapenko <glider@google.com>,
	Evgenii Stepanov <eugenis@google.com>,
	Andrey Ryabinin <aryabinin@virtuozzo.com>,
	Konrad Rzeszutek Wilk <konrad@darnok.org>,
	Andrew Morton <akpm@linux-foundation.org>,
	Vincenzo Frascino <vincenzo.frascino@arm.com>,
	Peter Collingbourne <pcc@google.com>,
	Dmitry Vyukov <dvyukov@google.com>
Subject: Re: [PATCH] mm, kasan: don't poison boot memory
Date: Fri, 19 Feb 2021 18:04:23 -0500	[thread overview]
Message-ID: <797fae72-e3ea-c0b0-036a-9283fa7f2317@oracle.com> (raw)
In-Reply-To: <c7166cae-bf89-8bdd-5849-72b5949fc6cc@oracle.com>



On 2/19/2021 11:45 AM, George Kennedy wrote:
>
>
> On 2/18/2021 7:09 PM, Andrey Konovalov wrote:
>> On Fri, Feb 19, 2021 at 1:06 AM George Kennedy
>> <george.kennedy@oracle.com> wrote:
>>>
>>>
>>> On 2/18/2021 3:55 AM, David Hildenbrand wrote:
>>>> On 17.02.21 21:56, Andrey Konovalov wrote:
>>>>> During boot, all non-reserved memblock memory is exposed to the buddy
>>>>> allocator. Poisoning all that memory with KASAN lengthens boot time,
>>>>> especially on systems with large amount of RAM. This patch makes
>>>>> page_alloc to not call kasan_free_pages() on all new memory.
>>>>>
>>>>> __free_pages_core() is used when exposing fresh memory during system
>>>>> boot and when onlining memory during hotplug. This patch adds a new
>>>>> FPI_SKIP_KASAN_POISON flag and passes it to __free_pages_ok() through
>>>>> free_pages_prepare() from __free_pages_core().
>>>>>
>>>>> This has little impact on KASAN memory tracking.
>>>>>
>>>>> Assuming that there are no references to newly exposed pages 
>>>>> before they
>>>>> are ever allocated, there won't be any intended (but buggy) 
>>>>> accesses to
>>>>> that memory that KASAN would normally detect.
>>>>>
>>>>> However, with this patch, KASAN stops detecting wild and large
>>>>> out-of-bounds accesses that happen to land on a fresh memory page 
>>>>> that
>>>>> was never allocated. This is taken as an acceptable trade-off.
>>>>>
>>>>> All memory allocated normally when the boot is over keeps getting
>>>>> poisoned as usual.
>>>>>
>>>>> Signed-off-by: Andrey Konovalov <andreyknvl@google.com>
>>>>> Change-Id: Iae6b1e4bb8216955ffc14af255a7eaaa6f35324d
>>>> Not sure this is the right thing to do, see
>>>>
>>>> https://lkml.kernel.org/r/bcf8925d-0949-3fe1-baa8-cc536c529860@oracle.com 
>>>>
>>>>
>>>> Reversing the order in which memory gets allocated + used during boot
>>>> (in a patch by me) might have revealed an invalid memory access during
>>>> boot.
>>>>
>>>> I suspect that that issue would no longer get detected with your
>>>> patch, as the invalid memory access would simply not get detected.
>>>> Now, I cannot prove that :)
>>> Since David's patch we're having trouble with the iBFT ACPI table, 
>>> which
>>> is mapped in via kmap() - see acpi_map() in "drivers/acpi/osl.c". KASAN
>>> detects that it is being used after free when ibft_init() accesses the
>>> iBFT table, but as of yet we can't find where it get's freed (we've
>>> instrumented calls to kunmap()).
>> Maybe it doesn't get freed, but what you see is a wild or a large
>> out-of-bounds access. Since KASAN marks all memory as freed during the
>> memblock->page_alloc transition, such bugs can manifest as
>> use-after-frees.
>
> It gets freed and re-used. By the time the iBFT table is accessed by 
> ibft_init() the page has been over-written.
>
> Setting page flags like the following before the call to kmap() 
> prevents the iBFT table page from being freed:

Cleaned up version:

diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c
index 0418feb..8f0a8e7 100644
--- a/drivers/acpi/osl.c
+++ b/drivers/acpi/osl.c
@@ -287,9 +287,12 @@ static void __iomem *acpi_map(acpi_physical_address 
pg_off, unsigned long pg_sz)

      pfn = pg_off >> PAGE_SHIFT;
      if (should_use_kmap(pfn)) {
+        struct page *page = pfn_to_page(pfn);
+
          if (pg_sz > PAGE_SIZE)
              return NULL;
-        return (void __iomem __force *)kmap(pfn_to_page(pfn));
+        SetPageReserved(page);
+        return (void __iomem __force *)kmap(page);
      } else
          return acpi_os_ioremap(pg_off, pg_sz);
  }
@@ -299,9 +302,12 @@ static void acpi_unmap(acpi_physical_address 
pg_off, void __iomem *vaddr)
      unsigned long pfn;

      pfn = pg_off >> PAGE_SHIFT;
-    if (should_use_kmap(pfn))
-        kunmap(pfn_to_page(pfn));
-    else
+    if (should_use_kmap(pfn)) {
+        struct page *page = pfn_to_page(pfn);
+
+        ClearPageReserved(page);
+        kunmap(page);
+    } else
          iounmap(vaddr);
  }

David, the above works, but wondering why it is now necessary. kunmap() 
is not hit. What other ways could a page mapped via kmap() be unmapped?

Thank you,
George

>
> diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c
> index 0418feb..41c1bbd 100644
> --- a/drivers/acpi/osl.c
> +++ b/drivers/acpi/osl.c
> @@ -287,9 +287,14 @@ static void __iomem 
> *acpi_map(acpi_physical_address pg_off, unsigned long pg_sz)
>
>         pfn = pg_off >> PAGE_SHIFT;
>         if (should_use_kmap(pfn)) {
> +               struct page *page =  pfn_to_page(pfn);
> +
>                 if (pg_sz > PAGE_SIZE)
>                         return NULL;
> -               return (void __iomem __force *)kmap(pfn_to_page(pfn));
> +
> +               page->flags |= ((1UL << PG_unevictable) | (1UL << 
> PG_reserved) | (1UL << PG_locked));
> +
> +               return (void __iomem __force *)kmap(page);
>         } else
>                 return acpi_os_ioremap(pg_off, pg_sz);
>  }
>
> Just not sure of the correct way to set the page flags.
>
> George
>


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

  reply	other threads:[~2021-02-19 23:06 UTC|newest]

Thread overview: 93+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-02-17 20:56 [PATCH] mm, kasan: don't poison boot memory Andrey Konovalov
2021-02-17 20:56 ` Andrey Konovalov
2021-02-17 20:56 ` Andrey Konovalov
2021-02-18  8:55 ` David Hildenbrand
2021-02-18  8:55   ` David Hildenbrand
2021-02-18 19:40   ` Andrey Konovalov
2021-02-18 19:40     ` Andrey Konovalov
2021-02-18 19:40     ` Andrey Konovalov
2021-02-18 19:46     ` David Hildenbrand
2021-02-18 19:46       ` David Hildenbrand
2021-02-18 20:26       ` Andrey Konovalov
2021-02-18 20:26         ` Andrey Konovalov
2021-02-18 20:26         ` Andrey Konovalov
2021-02-19  0:06   ` George Kennedy
2021-02-19  0:06     ` George Kennedy
2021-02-19  0:09     ` Andrey Konovalov
2021-02-19  0:09       ` Andrey Konovalov
2021-02-19  0:09       ` Andrey Konovalov
2021-02-19 16:45       ` George Kennedy
2021-02-19 16:45         ` George Kennedy
2021-02-19 23:04         ` George Kennedy [this message]
2021-02-19 23:04           ` George Kennedy
2021-02-22  9:52           ` David Hildenbrand
2021-02-22  9:52             ` David Hildenbrand
2021-02-22 15:13             ` George Kennedy
2021-02-22 15:13               ` George Kennedy
2021-02-22 16:13               ` David Hildenbrand
2021-02-22 16:13                 ` David Hildenbrand
2021-02-22 16:39                 ` David Hildenbrand
2021-02-22 16:39                   ` David Hildenbrand
2021-02-22 17:40                   ` Konrad Rzeszutek Wilk
2021-02-22 17:40                     ` Konrad Rzeszutek Wilk
2021-02-22 18:45                     ` Mike Rapoport
2021-02-22 18:45                       ` Mike Rapoport
2021-02-22 18:42                 ` George Kennedy
2021-02-22 18:42                   ` George Kennedy
2021-02-22 21:55                   ` Mike Rapoport
2021-02-22 21:55                     ` Mike Rapoport
     [not found]                     ` <9773282a-2854-25a4-9faa-9da5dd34e371@oracle.com>
2021-02-23 10:33                       ` Mike Rapoport
2021-02-23 10:33                         ` Mike Rapoport
     [not found]                         ` <3ef9892f-d657-207f-d4cf-111f98dcb55c@oracle.com>
2021-02-23 15:47                           ` Mike Rapoport
2021-02-23 15:47                             ` Mike Rapoport
2021-02-23 18:05                             ` George Kennedy
2021-02-23 18:05                               ` George Kennedy
2021-02-23 20:09                               ` Mike Rapoport
2021-02-23 20:09                                 ` Mike Rapoport
2021-02-23 21:16                                 ` George Kennedy
2021-02-23 21:32                                   ` Mike Rapoport
2021-02-23 21:32                                     ` Mike Rapoport
2021-02-23 21:46                                     ` George Kennedy
2021-02-23 21:46                                       ` George Kennedy
2021-02-24 10:37                                       ` Mike Rapoport
2021-02-24 10:37                                         ` Mike Rapoport
2021-02-24 14:22                                         ` George Kennedy
2021-02-24 14:22                                           ` George Kennedy
2021-02-25  8:53                                           ` Mike Rapoport
2021-02-25  8:53                                             ` Mike Rapoport
2021-02-25 12:38                                             ` George Kennedy
2021-02-25 12:38                                               ` George Kennedy
2021-02-25 14:57                                               ` Mike Rapoport
2021-02-25 14:57                                                 ` Mike Rapoport
2021-02-25 15:22                                                 ` George Kennedy
2021-02-25 15:22                                                   ` George Kennedy
2021-02-25 16:06                                                   ` George Kennedy
2021-02-25 16:06                                                     ` George Kennedy
2021-02-25 16:07                                                   ` Mike Rapoport
2021-02-25 16:07                                                     ` Mike Rapoport
2021-02-25 16:31                                                     ` George Kennedy
2021-02-25 16:31                                                       ` George Kennedy
2021-02-25 17:23                                                       ` David Hildenbrand
2021-02-25 17:23                                                         ` David Hildenbrand
2021-02-25 17:41                                                         ` Mike Rapoport
2021-02-25 17:41                                                           ` Mike Rapoport
2021-02-25 17:50                                                       ` Mike Rapoport
2021-02-25 17:50                                                         ` Mike Rapoport
2021-02-25 17:33                                                     ` George Kennedy
2021-02-25 17:33                                                       ` George Kennedy
2021-02-26  1:19                                                       ` George Kennedy
2021-02-26  1:19                                                         ` George Kennedy
2021-02-26 11:17                                                         ` Mike Rapoport
2021-02-26 11:17                                                           ` Mike Rapoport
2021-02-26 16:16                                                           ` George Kennedy
2021-02-26 16:16                                                             ` George Kennedy
2021-02-28 18:08                                                             ` Mike Rapoport
2021-02-28 18:08                                                               ` Mike Rapoport
2021-03-01 14:29                                                               ` George Kennedy
2021-03-01 14:29                                                                 ` George Kennedy
2021-03-02  1:20                                                                 ` George Kennedy
2021-03-02  1:20                                                                   ` George Kennedy
2021-03-02  9:57                                                                   ` Mike Rapoport
2021-03-02  9:57                                                                     ` Mike Rapoport
2021-02-23 21:26                                 ` George Kennedy
2021-02-23 21:26                                   ` George Kennedy

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=797fae72-e3ea-c0b0-036a-9283fa7f2317@oracle.com \
    --to=george.kennedy@oracle.com \
    --cc=Branislav.Rankov@arm.com \
    --cc=akpm@linux-foundation.org \
    --cc=andreyknvl@google.com \
    --cc=aryabinin@virtuozzo.com \
    --cc=catalin.marinas@arm.com \
    --cc=david@redhat.com \
    --cc=dhaval.giani@oracle.com \
    --cc=dvyukov@google.com \
    --cc=elver@google.com \
    --cc=eugenis@google.com \
    --cc=glider@google.com \
    --cc=hch@infradead.org \
    --cc=kasan-dev@googlegroups.com \
    --cc=kevin.brodsky@arm.com \
    --cc=konrad@darnok.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=pcc@google.com \
    --cc=vincenzo.frascino@arm.com \
    --cc=will.deacon@arm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.