GRSecurity & PaX Tutorial – Deny writing to /dev/kmem, /dev/mem, and /dev/port

Po zastosowaniu łaty grsecurity służącej zwiększeniu bezpieczeństwa systemu Linux, menu konfiguracyjne procesu kompilacji kernela dostępne m.in. za pomocą menuconfig zostaje wzbogacone o kilkanaście nowych opcji podzielonych na kilka kategorii. Jedną z kategorii jest

Address Space Protection

służąca do konfiguracji opcji ochrony przestrzeni adresowej. W owej zakładce znajduje się opcja

Deny writing to /dev/kmem, /dev/mem, and /dev/port

którą opisuję poniżej.

W systemie Linux istnieją pliki, które nie są w rzeczywistości plikami, tylko odwzorowaniem fizycznych lub pseudo-fizynych urządzeń. Plik /dev/mem odwzorowuje fizyczną pamięć komputera, plik /dev/kmem odwzorowuje wirtualną pamięć jądra (kernela), a plik /dev/port odwzorowuje porty MMIO komputera. Proces, który ma odpowiednie uprawnienia (zazwyczaj uprawnienia root) może za pomocą tych odwzorowań dostać się do pamięci komputera (w tym kernela) i zagrozić naszemu bezpieczeństwu.

Włączenie tej opcji spowoduje uniemożliwienie zapisu danych za pomocą tych odwzorowań do pamięci komputera, co najczęściej dokonywane jest po wcześniejszym zmapowaniu tych plików do przestrzeni adresowej procesu funkcją mmap. Jeżeli powyższe pliki zostaną zmapowane bez flagi PROT_WRITE, czyli bez pozwolenia na zapis, to nie będzie możliwa późniejsza zmiana flag dostępu za pomocą funkcji mprotect.

Należy pamiętać, że mimo włączenia tego zabezpieczenia, proces może mieć możliwość zakłócenia pracy kernela za pomocą portów I/O dostępnych po wywołaniu funkcji ioperm/iopl. Sposobem na zabezpieczenie się przed tym jest opcja „Disable privileged I/O” opisana w osobnym artykule.

Należy pamiętać również, że XFree86 wykorzystuje /dev/mem w celu zapisu do pamięci wideo, co jest jedyną dopuszczoną możliwością przy włączonej tej opcji zabezpieczenia.

Jest wysoce zalecane, aby w przypadku braku faktycznej konieczności stosowania powyższych plików do uzyskania dostępu do pamięci, wybrać tą opcję zabezpieczenia.