kasan.rst 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. The Kernel Address Sanitizer (KASAN)
  2. ====================================
  3. Overview
  4. --------
  5. KernelAddressSANitizer (KASAN) is a dynamic memory error detector. It provides
  6. a fast and comprehensive solution for finding use-after-free and out-of-bounds
  7. bugs.
  8. KASAN uses compile-time instrumentation for checking every memory access,
  9. therefore you will need a GCC version 4.9.2 or later. GCC 5.0 or later is
  10. required for detection of out-of-bounds accesses to stack or global variables.
  11. Currently KASAN is supported only for the x86_64 and arm64 architectures.
  12. Usage
  13. -----
  14. To enable KASAN configure kernel with::
  15. CONFIG_KASAN = y
  16. and choose between CONFIG_KASAN_OUTLINE and CONFIG_KASAN_INLINE. Outline and
  17. inline are compiler instrumentation types. The former produces smaller binary
  18. the latter is 1.1 - 2 times faster. Inline instrumentation requires a GCC
  19. version 5.0 or later.
  20. KASAN works with both SLUB and SLAB memory allocators.
  21. For better bug detection and nicer reporting, enable CONFIG_STACKTRACE.
  22. To disable instrumentation for specific files or directories, add a line
  23. similar to the following to the respective kernel Makefile:
  24. - For a single file (e.g. main.o)::
  25. KASAN_SANITIZE_main.o := n
  26. - For all files in one directory::
  27. KASAN_SANITIZE := n
  28. Error reports
  29. ~~~~~~~~~~~~~
  30. A typical out of bounds access report looks like this::
  31. ==================================================================
  32. BUG: AddressSanitizer: out of bounds access in kmalloc_oob_right+0x65/0x75 [test_kasan] at addr ffff8800693bc5d3
  33. Write of size 1 by task modprobe/1689
  34. =============================================================================
  35. BUG kmalloc-128 (Not tainted): kasan error
  36. -----------------------------------------------------------------------------
  37. Disabling lock debugging due to kernel taint
  38. INFO: Allocated in kmalloc_oob_right+0x3d/0x75 [test_kasan] age=0 cpu=0 pid=1689
  39. __slab_alloc+0x4b4/0x4f0
  40. kmem_cache_alloc_trace+0x10b/0x190
  41. kmalloc_oob_right+0x3d/0x75 [test_kasan]
  42. init_module+0x9/0x47 [test_kasan]
  43. do_one_initcall+0x99/0x200
  44. load_module+0x2cb3/0x3b20
  45. SyS_finit_module+0x76/0x80
  46. system_call_fastpath+0x12/0x17
  47. INFO: Slab 0xffffea0001a4ef00 objects=17 used=7 fp=0xffff8800693bd728 flags=0x100000000004080
  48. INFO: Object 0xffff8800693bc558 @offset=1368 fp=0xffff8800693bc720
  49. Bytes b4 ffff8800693bc548: 00 00 00 00 00 00 00 00 5a 5a 5a 5a 5a 5a 5a 5a ........ZZZZZZZZ
  50. Object ffff8800693bc558: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk
  51. Object ffff8800693bc568: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk
  52. Object ffff8800693bc578: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk
  53. Object ffff8800693bc588: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk
  54. Object ffff8800693bc598: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk
  55. Object ffff8800693bc5a8: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk
  56. Object ffff8800693bc5b8: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk
  57. Object ffff8800693bc5c8: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b a5 kkkkkkkkkkkkkkk.
  58. Redzone ffff8800693bc5d8: cc cc cc cc cc cc cc cc ........
  59. Padding ffff8800693bc718: 5a 5a 5a 5a 5a 5a 5a 5a ZZZZZZZZ
  60. CPU: 0 PID: 1689 Comm: modprobe Tainted: G B 3.18.0-rc1-mm1+ #98
  61. Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.7.5-0-ge51488c-20140602_164612-nilsson.home.kraxel.org 04/01/2014
  62. ffff8800693bc000 0000000000000000 ffff8800693bc558 ffff88006923bb78
  63. ffffffff81cc68ae 00000000000000f3 ffff88006d407600 ffff88006923bba8
  64. ffffffff811fd848 ffff88006d407600 ffffea0001a4ef00 ffff8800693bc558
  65. Call Trace:
  66. [<ffffffff81cc68ae>] dump_stack+0x46/0x58
  67. [<ffffffff811fd848>] print_trailer+0xf8/0x160
  68. [<ffffffffa00026a7>] ? kmem_cache_oob+0xc3/0xc3 [test_kasan]
  69. [<ffffffff811ff0f5>] object_err+0x35/0x40
  70. [<ffffffffa0002065>] ? kmalloc_oob_right+0x65/0x75 [test_kasan]
  71. [<ffffffff8120b9fa>] kasan_report_error+0x38a/0x3f0
  72. [<ffffffff8120a79f>] ? kasan_poison_shadow+0x2f/0x40
  73. [<ffffffff8120b344>] ? kasan_unpoison_shadow+0x14/0x40
  74. [<ffffffff8120a79f>] ? kasan_poison_shadow+0x2f/0x40
  75. [<ffffffffa00026a7>] ? kmem_cache_oob+0xc3/0xc3 [test_kasan]
  76. [<ffffffff8120a995>] __asan_store1+0x75/0xb0
  77. [<ffffffffa0002601>] ? kmem_cache_oob+0x1d/0xc3 [test_kasan]
  78. [<ffffffffa0002065>] ? kmalloc_oob_right+0x65/0x75 [test_kasan]
  79. [<ffffffffa0002065>] kmalloc_oob_right+0x65/0x75 [test_kasan]
  80. [<ffffffffa00026b0>] init_module+0x9/0x47 [test_kasan]
  81. [<ffffffff810002d9>] do_one_initcall+0x99/0x200
  82. [<ffffffff811e4e5c>] ? __vunmap+0xec/0x160
  83. [<ffffffff81114f63>] load_module+0x2cb3/0x3b20
  84. [<ffffffff8110fd70>] ? m_show+0x240/0x240
  85. [<ffffffff81115f06>] SyS_finit_module+0x76/0x80
  86. [<ffffffff81cd3129>] system_call_fastpath+0x12/0x17
  87. Memory state around the buggy address:
  88. ffff8800693bc300: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
  89. ffff8800693bc380: fc fc 00 00 00 00 00 00 00 00 00 00 00 00 00 fc
  90. ffff8800693bc400: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
  91. ffff8800693bc480: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
  92. ffff8800693bc500: fc fc fc fc fc fc fc fc fc fc fc 00 00 00 00 00
  93. >ffff8800693bc580: 00 00 00 00 00 00 00 00 00 00 03 fc fc fc fc fc
  94. ^
  95. ffff8800693bc600: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
  96. ffff8800693bc680: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
  97. ffff8800693bc700: fc fc fc fc fb fb fb fb fb fb fb fb fb fb fb fb
  98. ffff8800693bc780: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
  99. ffff8800693bc800: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
  100. ==================================================================
  101. The header of the report discribe what kind of bug happened and what kind of
  102. access caused it. It's followed by the description of the accessed slub object
  103. (see 'SLUB Debug output' section in Documentation/vm/slub.txt for details) and
  104. the description of the accessed memory page.
  105. In the last section the report shows memory state around the accessed address.
  106. Reading this part requires some understanding of how KASAN works.
  107. The state of each 8 aligned bytes of memory is encoded in one shadow byte.
  108. Those 8 bytes can be accessible, partially accessible, freed or be a redzone.
  109. We use the following encoding for each shadow byte: 0 means that all 8 bytes
  110. of the corresponding memory region are accessible; number N (1 <= N <= 7) means
  111. that the first N bytes are accessible, and other (8 - N) bytes are not;
  112. any negative value indicates that the entire 8-byte word is inaccessible.
  113. We use different negative values to distinguish between different kinds of
  114. inaccessible memory like redzones or freed memory (see mm/kasan/kasan.h).
  115. In the report above the arrows point to the shadow byte 03, which means that
  116. the accessed address is partially accessible.
  117. Implementation details
  118. ----------------------
  119. From a high level, our approach to memory error detection is similar to that
  120. of kmemcheck: use shadow memory to record whether each byte of memory is safe
  121. to access, and use compile-time instrumentation to check shadow memory on each
  122. memory access.
  123. AddressSanitizer dedicates 1/8 of kernel memory to its shadow memory
  124. (e.g. 16TB to cover 128TB on x86_64) and uses direct mapping with a scale and
  125. offset to translate a memory address to its corresponding shadow address.
  126. Here is the function which translates an address to its corresponding shadow
  127. address::
  128. static inline void *kasan_mem_to_shadow(const void *addr)
  129. {
  130. return ((unsigned long)addr >> KASAN_SHADOW_SCALE_SHIFT)
  131. + KASAN_SHADOW_OFFSET;
  132. }
  133. where ``KASAN_SHADOW_SCALE_SHIFT = 3``.
  134. Compile-time instrumentation used for checking memory accesses. Compiler inserts
  135. function calls (__asan_load*(addr), __asan_store*(addr)) before each memory
  136. access of size 1, 2, 4, 8 or 16. These functions check whether memory access is
  137. valid or not by checking corresponding shadow memory.
  138. GCC 5.0 has possibility to perform inline instrumentation. Instead of making
  139. function calls GCC directly inserts the code to check the shadow memory.
  140. This option significantly enlarges kernel but it gives x1.1-x2 performance
  141. boost over outline instrumented kernel.