Linux Kernel Runtime Guard¶
Çalışan kernel'e ve process credential'larına yapılan yetkisiz değişiklikleri post-detect eden, sonra isteğe bağlı yanıt veren out-of-tree yüklenebilir bir kernel module'ü (LKRG) — değiştirilmemiş bir kernel'in üzerine katmanlanmış bir defense-in-depth tripwire'ı.
Mechanism¶
Neden çalışır
Çoğu kernel mitigation'ı compromise'den önce hardening yapar (KASLR, SMEP, CFI). LKRG farklı bir niş işgal eder: bir exploit'in yine de başarılı olabileceğini varsayar ve "çalışan Linux kernel'ine yapılan yetkisiz modifikasyonları post-detect etmeyi ve umulur ki hızla yanıt vermeyi" amaçlar. Meşru kernel operasyonunun koruduğu ama exploit'lerin rutin olarak ihlal ettiği iki invariant'a dayanır:
-
Integrity invariant'ı. Kernel'in kendi kodu (
.text), kritik read-only data'sı ve CPU control state'i runtime'da stabil'dir. LKRG bu bölgeleri snapshot'lar ve hash'ler ve onları periyodik olarak ve anahtar event'lerde yeniden doğrular; herhangi bir drift (patch'lenmiş bir fonksiyon, çevrilmiş birCR0.WP/CR4.SMEPbit'i, hook'lanmış bir syscall table'ı) tampering'in sinyalidir. Bu, integrity-checking (kint) bileşenidir. -
Credentials invariant'ı. Bir task'ın privilege'ı (uid/gid, capability'ler, LSM label'ı) yalnızca onaylanmış path'ler üzerinden değişir. LKRG per-task credential state'ini izler ve kernel credential'lar üzerinde işlem yapmak üzereyken onları kendi shadow kaydına karşı kontrol eder — kernel erişim vermeden önce klasik "exploit
cred'i uid 0'a overwrite etti" escalation'ını yakalar. Bu, exploit-detection (process-integrity, pint) bileşenidir.
Yalnızca bu invariant'lara dayandığı için LKRG bir patch değil, module'dür: "geniş bir mainline ve distro kernel yelpazesi için build edilebilir ve onların üzerine, onları patch'lemeye gerek olmadan yüklenebilir." x86-64, 32-bit x86, AArch64 (ARM64) ve 32-bit ARM'ı destekler.
Walkthrough¶
1. Module'ü build et ve yükle. LKRG lkrg.ko olarak gelir:
$ sudo apt install build-essential libelf-dev linux-headers-$(uname -r)
$ make
$ sudo insmod lkrg.ko
$ dmesg | grep -i lkrg
[ ... ] LKRG: Loaded; integrity & exploit detection active
2. Enforcement'ı lkrg.* sysctl'leri üzerinden ayarla. Her ihlal sınıfının bir
0–2 enforcement level'ı vardır — 0 = yalnızca log, 1 = seçici yanıt (task'ı kill et /
state'i geri yükle), 2 = kernel panic:
# how to act on global kernel integrity violations:
$ sudo sysctl lkrg.kint_enforce=1
# how to act on process-credential violations:
$ sudo sysctl lkrg.pint_enforce=2
# response to SMEP bit being cleared:
$ sudo sysctl lkrg.smep_enforce=2
# periodic integrity-check interval (seconds, 5..1800):
$ sudo sysctl lkrg.interval=15
# force an immediate global integrity check:
$ sudo sysctl lkrg.trigger=1
Simüle edilmiş bir kernel-integrity ihlalini tespit etmek
lkrg.kint_enforce=1 ile, write-protect'i temizleyip bir kernel fonksiyonunu
patch'leme girişimi bir sonraki validation pass'inde yakalanır:
Prevention değil, detection — ve ayarlanabilir
LKRG temelde post-detection'dır: modifikasyonları ve kötü credential'ları oluştuktan
sonra yakalar ve kernel onlar üzerinde işlem yapmadan önce yanıt vermek için race
eder. Upstream, "mild enforcement ile başlamayı ve yalnızca false positive
görmediğini doğruladıktan sonra daha sıkı enforcement'ı etkinleştirmeyi" tavsiye
eder, çünkü proje hâlâ experimental olarak etiketlidir ve false positive'ler
mümkündür. *_enforce=2'yi (panic) yalnızca kendi workload'unda doğruladıktan
sonra ayarla.
Detection¶
LKRG bir detection aracıdır; kendi çıktısı (dmesg LKRG: ALERT satırları ve lkrg.*
sysctl state'i) sinyaldir. LKRG'nin kendisini kurcalamak ya da unload etmek bilinen
bir sınırlamadır — onu module-loading kısıtlamalarıyla eşleştir.
Mitigation¶
(Residual risk / bypass.) LKRG bilinen invariant'ları bir timer'da ve hook noktalarında doğrular, yani hasarını verip state'i validation pass'leri arasında geri alan ya da LKRG'nin kapsamadığı state'i hedefleyen bir exploit ondan kaçabilir. Sofistike saldırganlar ayrıca payload'u tetiklemeden önce LKRG'yi devre dışı bırakmaya da çalışabilir. strict kernel RWX ve grsecurity/AUTOSLAB gibi in-tree hardening'i tamamlar — yerini almaz.
References¶
- Openwall. LKRG - Linux Kernel Runtime Guard (project site). — https://lkrg.org/
- lkrg-org. LKRG source, build and sysctl reference (GitHub). — https://github.com/lkrg-org/lkrg