Poison, redzones and shadows: inside KASAN
KASAN(Kernel Address Sanitizer)は、Linuxカーネルにおける動的メモリエラー検出ツールであり、poison(毒データ)、redzone(未使用領域の監視領域)、shadow(シャドウメモリ)という3つの主要な概念を基盤としています。本記事では、これらの仕組みがどのように連携してカーネル内の解放後使用やバッファオーバーフローなどのメモリバグを検出するのか、内部実装の詳細を解説します。
背景メモ
- KASAN(Kernel Address Sanitizer)はLinuxカーネル用の動的メモリエラーディテクタで、バッファオーバーフローやuse-after-freeなどのメモリバグを実行時に検出する。元はLLVMのAddressSanitizer(ASan)をカーネル向けに移植したもの。
- "poison"(毒)は解放済みまたは未初期化のメモリ領域に特定パターンを書き込む処理、"redzone"は割り当て領域の前後に配置されるガード領域で、これらにアクセスがあるとバグと判定される。
- "shadow memory"(シャドウメモリ):通常のメモリ(8バイト)に対応する1バイトの状態情報を保持する専用領域。KASANはシャドウ値をチェックすることで不正アクセスを検出する仕組み。
- KASANにはGeneric KASAN(ソフトウェア実装、性能オーバーヘッド大)とHardware-tagged KASAN(ARMv8.5 Memory Tagging Extensionを使いハードウェア支援で低オーバーヘッド)の2種類がある。
- 組み込みLinuxカーネル開発の老舗企業Bootlin社の技術ブログで、カーネル内部の仕組みを詳細に解説している。