Linux カーネルルートキットの解析
概要
Linux カーネルルートキットはリング 0 で動作し、カーネルデータ構造を改ざんしてプロセス、ファイル、ネットワーク接続、カーネルモジュールをユーザー空間ツールから隠蔽します。検出にはメモリフォレンジック(Volatility3 による物理メモリダンプの解析)またはクロスビュー分析(/proc、/sys、カーネルデータ構造の比較による不整合の特定)が必要です。このスキルでは、Volatility3 の Linux プラグインを使用してシステムコールテーブルフック、隠しカーネルモジュール、改ざんされた関数ポインタを検出し、さらに rkhunter および chkrootkit によるライブシステムスキャンを補完的に行う手順を網羅します。
使用すべきケース
- Linux カーネルルートキットの解析が必要なセキュリティインシデントを調査する場合
- このドメインに対する検知ルールや脅威ハンティングクエリを構築する場合
- SOC アナリストがこの分析タイプの構造化された手順を必要とする場合
- 関連する攻撃手法に対するセキュリティ監視のカバレッジを検証する場合
前提条件
- Volatility3 がインストールされていること(
pip install volatility3) - Linux メモリダンプ(LiME、AVML、または
/proc/kcoreで取得) - 対象カーネルバージョンに一致する Volatility3 の Linux シンボルテーブル(ISF)
- ライブシステムスキャン用の rkhunter および chkrootkit
- 比較用の既知の正常なカーネルイメージ
手順
ステップ 1: メモリダンプの取得
LiME カーネルモジュール(クラウドインスタンスの場合は AVML)を使用して Linux 物理メモリをキャプチャします。
ステップ 2: Volatility3 による解析
linux.check_syscall、linux.lsmod、linux.hidden_modules、linux.check_idt プラグインを実行し、ルートキットアーティファクトを検出します。
ステップ 3: クロスビュー分析
/proc/modules、lsmod、/sys/module のモジュールリストを比較し、あるビューからは隠れていても別のビューでは存在するモジュールを特定します。
ステップ 4: ライブシステムスキャン
rkhunter と chkrootkit を実行し、既知のルートキットシグネチャ、不審なファイル、改ざんされたシステムバイナリを検出します。
期待される出力
検出されたシステムコールフック、隠しカーネルモジュール、改ざんされた IDT エントリ、不審な /proc の不一致、rkhunter の結果を含む JSON レポート。
出力例
$ sudo python3 rootkit_analyzer.py --memory /evidence/linux-mem.lime --profile Ubuntu2204
Linux Kernel Rootkit Analysis Report
=====================================
Memory Image: /evidence/linux-mem.lime
Kernel Version: 5.15.0-91-generic (Ubuntu 22.04 LTS)
Analysis Time: 2024-01-18 09:15:32 UTC
[+] Scanning syscall table for hooks...
Syscall Table Base: 0xffffffff82200300
Total syscalls checked: 449
HOOKED SYSCALLS DETECTED:
┌─────────┬──────────────────┬──────────────────────┬──────────────────────┐
│ NR │ Syscall │ Expected Address │ Current Address │
├─────────┼──────────────────┼──────────────────────┼──────────────────────┤
│ 0 │ sys_read │ 0xffffffff8139a0e0 │ 0xffffffffc0a12000 │
│ 2 │ sys_open │ 0xffffffff8139b340 │ 0xffffffffc0a12180 │
│ 78 │ sys_getdents64 │ 0xffffffff813f5210 │ 0xffffffffc0a12300 │
│ 62 │ sys_kill │ 0xffffffff8110c4a0 │ 0xffffffffc0a12480 │
└─────────┴──────────────────┴──────────────────────┴──────────────────────┘
WARNING: 4 syscall hooks detected - rootkit behavior confirmed
[+] Checking for hidden kernel modules...
Loaded modules (lsmod): 147
Modules in kobject list: 149
HIDDEN MODULES:
- "netfilter_helper" at 0xffffffffc0a10000 (size: 12288)
- "kworker_sched" at 0xffffffffc0a14000 (size: 8192)
[+] Scanning /proc for discrepancies...
Processes in task_struct list: 234
Processes visible in /proc: 231
HIDDEN PROCESSES:
- PID 31337 cmd: "[kworker/0:3]" (disguised as kernel thread)
- PID 31442 cmd: "rsyslogd" (fake, real rsyslogd is PID 892)
- PID 31500 cmd: "" (unnamed process)
[+] Checking IDT entries...
IDT entries scanned: 256
Modified entries: 0 (clean)
[+] Running rkhunter scan...
Checking for known rootkits: 68 variants checked
Diamorphine rootkit: WARNING - signatures match
System binary checks:
/usr/bin/ps: MODIFIED (SHA-256 mismatch)
/usr/bin/netstat: MODIFIED (SHA-256 mismatch)
/usr/bin/ls: MODIFIED (SHA-256 mismatch)
/usr/sbin/ss: OK
[+] Network analysis...
Hidden connections (not in /proc/net/tcp):
ESTABLISHED 0.0.0.0:0 -> 198.51.100.47:4443 (PID 31337)
ESTABLISHED 0.0.0.0:0 -> 198.51.100.47:8080 (PID 31442)
Summary:
Rootkit Type: Loadable Kernel Module (LKM)
Probable Family: Diamorphine variant
Syscall Hooks: 4 (read, open, getdents64, kill)
Hidden Modules: 2
Hidden Processes: 3
Hidden Connections: 2 (C2: 198.51.100.47)
Modified Binaries: 3 (/usr/bin/ps, netstat, ls)
Risk Level: CRITICAL