kernel-security について
セキュリティエンジニアやカーネル開発者向けのLinuxカーネルセキュリティガイドです。アクセス制御、システムコールのサンドボックス化、ハードウェア緩和策、メモリ検査、CVE影響分析を扱います。
主な機能
- 01SELinuxとAppArmorのポリシー作成
- 02seccomp-bpfによるシステムコール制限
- 03KASLRとハードウェア緩和策の確認
- 04KASANやKMSANなどの検査機能の有効化
- 05カーネルCVEの影響評価
活用シーン
- 01サービスの強制アクセス制御の設定
- 02プロセス用システムコールサンドボックスの構築
- 03ディストリビューションへのカーネル脆弱性の影響評価
- 04テストカーネルでのメモリエラー検出
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ mohitmishra786/ low-level-dev-skills --skill kernel-securityインストール後、Claude Code で/kernel-securityを入力して読み込まれたか確認します。
詳細
カーネルセキュリティ
目的
Linux カーネルセキュリティに関するエージェント向けガイドです。LSM フレームワーク(SELinux、AppArmor)、libseccomp を使った seccomp-bpf、KASLR とその回避策への対策、Intel CET(シャドウスタック+IBT)、ARM PAC と BTI、カーネルサニタイザー(KASAN、KMSAN)、カーネル脆弱性の CVE トリアージを扱います。
使用する場面
- 制限対象サービス向けの SELinux または AppArmor ポリシーを作成する
- seccomp-bpf フィルターでプロセスをサンドボックス化する
- CET、PAC、または BTI でバイナリを強化する
- 脆弱性調査用のカーネルビルドで KASAN を有効にする
- 使用中のディストリビューション/カーネルバージョンに対するカーネル CVE の影響をトリアージする
- コンテナーまたはマイクロサービスのセキュリティ境界を設計する
ワークフロー
1. LSM フレームワークの概要
Application syscall
→ DAC (uid/gid, file mode)
→ LSM hook (SELinux/AppArmor/Yama/...)
→ Capability check
→ seccomp filter
→ Kernel
# Active LSM
cat /sys/kernel/security/lsm
# common: lockdown,capability,yama,apparmor,safesetid
2. SELinux ポリシー
# Check SELinux status
getenforce
sestatus
# Context of file/process
ls -Z /usr/sbin/nginx
ps -eZ | grep nginx
# Audit denials
ausearch -m avc -ts recent
sealert -a /var/log/audit/audit.log
ポリシーモジュールの例:
# myapp.te
policy_module(myapp, 1.0.0)
type myapp_t;
type myapp_exec_t;
type myapp_log_t;
init_daemon_domain(myapp_t, myapp_exec_t)
allow myapp_t myapp_log_t:file { create write append open };
allow myapp_t self:tcp_socket { create bind listen accept };
checkmodule -M -m -o myapp.mod myapp.te
semodule_package -o myapp.pp -m myapp.mod
semodule -i myapp.pp
3. AppArmor プロファイル
# Generate complain-mode profile
aa-genprof /usr/bin/myapp
# Enforce
aa-enforce /etc/apparmor.d/usr.bin.myapp
# Check status
aa-status
# /etc/apparmor.d/usr.bin.myapp
#include <tunables/global>
/usr/bin/myapp {
#include <abstractions/base>
/usr/bin/myapp mr,
/var/log/myapp.log w,
/etc/myapp/config r,
network bind tcp,
deny /etc/shadow r,
}
4. libseccomp を使った seccomp-bpf
#include <seccomp.h>
int sandbox(void) {
scmp_filter_ctx ctx = seccomp_init(SCMP_ACT_KILL_PROCESS);
// Allow read/write/exit/mmap
seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(read), 0);
seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(write), 0);
seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(exit_group), 0);
seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(mmap), 0);
seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(brk), 0);
// Return EPERM instead of kill for open
seccomp_rule_add(ctx, SCMP_ACT_ERRNO(EPERM), SCMP_SYS(open), 0);
seccomp_rule_add(ctx, SCMP_ACT_ERRNO(EPERM), SCMP_SYS(openat), 0);
return seccomp_load(ctx);
}
# Export BPF filter for audit
scmp_filter_ctx ctx = ...;
seccomp_export_bpf(ctx, fd);
# strace to find needed syscalls before tightening
strace -c ./myapp
5. KASLR
# Check KASLR enabled
cat /proc/sys/kernel/randomize_va_space # 2 = full
dmesg | grep KASLR
# Kernel cmdline
grep kaslr /proc/cmdline
KASLR 情報漏えいへの対策:
- 信頼できないユーザーには
/proc/<pid>/mapsを公開しない %pKprintk でポインターをハッシュ化する- 非特権ユーザーによる eBPF の使用を制限する
6. Intel CET
# Compile with CET
gcc -fcf-protection=full -o app app.c
# Verify shadow stack and IBT
readelf -n app | grep -E 'SHSTK|IBT'
readelf --notes app | grep -A2 GNU_PROPERTY
| 機能 | 防御対象 |
|---|---|
| SHSTK(シャドウスタック) | ROP によるリターンアドレスの上書き |
| IBT(間接分岐追跡) | ENDBR 以外をターゲットとする CALL/JMP |
CET 対応 CPU(Intel Tiger Lake 以降、シャドウスタックをサポートする CPU の AMD Zen 3 以降)と、CET 対応カーネルが必要です。
7. ARM PAC と BTI
# GCC/Clang branch protection
gcc -mbranch-protection=standard -o app app.c
# PAC (pointer authentication) + BTI (branch target identification)
# Verify
readelf -n app | grep -E 'GNU_PROPERTY_AARCH64_FEATURE_1'
llvm-objdump -d app | grep bti
PAC は暗号鍵を使ってリターンアドレスとポインターに署名します(ARMv8.3 以降)。 BTI は有効な分岐先をマークし、無効なジャンプが発生するとフォールトになります。
8. カーネルメモリーのタグ付け
# KASAN kernel build
# CONFIG_KASAN=y in kernel .config
make menuconfig # Kernel hacking → KASAN
# Boot with KASAN kernel
# Reports use-after-free, OOB with stack trace
# KMSAN (uninitialized memory)
# CONFIG_KMSAN=y — kernel equivalent of MSan
# KASAN report example fields
# BUG: KASAN: slab-out-of-bounds in ...
# Call trace: ...
9. CVE トリアージのワークフロー
# Check kernel version
uname -r
# Distro security tracker
# Ubuntu: ubuntu-security-notices
# RHEL: errata
# NVD lookup
# https://nvd.nist.gov/vuln/detail/CVE-XXXX-XXXXX
# Is patch backported?
zgrep -l CVE-2024-XXXX /usr/share/doc/linux-*/changelog.Debian.gz
トリアージのチェックリスト:
- 影響を受けるサブシステムはどれですか(net、fs、drivers)?
- エクスプロイトはローカルですか、それともリモートですか?
- 使用中のカーネルバージョンで修正されていますか?
- パッチを適用せずにできる緩和策はありますか(モジュールの無効化、sysctl など)?
よくある問題
| 症状 | 原因 | 解決策 |
|---|---|---|
| SELinux による拒否 | allow ルールが不足している | audit2allow を使い、ポリシーを調整する |
| AppArmor プロファイルの不具合 | パスが一致しない | プロファイルのパスを更新し、glob を使う |
| seccomp がアプリを終了させる | システムコールが不足している | strace を使い、allow ルールを追加する |
| CET が有効にならない | CPU/カーネルが古い | /proc/cpuinfo のフラグを確認する |
| KASAN によるカーネルの低速化 | 2~5 倍のオーバーヘッド | テスト用 VM でのみ使用する |
| 誤った安心感 | カーネルのバグを利用した LSM の回避 | 多層防御を徹底し、カーネルを最新の状態に保つ |
関連スキル
skills/virtualization/containers-internals— コンテナーの seccomp と capabilitiesskills/runtimes/binary-hardening— ユーザー空間の CET、RELRO、PIEskills/runtimes/sanitizers— ユーザー空間における ASan/HWASan の対応機能skills/observability/ebpf— LSM BPF プログラムskills/kernel/kernel-debugging— KASAN レポートの分析skills/security/reverse-engineering— エクスプロイトの分析
コメント
Markdown 対応