From: Feng Tang <feng.tang@intel.com>
To: Andrey Konovalov <andreyknvl@gmail.com>
Cc: Andrew Morton <akpm@linux-foundation.org>,
Vlastimil Babka <vbabka@suse.cz>,
Christoph Lameter <cl@linux.com>,
Pekka Enberg <penberg@kernel.org>,
David Rientjes <rientjes@google.com>,
Joonsoo Kim <iamjoonsoo.kim@lge.com>,
Roman Gushchin <roman.gushchin@linux.dev>,
Hyeonggon Yoo <42.hyeyoo@gmail.com>,
Dmitry Vyukov <dvyukov@google.com>,
Jonathan Corbet <corbet@lwn.net>,
"Hansen, Dave" <dave.hansen@intel.com>,
Linux Memory Management List <linux-mm@kvack.org>,
LKML <linux-kernel@vger.kernel.org>,
kasan-dev <kasan-dev@googlegroups.com>
Subject: Re: [PATCH v5 4/4] mm/slub: extend redzone check to extra allocated kmalloc space than requested
Date: Sun, 11 Sep 2022 12:10:01 +0800 [thread overview]
Message-ID: <Yx1fmSyCNDwDgfqk@feng-clx> (raw)
In-Reply-To: <CA+fCnZfLCe8fhQ5UAyF1LwZuMCfbsoEXDmX3deaW6i_E5UE60g@mail.gmail.com>
On Sun, Sep 11, 2022 at 07:12:05AM +0800, Andrey Konovalov wrote:
> On Wed, Sep 7, 2022 at 9:11 AM Feng Tang <feng.tang@intel.com> wrote:
> >
> > kmalloc will round up the request size to a fixed size (mostly power
> > of 2), so there could be a extra space than what is requested, whose
> > size is the actual buffer size minus original request size.
> >
> > To better detect out of bound access or abuse of this space, add
> > redzone sanity check for it.
> >
> > And in current kernel, some kmalloc user already knows the existence
> > of the space and utilizes it after calling 'ksize()' to know the real
> > size of the allocated buffer. So we skip the sanity check for objects
> > which have been called with ksize(), as treating them as legitimate
> > users.
> >
> > Suggested-by: Vlastimil Babka <vbabka@suse.cz>
> > Signed-off-by: Feng Tang <feng.tang@intel.com>
> > ---
> > mm/slab.h | 4 ++++
> > mm/slab_common.c | 4 ++++
> > mm/slub.c | 57 +++++++++++++++++++++++++++++++++++++++++++++---
> > 3 files changed, 62 insertions(+), 3 deletions(-)
> >
> > diff --git a/mm/slab.h b/mm/slab.h
> > index 20f9e2a9814f..0bc91b30b031 100644
> > --- a/mm/slab.h
> > +++ b/mm/slab.h
> > @@ -885,4 +885,8 @@ void __check_heap_object(const void *ptr, unsigned long n,
> > }
> > #endif
> >
> > +#ifdef CONFIG_SLUB_DEBUG
> > +void skip_orig_size_check(struct kmem_cache *s, const void *object);
> > +#endif
> > +
> > #endif /* MM_SLAB_H */
> > diff --git a/mm/slab_common.c b/mm/slab_common.c
> > index 8e13e3aac53f..5106667d6adb 100644
> > --- a/mm/slab_common.c
> > +++ b/mm/slab_common.c
> > @@ -1001,6 +1001,10 @@ size_t __ksize(const void *object)
> > return folio_size(folio);
> > }
> >
> > +#ifdef CONFIG_SLUB_DEBUG
> > + skip_orig_size_check(folio_slab(folio)->slab_cache, object);
> > +#endif
> > +
> > return slab_ksize(folio_slab(folio)->slab_cache);
> > }
> >
> > diff --git a/mm/slub.c b/mm/slub.c
> > index f523601d3fcf..2f0302136604 100644
> > --- a/mm/slub.c
> > +++ b/mm/slub.c
> > @@ -812,12 +812,27 @@ static inline void set_orig_size(struct kmem_cache *s,
> > if (!slub_debug_orig_size(s))
> > return;
> >
> > +#ifdef CONFIG_KASAN_GENERIC
> > + /*
> > + * KASAN could save its free meta data in the start part of object
> > + * area, so skip the redzone check if kasan's meta data size is
> > + * bigger enough to possibly overlap with kmalloc redzone
> > + */
> > + if (s->kasan_info.free_meta_size_in_object * 2 >= s->object_size)
>
> Why is free_meta_size_in_object multiplied by 2? Looks cryptic,
> probably needs a comment.
OK, will change, I didn't make it clear.
The basic idea is kasan's free-meta could be saved in object's data
area at offset 0, and it could overlap the kmalloc's in-object
redzone, which can only be in the second half part of the data
area. And as long as kasan's free meta sits in the first half,
then it's fine.
Maybe I can change the check to
if (s->kasan_info.free_meta_size_in_object > orig_size)
...
Thanks,
Feng
> Thanks!
>
prev parent reply other threads:[~2022-09-11 4:10 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-09-07 7:10 [PATCH v5 0/4] mm/slub: some debug enhancements for kmalloc Feng Tang
2022-09-07 7:10 ` [PATCH v5 1/4] mm/slub: enable debugging memory wasting of kmalloc Feng Tang
2022-09-07 14:17 ` Hyeonggon Yoo
2022-09-08 2:25 ` Feng Tang
2022-09-07 7:10 ` [PATCH v5 2/4] mm/slub: only zero the requested size of buffer for kzalloc Feng Tang
2022-09-07 14:57 ` Hyeonggon Yoo
2022-09-08 7:38 ` Feng Tang
2022-09-10 23:11 ` Andrey Konovalov
2022-09-11 5:04 ` Feng Tang
2022-09-07 7:10 ` [PATCH v5 3/4] mm: kasan: Add free_meta size info in struct kasan_cache Feng Tang
2022-09-10 23:14 ` Andrey Konovalov
2022-09-11 3:56 ` Feng Tang
2022-09-11 11:51 ` Andrey Konovalov
2022-09-11 12:29 ` Feng Tang
2022-09-07 7:10 ` [PATCH v5 4/4] mm/slub: extend redzone check to extra allocated kmalloc space than requested Feng Tang
2022-09-09 6:26 ` Hyeonggon Yoo
2022-09-09 7:33 ` Feng Tang
2022-09-10 23:12 ` Andrey Konovalov
2022-09-11 4:10 ` Feng Tang [this message]
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=Yx1fmSyCNDwDgfqk@feng-clx \
--to=feng.tang@intel.com \
--cc=42.hyeyoo@gmail.com \
--cc=akpm@linux-foundation.org \
--cc=andreyknvl@gmail.com \
--cc=cl@linux.com \
--cc=corbet@lwn.net \
--cc=dave.hansen@intel.com \
--cc=dvyukov@google.com \
--cc=iamjoonsoo.kim@lge.com \
--cc=kasan-dev@googlegroups.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=penberg@kernel.org \
--cc=rientjes@google.com \
--cc=roman.gushchin@linux.dev \
--cc=vbabka@suse.cz \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox