From: Kees Cook <keescook@chromium.org>
To: Kent Overstreet <kent.overstreet@linux.dev>
Cc: Suren Baghdasaryan <surenb@google.com>,
akpm@linux-foundation.org, mhocko@suse.com, vbabka@suse.cz,
hannes@cmpxchg.org, roman.gushchin@linux.dev, mgorman@suse.de,
dave@stgolabs.net, willy@infradead.org, liam.howlett@oracle.com,
penguin-kernel@i-love.sakura.ne.jp, corbet@lwn.net,
void@manifault.com, peterz@infradead.org, juri.lelli@redhat.com,
catalin.marinas@arm.com, will@kernel.org, arnd@arndb.de,
tglx@linutronix.de, mingo@redhat.com,
dave.hansen@linux.intel.com, x86@kernel.org, peterx@redhat.com,
david@redhat.com, axboe@kernel.dk, mcgrof@kernel.org,
masahiroy@kernel.org, nathan@kernel.org, dennis@kernel.org,
tj@kernel.org, muchun.song@linux.dev, rppt@kernel.org,
paulmck@kernel.org, pasha.tatashin@soleen.com,
yosryahmed@google.com, yuzhao@google.com, dhowells@redhat.com,
hughd@google.com, andreyknvl@gmail.com, ndesaulniers@google.com,
vvvvvv@google.com, gregkh@linuxfoundation.org,
ebiggers@google.com, ytcoode@gmail.com,
vincent.guittot@linaro.org, dietmar.eggemann@arm.com,
rostedt@goodmis.org, bsegall@google.com, bristot@redhat.com,
vschneid@redhat.com, cl@linux.com, penberg@kernel.org,
iamjoonsoo.kim@lge.com, 42.hyeyoo@gmail.com, glider@google.com,
elver@google.com, dvyukov@google.com, shakeelb@google.com,
songmuchun@bytedance.com, jbaron@akamai.com, rientjes@google.com,
minchan@google.com, kaleshsingh@google.com,
kernel-team@android.com, linux-doc@vger.kernel.org,
linux-kernel@vger.kernel.org, iommu@lists.linux.dev,
linux-arch@vger.kernel.org, linux-fsdevel@vger.kernel.org,
linux-mm@kvack.org, linux-modules@vger.kernel.org,
kasan-dev@googlegroups.com, cgroups@vger.kernel.org
Subject: Re: [PATCH v4 14/36] lib: add allocation tagging support for memory allocation profiling
Date: Wed, 21 Feb 2024 16:25:02 -0800 [thread overview]
Message-ID: <202402211608.41AD94094@keescook> (raw)
In-Reply-To: <4vwiwgsemga7vmahgwsikbsawjq5xfskdsssmjsfe5hn7k2alk@b6ig5v2pxe5i>
On Wed, Feb 21, 2024 at 06:29:17PM -0500, Kent Overstreet wrote:
> On Wed, Feb 21, 2024 at 03:05:32PM -0800, Kees Cook wrote:
> > On Wed, Feb 21, 2024 at 11:40:27AM -0800, Suren Baghdasaryan wrote:
> > > [...]
> > > +struct alloc_tag {
> > > + struct codetag ct;
> > > + struct alloc_tag_counters __percpu *counters;
> > > +} __aligned(8);
> > > [...]
> > > +#define DEFINE_ALLOC_TAG(_alloc_tag) \
> > > + static DEFINE_PER_CPU(struct alloc_tag_counters, _alloc_tag_cntr); \
> > > + static struct alloc_tag _alloc_tag __used __aligned(8) \
> > > + __section("alloc_tags") = { \
> > > + .ct = CODE_TAG_INIT, \
> > > + .counters = &_alloc_tag_cntr };
> > > [...]
> > > +static inline struct alloc_tag *alloc_tag_save(struct alloc_tag *tag)
> > > +{
> > > + swap(current->alloc_tag, tag);
> > > + return tag;
> > > +}
> >
> > Future security hardening improvement idea based on this infrastructure:
> > it should be possible to implement per-allocation-site kmem caches. For
> > example, we could create:
> >
> > struct alloc_details {
> > u32 flags;
> > union {
> > u32 size; /* not valid after __init completes */
> > struct kmem_cache *cache;
> > };
> > };
> >
> > - add struct alloc_details to struct alloc_tag
> > - move the tags section into .ro_after_init
> > - extend alloc_hooks() to populate flags and size:
> > .flags = __builtin_constant_p(size) ? KMALLOC_ALLOCATE_FIXED
> > : KMALLOC_ALLOCATE_BUCKETS;
> > .size = __builtin_constant_p(size) ? size : SIZE_MAX;
> > - during kernel start or module init, walk the alloc_tag list
> > and create either a fixed-size kmem_cache or to allocate a
> > full set of kmalloc-buckets, and update the "cache" member.
> > - adjust kmalloc core routines to use current->alloc_tag->cache instead
> > of using the global buckets.
> >
> > This would get us fully separated allocations, producing better than
> > type-based levels of granularity, exceeding what we have currently with
> > CONFIG_RANDOM_KMALLOC_CACHES.
> >
> > Does this look possible, or am I misunderstanding something in the
> > infrastructure being created here?
>
> Definitely possible, but... would we want this?
Yes, very very much. One of the worst and mostly unaddressed weaknesses
with the kernel right now is use-after-free based type confusion[0], which
depends on merged caches (or cache reuse).
This doesn't solve cross-allocator (kmalloc/page_alloc) type confusion
(as terrifyingly demonstrated[1] by Jann Horn), but it does help with
what has been a very common case of "use msg_msg to impersonate your
target object"[2] exploitation.
> That would produce a _lot_ of kmem caches
Fewer than you'd expect, but yes, there is some overhead. However,
out-of-tree forks of Linux have successfully experimented with this
already and seen good results[3].
> and don't we already try to collapse those where possible to reduce
> internal fragmentation?
In the past, yes, but the desire for security has tended to have more
people building with SLAB_MERGE_DEFAULT=n and/or CONFIG_RANDOM_KMALLOC_CACHES=y
(or booting with "slab_nomerge").
Just doing the type safety isn't sufficient without the cross-allocator
safety, but we've also had solutions for that proposed[4].
-Kees
[0] https://github.com/KSPP/linux/issues/189
[1] https://googleprojectzero.blogspot.com/2021/10/how-simple-linux-kernel-memory.html
[2] https://www.willsroot.io/2021/08/corctf-2021-fire-of-salvation-writeup.html
https://google.github.io/security-research/pocs/linux/cve-2021-22555/writeup.html#exploring-struct-msg_msg
[3] https://grsecurity.net/how_autoslab_changes_the_memory_unsafety_game
[4] https://lore.kernel.org/linux-hardening/20230915105933.495735-1-matteorizzo@google.com/
--
Kees Cook
next prev parent reply other threads:[~2024-02-22 0:25 UTC|newest]
Thread overview: 98+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-02-21 19:40 [PATCH v4 00/36] Memory allocation profiling Suren Baghdasaryan
2024-02-21 19:40 ` [PATCH v4 01/36] fix missing vmalloc.h includes Suren Baghdasaryan
2024-02-21 21:09 ` Pasha Tatashin
2024-02-21 19:40 ` [PATCH v4 02/36] asm-generic/io.h: Kill vmalloc.h dependency Suren Baghdasaryan
2024-02-21 21:11 ` Pasha Tatashin
2024-02-21 19:40 ` [PATCH v4 03/36] mm/slub: Mark slab_free_freelist_hook() __always_inline Suren Baghdasaryan
2024-02-21 21:15 ` Pasha Tatashin
2024-02-24 2:02 ` Suren Baghdasaryan
2024-02-26 14:31 ` Vlastimil Babka
2024-02-26 15:21 ` Pasha Tatashin
2024-02-26 16:09 ` Suren Baghdasaryan
2024-02-21 19:40 ` [PATCH v4 04/36] scripts/kallysms: Always include __start and __stop symbols Suren Baghdasaryan
2024-02-21 21:20 ` Pasha Tatashin
2024-02-21 19:40 ` [PATCH v4 05/36] fs: Convert alloc_inode_sb() to a macro Suren Baghdasaryan
2024-02-21 21:23 ` Pasha Tatashin
2024-02-26 15:44 ` Vlastimil Babka
2024-02-26 17:48 ` Suren Baghdasaryan
2024-02-26 20:50 ` Kent Overstreet
2024-02-21 19:40 ` [PATCH v4 06/36] mm: enumerate all gfp flags Suren Baghdasaryan
2024-02-21 21:25 ` Pasha Tatashin
2024-02-22 12:12 ` Michal Hocko
2024-02-22 12:24 ` Petr Tesařík
2024-02-23 19:26 ` Suren Baghdasaryan
2024-02-24 1:59 ` Suren Baghdasaryan
2024-02-21 19:40 ` [PATCH v4 07/36] mm: introduce slabobj_ext to support slab object extensions Suren Baghdasaryan
2024-02-21 21:30 ` Pasha Tatashin
2024-02-26 16:26 ` Vlastimil Babka
2024-02-26 17:22 ` Suren Baghdasaryan
2024-02-21 19:40 ` [PATCH v4 08/36] mm: introduce __GFP_NO_OBJ_EXT flag to selectively prevent slabobj_ext creation Suren Baghdasaryan
2024-02-22 0:08 ` Pasha Tatashin
2024-02-26 16:51 ` Vlastimil Babka
2024-02-21 19:40 ` [PATCH v4 09/36] mm/slab: introduce SLAB_NO_OBJ_EXT to avoid obj_ext creation Suren Baghdasaryan
2024-02-22 0:09 ` Pasha Tatashin
2024-02-26 16:52 ` Vlastimil Babka
2024-02-21 19:40 ` [PATCH v4 10/36] slab: objext: introduce objext_flags as extension to page_memcg_data_flags Suren Baghdasaryan
2024-02-22 0:12 ` Pasha Tatashin
2024-02-26 16:53 ` Vlastimil Babka
2024-02-21 19:40 ` [PATCH v4 11/36] lib: code tagging framework Suren Baghdasaryan
2024-02-21 19:40 ` [PATCH v4 12/36] lib: code tagging module support Suren Baghdasaryan
2024-02-21 19:40 ` [PATCH v4 13/36] lib: prevent module unloading if memory is not freed Suren Baghdasaryan
2024-02-26 16:58 ` Vlastimil Babka
2024-02-26 17:13 ` Suren Baghdasaryan
2024-03-12 18:23 ` Luis Chamberlain
2024-03-12 19:56 ` Suren Baghdasaryan
2024-03-12 20:07 ` Kent Overstreet
2024-02-21 19:40 ` [PATCH v4 14/36] lib: add allocation tagging support for memory allocation profiling Suren Baghdasaryan
2024-02-21 23:05 ` Kees Cook
2024-02-21 23:29 ` Kent Overstreet
2024-02-22 0:25 ` Kees Cook [this message]
2024-02-22 0:34 ` Kent Overstreet
2024-02-22 0:57 ` Kees Cook
2024-02-28 8:29 ` Vlastimil Babka
2024-02-28 18:05 ` Suren Baghdasaryan
2024-02-28 8:41 ` Vlastimil Babka
2024-02-28 18:07 ` Suren Baghdasaryan
2024-02-21 19:40 ` [PATCH v4 15/36] lib: introduce support for page allocation tagging Suren Baghdasaryan
2024-02-26 17:07 ` Vlastimil Babka
2024-02-26 17:11 ` Suren Baghdasaryan
2024-02-27 9:30 ` Vlastimil Babka
2024-02-27 9:45 ` Kent Overstreet
2024-02-27 16:55 ` Suren Baghdasaryan
2024-02-21 19:40 ` [PATCH v4 16/36] mm: percpu: increase PERCPU_MODULE_RESERVE to accommodate allocation tags Suren Baghdasaryan
2024-02-21 19:40 ` [PATCH v4 17/36] change alloc_pages name in dma_map_ops to avoid name conflicts Suren Baghdasaryan
2024-02-21 19:40 ` [PATCH v4 18/36] mm: enable page allocation tagging Suren Baghdasaryan
2024-02-21 19:40 ` [PATCH v4 19/36] mm: create new codetag references during page splitting Suren Baghdasaryan
2024-02-27 10:11 ` Vlastimil Babka
2024-02-27 16:38 ` Suren Baghdasaryan
2024-02-28 8:47 ` Vlastimil Babka
2024-02-28 17:50 ` Suren Baghdasaryan
2024-02-28 18:28 ` Vlastimil Babka
2024-02-28 18:38 ` Suren Baghdasaryan
2024-02-21 19:40 ` [PATCH v4 20/36] mm/page_ext: enable early_page_ext when CONFIG_MEM_ALLOC_PROFILING_DEBUG=y Suren Baghdasaryan
2024-02-27 10:18 ` Vlastimil Babka
2024-02-21 19:40 ` [PATCH v4 21/36] lib: add codetag reference into slabobj_ext Suren Baghdasaryan
2024-02-27 10:19 ` Vlastimil Babka
2024-02-21 19:40 ` [PATCH v4 22/36] mm/slab: add allocation accounting into slab allocation and free paths Suren Baghdasaryan
2024-02-27 13:07 ` Vlastimil Babka
2024-02-27 16:15 ` Suren Baghdasaryan
2024-02-21 19:40 ` [PATCH v4 23/36] mm/slab: enable slab allocation tagging for kmalloc and friends Suren Baghdasaryan
2024-02-21 19:40 ` [PATCH v4 24/36] rust: Add a rust helper for krealloc() Suren Baghdasaryan
2024-02-22 9:59 ` Alice Ryhl
2024-02-23 22:17 ` Suren Baghdasaryan
2024-02-21 19:40 ` [PATCH v4 25/36] mempool: Hook up to memory allocation profiling Suren Baghdasaryan
2024-02-21 19:40 ` [PATCH v4 26/36] mm: percpu: Introduce pcpuobj_ext Suren Baghdasaryan
2024-02-21 19:40 ` [PATCH v4 27/36] mm: percpu: Add codetag reference into pcpuobj_ext Suren Baghdasaryan
2024-02-21 19:40 ` [PATCH v4 28/36] mm: percpu: enable per-cpu allocation tagging Suren Baghdasaryan
2024-02-21 19:40 ` [PATCH v4 29/36] mm: vmalloc: Enable memory allocation profiling Suren Baghdasaryan
2024-02-21 19:40 ` [PATCH v4 30/36] rhashtable: Plumb through alloc tag Suren Baghdasaryan
2024-02-21 19:40 ` [PATCH v4 31/36] lib: add memory allocations report in show_mem() Suren Baghdasaryan
2024-02-27 13:19 ` Vlastimil Babka
2024-02-27 16:12 ` Suren Baghdasaryan
2024-02-21 19:40 ` [PATCH v4 32/36] codetag: debug: skip objext checking when it's for objext itself Suren Baghdasaryan
2024-02-21 19:40 ` [PATCH v4 33/36] codetag: debug: mark codetags for reserved pages as empty Suren Baghdasaryan
2024-02-21 19:40 ` [PATCH v4 34/36] codetag: debug: introduce OBJEXTS_ALLOC_FAIL to mark failed slab_ext allocations Suren Baghdasaryan
2024-02-21 19:40 ` [PATCH v4 35/36] MAINTAINERS: Add entries for code tagging and memory allocation profiling Suren Baghdasaryan
2024-02-21 19:40 ` [PATCH v4 36/36] memprofiling: Documentation Suren Baghdasaryan
2024-02-27 13:36 ` [PATCH v4 00/36] Memory allocation profiling Vlastimil Babka
2024-02-27 16:10 ` Suren Baghdasaryan
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=202402211608.41AD94094@keescook \
--to=keescook@chromium.org \
--cc=42.hyeyoo@gmail.com \
--cc=akpm@linux-foundation.org \
--cc=andreyknvl@gmail.com \
--cc=arnd@arndb.de \
--cc=axboe@kernel.dk \
--cc=bristot@redhat.com \
--cc=bsegall@google.com \
--cc=catalin.marinas@arm.com \
--cc=cgroups@vger.kernel.org \
--cc=cl@linux.com \
--cc=corbet@lwn.net \
--cc=dave.hansen@linux.intel.com \
--cc=dave@stgolabs.net \
--cc=david@redhat.com \
--cc=dennis@kernel.org \
--cc=dhowells@redhat.com \
--cc=dietmar.eggemann@arm.com \
--cc=dvyukov@google.com \
--cc=ebiggers@google.com \
--cc=elver@google.com \
--cc=glider@google.com \
--cc=gregkh@linuxfoundation.org \
--cc=hannes@cmpxchg.org \
--cc=hughd@google.com \
--cc=iamjoonsoo.kim@lge.com \
--cc=iommu@lists.linux.dev \
--cc=jbaron@akamai.com \
--cc=juri.lelli@redhat.com \
--cc=kaleshsingh@google.com \
--cc=kasan-dev@googlegroups.com \
--cc=kent.overstreet@linux.dev \
--cc=kernel-team@android.com \
--cc=liam.howlett@oracle.com \
--cc=linux-arch@vger.kernel.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linux-modules@vger.kernel.org \
--cc=masahiroy@kernel.org \
--cc=mcgrof@kernel.org \
--cc=mgorman@suse.de \
--cc=mhocko@suse.com \
--cc=minchan@google.com \
--cc=mingo@redhat.com \
--cc=muchun.song@linux.dev \
--cc=nathan@kernel.org \
--cc=ndesaulniers@google.com \
--cc=pasha.tatashin@soleen.com \
--cc=paulmck@kernel.org \
--cc=penberg@kernel.org \
--cc=penguin-kernel@i-love.sakura.ne.jp \
--cc=peterx@redhat.com \
--cc=peterz@infradead.org \
--cc=rientjes@google.com \
--cc=roman.gushchin@linux.dev \
--cc=rostedt@goodmis.org \
--cc=rppt@kernel.org \
--cc=shakeelb@google.com \
--cc=songmuchun@bytedance.com \
--cc=surenb@google.com \
--cc=tglx@linutronix.de \
--cc=tj@kernel.org \
--cc=vbabka@suse.cz \
--cc=vincent.guittot@linaro.org \
--cc=void@manifault.com \
--cc=vschneid@redhat.com \
--cc=vvvvvv@google.com \
--cc=will@kernel.org \
--cc=willy@infradead.org \
--cc=x86@kernel.org \
--cc=yosryahmed@google.com \
--cc=ytcoode@gmail.com \
--cc=yuzhao@google.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.