Re: [RFC PATCH 0/2] kasan: hw_tags: Add option to tag only at allocation time
Dev Jain <[email protected]> Tue, 23 Jun 2026 10:32:16 +0530
| Newsgroups | org.kernel.vger.workflows,org.infradead.lists.linux-arm-kernel,org.kernel.vger.linux-doc,org.kernel.vger.linux-kernel,org.kvack.linux-mm |
|---|---|
| Message-ID | <[email protected]> |
On 22/06/26 10:43 pm, Catalin Marinas wrote: > Hi Harry, > > On Mon, Jun 22, 2026 at 09:42:10PM +0900, Harry Yoo wrote: >> On 6/19/26 10:19 PM, Catalin Marinas wrote: >>> On Thu, Jun 18, 2026 at 10:35:15PM +0900, Harry Yoo wrote: >>>> On 6/12/26 1:44 PM, Dev Jain wrote: >>>>> Now, when a memory object will be freed, it will retain the random tag it >>>>> had at allocation time. This compromises on catching UAF bugs, till the >>>>> time the object is not reallocated, at which point it will have a new >>>>> random tag. >>>>> >>>>> Hence, not catching "use-after-free-before-reallocation" and not catching >>>>> "double-free" will be the compromise for reduced KASAN overhead. >>>> >>>> I doubt users who care about security enough to enable HW_TAGS KASAN >>>> are willing to compromise on security just to save a few instructions >>>> to store tags in the free path. >>>> >>>> To me, it looks like too much of a compromise on security for little >>>> performance gain. >>> >>> I don't think there's much compromise on security for use-after-free. >> >> I think it depends... OH, WAIT! I see what you mean. >> >> You mean use-after-free before reallocation does not lead to much >> compromise on security because objects are initialized after allocation? >> >> You're probably right. >> >> Hmm, but stores to e.g.) free pointer, fields initialized by >> constructor or accessed by SLAB_TYPESAFE_BY_RCU semantics after free >> will be undiscovered if they happen before reallocation. > > Even with SLAB_TYPESAFE_BY_RCU, the object isn't tagged on free either > (or realloc, only if the actual slab page ends up freed). But we don't > get type confusion for such slab. > > However, without tagging on free, one could argue that it reduces > security for cases where the page is re-allocated as untagged - e.g. all > user pages mapped without PROT_MTE. Currently we have a deterministic > tag check fault if the page is coloured as KASAN_TAG_INVALID. I think So you are saying that a stale kernel pointer can continue to use the reallocated page, because for non-PROT_MTE case the page does not get a new tag. Makes sense. > for this patch, it might be better to only do such skip on free in > kasan_poison_slab() rather than kasan_poison(). Freed pages would then > be tagged. I think you mean to say, "skip tag on free when freeing pages into buddy"? So that would mean, kasan_poison() will do the poisoning also in the case of value == KASAN_PAGE_FREE. > > An alternative would be tagging on free only with a new tag and skipping > it on re-alloc. But we'd need to track when it's a completely new > allocation or a reused object (I haven't looked I'm pretty sure it's > doable). That was our original approach, and IIRC we had concluded there was no security compromise. However it is difficult to implement - it has cases like, what happens when two differently tagged pages are coalesced by buddy and someone gets that large page as an allocation. >