Kernel Address Sanitizer

Ähnlich wie die LLVM-basierten Desinfektionsmittel für Userspace-Komponenten umfasst Android Kernel Address Sanitizer (KASan) KASan ist eine Kombination aus Kernel und Zeitänderungen kompilieren, die ein instrumentiertes System zur Folge haben, das einfachere Fehlersuche und Ursachenanalyse.

KASan kann viele Arten von Speicherverstößen im Kernel erkennen. Es kann auch Out-of-bound-Lese- und -Schreibvorgänge in Stack-, Heap- und globalen Variablen erkennen und „Use-After-Free“ und „Double Frees“ erkennen.

Ähnlich wie bei ASan verwendet KASan eine Kombination aus Kompilieren der Zeit und des Schattenspeichers, um Speicherzugriffe während der Laufzeit zu verfolgen. Bei KASan ein Achtel des Kernel-Arbeitsspeichers für den Schattenspeicher vorgesehen, bestimmt, ob ein Speicherzugriff gültig ist oder nicht.

KASan wird in x86_64- und arm64-Architekturen unterstützt. Sie gehört zum Upstream-Kernel seit 4.0 und wurde auf Android 3.18-basierte Kernel.

Neben KASan ist kcov eine weitere Kerneländerung, die für Tests durchführen. kcov wurde entwickelt, um abdeckungsgesteuerte Fuzzing-Tests in Kernel. Sie misst die Abdeckung in Bezug auf Systemaufrufeingaben und ist nützlich bei Fuzzing-Systeme wie syzkaller.

Implementierung

Fügen Sie die folgenden Build-Flags hinzu, um einen Kernel mit aktiviertem KASan und kcov zu kompilieren zu Ihrer Kernel-Build-Konfiguration hinzu:

CONFIG_KASAN
CONFIG_KASAN_INLINE
CONFIG_TEST_KASAN
CONFIG_KCOV
CONFIG_SLUB
CONFIG_SLUB_DEBUG
CONFIG_CC_OPTIMIZE_FOR_SIZE

Und entfernen Sie Folgendes:

CONFIG_SLUB_DEBUG_ON
CONFIG_SLUB_DEBUG_PANIC_ON
CONFIG_KASAN_OUTLINE
CONFIG_KERNEL_LZ4

Erstellen und flashen Sie dann den Kernel wie gewohnt. Der KASan-Kernel ist erheblich größer als das Original ist. Ändern Sie bei Bedarf alle Bootparameter und Bootloader-Einstellungen, um dies zu berücksichtigen.

Prüfen Sie nach dem Flashen des Kernels in den Kernel-Bootlogs, ob KASan aktiviert ist. und laufen. Der Kernel startet mit den Speicherkarteninformationen für KASan, Beispiele:

...
[    0.000000] c0      0 Virtual kernel memory layout:
[    0.000000] c0      0     kasan   : 0xffffff8000000000 - 0xffffff9000000000   (    64 GB)
[    0.000000] c0      0     vmalloc : 0xffffff9000010000 - 0xffffffbdbfff0000   (   182 GB)
[    0.000000] c0      0     vmemmap : 0xffffffbdc0000000 - 0xffffffbfc0000000   (     8 GB maximum)
[    0.000000] c0      0               0xffffffbdc0000000 - 0xffffffbdc3f95400   (    63 MB actual)
[    0.000000] c0      0     PCI I/O : 0xffffffbffa000000 - 0xffffffbffb000000   (    16 MB)
[    0.000000] c0      0     fixed   : 0xffffffbffbdfd000 - 0xffffffbffbdff000   (     8 KB)
[    0.000000] c0      0     modules : 0xffffffbffc000000 - 0xffffffc000000000   (    64 MB)
[    0.000000] c0      0     memory  : 0xffffffc000000000 - 0xffffffc0fe550000   (  4069 MB)
[    0.000000] c0      0       .init : 0xffffffc001d33000 - 0xffffffc001dce000   (   620 KB)
[    0.000000] c0      0       .text : 0xffffffc000080000 - 0xffffffc001d32284   ( 29385 KB)
...

Und so sieht ein Fehler aus:

[   18.539668] c3      1 ==================================================================
[   18.547662] c3      1 BUG: KASAN: null-ptr-deref on address 0000000000000008
[   18.554689] c3      1 Read of size 8 by task swapper/0/1
[   18.559988] c3      1 CPU: 3 PID: 1 Comm: swapper/0 Tainted: G        W      3.18.24-xxx #1
[   18.569275] c3      1 Hardware name: Android Device
[   18.577433] c3      1 Call trace:
[   18.580739] c3      1 [<ffffffc00008b32c>] dump_backtrace+0x0/0x2c4
[   18.586985] c3      1 [<ffffffc00008b600>] show_stack+0x10/0x1c
[   18.592889] c3      1 [<ffffffc001481194>] dump_stack+0x74/0xc8
[   18.598792] c3      1 [<ffffffc000202ee0>] kasan_report+0x11c/0x4d0
[   18.605038] c3      1 [<ffffffc00020286c>] __asan_load8+0x20/0x80
[   18.611115] c3      1 [<ffffffc000bdefe8>] android_verity_ctr+0x8cc/0x1024
[   18.617976] c3      1 [<ffffffc000bcaa2c>] dm_table_add_target+0x3dc/0x50c
[   18.624832] c3      1 [<ffffffc001bdbe60>] dm_run_setup+0x50c/0x678
[   18.631082] c3      1 [<ffffffc001bda8c0>] prepare_namespace+0x44/0x1ac
[   18.637676] c3      1 [<ffffffc001bda170>] kernel_init_freeable+0x328/0x364
[   18.644625] c3      1 [<ffffffc001478e20>] kernel_init+0x10/0xd8
[   18.650613] c3      1 ==================================================================

Wenn Module in Ihrem Kernel aktiviert sind, können Sie außerdem die Test-Kasan-Datei Kernelmodul für weitere Tests. Das Modul versucht, den Out-of-bound-Speicher zu verwenden. auf die nach der Freischaltung zugegriffen und sie anschließend verwendet werden. Dies ist nützlich, um sicherzustellen, dass Sie KASan richtig aktiviert haben. auf einem Zielgerät.