Skip to content
  • Qian Cai's avatar
    page_poison: play nicely with KASAN · a8029ee9
    Qian Cai authored
    KASAN does not play well with the page poisoning (CONFIG_PAGE_POISONING).
    It triggers false positives in the allocation path,
    
    BUG: KASAN: use-after-free in memchr_inv+0x2ea/0x330
    Read of size 8 at addr ffff88881f800000 by task swapper/0
    CPU: 0 PID: 0 Comm: swapper Not tainted 5.0.0-rc1+ #54
    Call Trace:
     dump_stack+0xe0/0x19a
     print_address_description.cold.2+0x9/0x28b
     kasan_report.cold.3+0x7a/0xb5
     __asan_report_load8_noabort+0x19/0x20
     memchr_inv+0x2ea/0x330
     kernel_poison_pages+0x103/0x3d5
     get_page_from_freelist+0x15e7/0x4d90
    
    because KASAN has not yet unpoisoned the shadow page for allocation before
    it checks memchr_inv() but only found a stale poison pattern.
    
    Also, false positives in free path,
    
    BUG: KASAN: slab-out-of-bounds in kernel_poison_pages+0x29e/0x3d5
    Write of size 4096 at addr ffff8888112cc000 by task swapper/0/1
    CPU: 5 PID: 1 Comm: swapper/0 Not tainted 5.0.0-rc1+ #55
    Call Trace:
     dump_stack+0xe0/0x19a
     print_address_description.cold.2+0x9/0x28b
     kasan_report.cold.3+0x7a/0xb5
     check_memory_region+0x22d/0x250
     memset+0x28/0x40
     kernel_poison_pages+0x29e/0x3d5
     __free_pages_ok+0x75f/0x13e0
    
    because KASAN adds poisoned redzones around slab objects, but the page
    poisoning needs to poison the whole page, so simply unpoision the shadow
    page before running the page poison's memset.
    
    Link: http://lkml.kernel.org/r/20190107223636.80593-1-cai@lca.pw
    
    
    Signed-off-by: default avatarQian Cai <cai@lca.pw>
    Cc: Andrey Ryabinin <aryabinin@virtuozzo.com>
    Cc: Alexander Potapenko <glider@google.com>
    Cc: Dmitry Vyukov <dvyukov@google.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarStephen Rothwell <sfr@canb.auug.org.au>
    a8029ee9