• Marco Elver's avatar
    kfence: introduce burst mode · cc0a0f98
    Marco Elver authored
    Introduce burst mode, which can be configured with kfence.burst=$count,
    where the burst count denotes the additional successive slab allocations
    to be allocated through KFENCE for each sample interval.
    
    The idea is that this can give developers an additional knob to make
    KFENCE more aggressive when debugging specific issues of systems where
    either rebooting or recompiling the kernel with KASAN is not possible.
    
    Experiment: To assess the effectiveness of the new option, we randomly
    picked a recent out-of-bounds [1] and use-after-free bug [2], each with a
    reproducer provided by syzbot, that initially detected these bugs with
    KASAN.  We then tried to reproduce the bugs with KFENCE below.
    
    [1] Fixed by: 7c55b788 ("jfs: xattr: fix buffer overflow for invalid xattr")
        https://syzkaller.appspot.com/bug?id=9d1b59d4718239da6f6069d3891863c25f9f24a2
    [2] Fixed by: f8ad00f3 ("l2tp: fix possible UAF when cleaning up tunnels")
        https://syzkaller.appspot.com/bug?id=4f34adc84f4a3b080187c390eeef60611fd450e1
    
    The following KFENCE configs were compared. A pool size of 1023 objects
    was used for all configurations.
    
    	Baseline
    		kfence.sample_interval=100
    		kfence.skip_covered_thresh=75
    		kfence.burst=0
    
    	Aggressive
    		kfence.sample_interval=1
    		kfence.skip_covered_thresh=10
    		kfence.burst=0
    
    	AggressiveBurst
    		kfence.sample_interval=1
    		kfence.skip_covered_thresh=10
    		kfence.burst=1000
    
    Each reproducer was run 10 times (after a fresh reboot), with the
    following detection counts for each KFENCE config:
    
                        | Detection Count out of 10 |
                        |    OOB [1]  |    UAF [2]  |
      ------------------+-------------+-------------+
      Default           |     0/10    |     0/10    |
      Aggressive        |     0/10    |     0/10    |
      AggressiveBurst   |     8/10    |     8/10    |
    
    With the Default and even the Aggressive configs the results are
    unsurprising, given KFENCE has not been designed for deterministic bug
    detection of small test cases.
    
    However, when enabling burst mode with relatively large burst count,
    KFENCE can start to detect heap memory-safety bugs even in simpler test
    cases with high probability (in the above cases with ~80% probability).
    
    Link: https://lkml.kernel.org/r/20240805124203.2692278-1-elver@google.comSigned-off-by: default avatarMarco Elver <elver@google.com>
    Reviewed-by: default avatarAlexander Potapenko <glider@google.com>
    Cc: Andrey Konovalov <andreyknvl@gmail.com>
    Cc: Dmitry Vyukov <dvyukov@google.com>
    Cc: Jann Horn <jannh@google.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    cc0a0f98
kfence.rst 15 KB