GRSecurity & PaX Tutorial ? Disable privileged I/O

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

Disable privileged I/O

którą opisuję poniżej.

W systemie Linux, proces mający odpowiednie uprawnienia (zazwyczaj root) ma możliwość uzyskania dostępu do portów PMIO komputera za pomocą funkcji ioperm/iopl. Porty PMIO to porty urządzeń fizycznych, które obsługiwane za pomocą osobnej szyny danych oraz instrukcji procesora IN oraz OUT. Odróżnia to je od portów MMIO, które są komórkami pamięci RAM, pod które podłączone są urządzenia.

Gdy włączona jest ta opcja zabezpieczeń, każde wywołanie ioperm/iopl zakończy się niepowodzeniem.

Niestety, kilka ważnych programów musi mieć dostęp do portów PMIO, aby poprawnie pracować – przykładem może być XFree86 lub hwclock. Z tym drugim można sobie poradzić poprzez obsługę RTC z poziomu kernela, natomiast z tym pierwszym nie można już sobie poradzić w ogóle. W związku z tym, jeżeli używa się XFree86 nie można stosować tej opcji zabezpieczeń i trzeba chronić się systemem RBAC opisanym w osobnym artykule.

Na koniec jeszcze tylko wspomnę, gdyż może nie wynikać to wprost z powyższego tekstu, że włączenie tej opcji zabezpieczeń, nie uniemożliwia całkowicie dostępu do portów PMIO. Opcja ta uniemożliwia dostęp do owych portów z poziomu procesów zwykłego użytkownika (user-mode), nawet z uprawnieniami root. Dostęp z poziomu kernel-mode (czyli np. sterowników) jest wciąż możliwy.