LoadPin¶
Kernel'in yüklediği her dosyayı (module, firmware vb.) tek bir değiştirilemez read-only "pinned" filesystem'den gelmeye zorlayan bir Linux Security Module.
Mechanism¶
Note
LoadPin bir origin invariant uygular: kernel bir filesystem'den ilk
dosyasını okuduktan sonra, tüm sonraki kernel-loaded dosyaların aynı
filesystem'den gelmesi gerekir. Pinned root'un read-only bir block device
üzerinde (CDROM ya da içeriği kriptografik olarak integrity-check'ten geçen
bir dm-verity volume) yaşaması beklenir. Güvenlik argümanı şu: saldırgan
pinned device'ı değiştiremiyorsa, bir load talep edebilecek ayrıcalıklara
sahip olsa bile kernel_read_file() yolundan kötü niyetli bir kernel module
ya da firmware blob'u kaçıramaz.
LoadPin, kernel'in kernel_read_file ailesine hook takar (aynı enumeration
include/linux/kernel_read_file.h içinde kernel-module, firmware,
kexec-image, kexec-initramfs, policy, x509-certificate vb. kapsar).
Yüklenen ilk dosya pinned filesystem'i belirler; sonraki her load buna karşı
kontrol edilir. Device read-only olduğundan, pinned set boot anında fiilen
donmuş olur.
LoadPin imza tabanlı şemaları tamamlar niteliktedir: belirli dosya tiplerini
pinning'den exclude edip onları
module signature enforcement ya da
CONFIG_KEXEC_VERIFY_SIG ile kapsayabilir, geri kalanı LoadPin'e koruttabilirsin.
Walkthrough¶
Build-time: LSM'i etkinleştir.
CONFIG_SECURITY_LOADPIN=y
# optional: pin enforcement on by default at boot
CONFIG_SECURITY_LOADPIN_ENFORCE=y
Boot-time parametreleri davranışı kontrol eder:
loadpin.enforce=1 # enforce (default when built)
loadpin.exclude=kernel-module,kexec-image # let other schemes verify these
Warning
LoadPin, gördüğü ilk dosyada pinning'e başlar. Erken userspace'in,
read-only device mount edilmeden önce writable bir rootfs'ten bir şey
yüklerse, o writable filesystem pinned root olur ve koruma değersiz hale
gelir. Invariant'ın geçerli olması için pinned filesystem read-only olmalı
(örn. dm-verity).
Mutable bir filesystem üzerinde bir sysctl, pinning'i runtime'da açıp kapatır; okumalar pinning'in aktif olup olmadığını bildirir:
Pinned origin'i doğrulamak
Kernel mesajları pin'in nerede kurulduğunu doğrular ve off-device load'ları reddeder:
$ dmesg | grep -i loadpin
LoadPin: ready to pin (currently enforcing)
LoadPin: dm-verity root device ...
LoadPin: kernel-module denied obtaining 'evil.ko' ...
Tam string'ler kernel sürümüne göre değişir; önemli olan, reddedilen bir load'un dosyanın pinned filesystem'den gelmediği anlamına gelmesidir.
Detection¶
LSM'in aktif ve enforcing olduğunu kontrol et: çalışan config'de
CONFIG_SECURITY_LOADPIN, /sys/kernel/security/lsm içinde loadpin'in
mevcut olması ve /proc/sys/kernel/loadpin/enabled'ın 1 okuması. Reddedilen
load'lar dmesg üzerinden loglanır.
Mitigation¶
LoadPin kendisi bir mitigation'dır. Doğal olarak
module signature enforcement (izin verdiğin
module'leri imzala) ve kernel lockdown ile birlikte çalışır. loadpin.exclude'u
yalnızca bağımsız bir doğrulama mekanizmasıyla zaten kapsanan dosya tipleri için
kullan.