Skip to content

dmesg_restrict

kernel.dmesg_restrict, unprivileged kullanıcıların kernel log'unu okumasını engeller ve KASLR/pointer leak'lerine kolay erişimi reddeder.

Mechanism

Note

Kernel ring buffer'ı (dmesg(8), syslog(2) ve /dev/kmsg üzerinden okunur) çoğu zaman KASLR'yi etkisizleştirmek ve exploit kurmak için yararlı kernel pointer'ları, slab/heap adresleri ve oops/WARN çıktısı içerir. dmesg_restrict=0 iken hiçbir kısıtlama yoktur; 1'e set edildiğinde caller'lar buffer'ı okumak için CAP_SYSLOG tutmak zorundadır. Compile-time CONFIG_SECURITY_DMESG_RESTRICT, sysctl'in boot default'unu belirler.

Bu, info leak'lere karşı defense-in-depth olarak kptr_restrict (ham pointer yazdırmayı bastırır) ile birlikte çalışır.

Walkthrough

sysctl -w kernel.dmesg_restrict=1
sysctl kernel.dmesg_restrict       # -> kernel.dmesg_restrict = 1

Unprivileged bir kullanıcı olarak:

$ dmesg
dmesg: read kernel buffer failed: Operation not permitted

CAP_SYSLOG (ya da root) tutan bir process onu hâlâ normal şekilde okur.

kernel.org doc (verbatim)

This toggle indicates whether unprivileged users are prevented from using dmesg(8) to view messages from the kernel's log buffer. When dmesg_restrict is set to 0 there are no restrictions. When dmesg_restrict is set to 1, users must have CAP_SYSLOG to use dmesg(8). The kernel config option CONFIG_SECURITY_DMESG_RESTRICT sets the default value of dmesg_restrict.

Mitigation

Zaten leak olmuş log'ları geriye dönük olarak temizlemez ve CAP_SYSLOG'u meşru şekilde tutan bir process'i durdurmaz. Attacker'lar başka leak primitive'lerine geri döner (kptr_restrict gevşekse /proc/kallsyms, timing/side channel'lar ya da güvenlik açığının kendi info-leak'i). Distro default'ları değişir (Ubuntu bunu etkinleştirir).

References