0%

Linux 内核栈溢出检测

借助 Linux debugfs 来检测内核栈使用状态及溢出检测

工具

Linux 内核中有 KASANkmemcheck

KASAN 只支持 arm64x86,见内核文档 Documentation/features/debug/KASAN/arch-support.txt

kmemcheck 仅支持 x86

因此在 arm 下使用 debugfs 来跟踪内核栈使用情况

内核配置

  • debugfs 支持
  • ftrace 支持
    Kernel hacking ->
      Tracers ->
          [*]   Trace max stack

使用

# mount -t debugfs nodev /sys/kernel/debug
# echo 1 > /proc/sys/kernel/stack_tracer_enabled

检查以下状态

# cat /sys/kernel/debug/tracing/stack_max_size
# cat /sys/kernel/debug/tracing/stack_trace

# cat /sys/kernel/debug/tracing/stack_max_size
7272
# cat /sys/kernel/debug/tracing/stack_trace
        Depth    Size   Location    (61 entries)
        -----    ----   --------
  0)     7080     224   select_task_rq_fair+0x3be/0x980
  1)     6856     112   try_to_wake_up+0x14a/0x400
  2)     6744      16   wake_up_process+0x15/0x20
  3)     6728      16   wakeup_softirqd+0x35/0x40
  4)     6712      48   raise_softirq_irqoff+0x4f/0x90
  5)     6664      48   __blk_complete_request+0x132/0x140
  6)     6616      16   blk_complete_request+0x25/0x30
  7)     6600      32   scsi_done+0x2f/0x60
  8)     6568      48   megasas_queue_command+0xd1/0x140 [megaraid_sas]
  9)     6520      48   scsi_dispatch_cmd+0x1ac/0x340
 10)     6472      96   scsi_request_fn+0x415/0x590
 11)     6376      32   __generic_unplug_device+0x32/0x40
  • stack_max_size 内核栈使用的峰值
  • stack_trace 表示此峰值下的 callstackcallstack 中个个函数使用的栈的大小

Ref

  1. 内核栈溢出
  2. kernel 内核栈的检测
  3. Kasan - Linux 内核的内存检测工具