Skip to content

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ş bir CR0.WP / CR4.SMEP bit'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:

[ ... ] LKRG: ALERT: Kernel code modification detected!
[ ... ] LKRG: Hash mismatch in .text region <addr>
[ ... ] LKRG: Enforcing policy (kint_enforce=1): restoring / responding

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