Theo de Raadt zaproponował zmiany w celu ograniczenia dostępu do FS za pomocą funkcji openat

Theo de Raadt zaproponował włączenie do OpenBSD nowego mechanizmu mającego na celu zmniejszenie powierzchni ataku, zrealizowanego poprzez rozszerzenie możliwości wywołania systemowego openat. Łaty implementujące dodatkowe flagi dla openat i open, ograniczające możliwość przechodzenia do katalogów nadrzędnych przez „/..” oraz korzystania z absolutnych ścieżek, zostały przygotowane dla jądra, libc oraz niektórych aplikacji z podstawowego systemu. Zmiany wciąż nie zostały włączone do OpenBSD-current i są na etapie dyskusji wśród deweloperów.

Rodzina wywołań systemowych openat(2) działa jako odpowiednik open(2), z wyjątkiem tego, że jeśli w parametrze „path” podana jest ścieżka względna, otwierany plik jest określany względem katalogu powiązanego z deskryptorem pliku „fd”, a nie względem bieżącego katalogu roboczego. Jeśli przekażesz do openat ścieżkę absolutną, na przykład: int dirfd = open(„/tmp”, O_RDONLY | O_DIRECTORY); int hfd = openat(dirfd, „/etc/hosts”, O_RDONLY);

Funkcja openat() zignoruje „dirfd” i w konsekwencji, ścieżka absolutna zostanie przetworzona w standardowy sposób.

Zatem sama wymiana open() na openat() nie wzmacnia bezpieczeństwa programu. Takie wywołanie może przyspieszyć analizę ścieżki, ale nie ogranicza dostępu do systemu plików. Flagi zabraniające użycia absolutnych ścieżek (np. RESOLVE_BENEATH i/lub RESOLVE_IN_ROOT dla openat2 w Linux) również nie gwarantują ochrony: programista musi dodawać je do wszystkich odpowiednich wywołań, a przy przejęciu kontroli nad procesem, atakujący może wykorzystać inne ścieżki otwierania plików.

Podczas pracy nad narzędziem openrsync Theo napotkał konieczność ograniczenia jej możliwości w zakresie obejścia systemu plików, jednak nie udało się tego zrobić przy pomocy funkcji unveil() i pledge(). Wówczas pojawił się pomysł mechanizmu podobnego do openat(), ale z właściwościami bezpieczeństwa, uzupełniającymi pledge/unveil lub nawet działającymi w ich braku.

Główna idea polega na uwzględnieniu ograniczeń jako część samego deskryptora katalogu. Proponowane jest użycie flagi F_BELOW, która może być ustawiona za pomocą fcntl(), lub flagi O_BELOW dla open(). Ograniczony w ten sposób deskryptor „dirfd” będzie zezwalał jedynie na przejścia w dół drzewa katalogów: wywołania openat() z absolutną ścieżką lub z przejściem w górę przez „..” będą kończyć się błędem ENOENT. W przypadku ataku prowadzącego do wykonania kodu, tabela deskryptorów plików procesu będzie zawierać mniej funkcjonalne „dirfd”, co ograniczy powierzchnię ataku.

Źródło: opennet.ru

Kup niezawodny hosting stron z ochroną DDoS, serwery VPS VDS 🔥 Kup niezawodny hosting stron z ochroną DDoS, serwery VPS VDS - ProHoster