Skip to content

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:

$ cat /proc/sys/kernel/loadpin/enabled
1
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.

References