Teo de Raadt, hücum səthini azaltmaq üçün OpenBSD-yə yeni bir mexanizm daxil etməyi təklif etdi və bu mexanizm openat sistem çağırışını genişləndirməklə həyata keçirildi. "/" vasitəsilə yuxarı qovluqlara keçmək və mütləq yollara daxil olmaq imkanını məhdudlaşdıran openat və open üçün əlavə bayraqlar tətbiq edən yamalar baza sistemindəki nüvə, libc və bəzi tətbiqlər üçün hazırlanmışdır. Dəyişikliklər hələ OpenBSD-current-ə daxil edilməyib və hazırda tərtibatçılar arasında müzakirə olunur.
Sistem çağırışlarının openat(2) ailəsi open(2) kimi davranır, lakin "path" parametri nisbidirsə, açılacaq fayl cari işləyən qovluqdan daha çox "fd" fayl təsvirçisi ilə əlaqəli qovluğa nisbi olur. Məsələn, openat-a mütləq bir yol ötürsəniz: int dirfd = open("/tmp", O_RDONLY | O_DIRECTORY); int hfd = openat(dirfd, "/etc/hosts", O_RDONLY);
openat() funksiyası "dirfd"-i nəzərə almayacaq və nəticədə mütləq yol normal şəkildə işlənəcək.
Buna görə də, open() funksiyasını openat() funksiyası ilə əvəz etmək öz-özlüyündə proqram təhlükəsizliyini artırmır. Bu çağırış yolun təhlilini sürətləndirə bilər, lakin fayl sisteminə girişi məhdudlaşdırmır. Mütləq yolları qadağan edən bayraqlar (məsələn, openat2 üçün RESOLVE_BENEATH və/və ya RESOLVE_IN_ROOT) Linux): proqramçı onları bütün müvafiq çağırışlara əlavə etməlidir və prosesin nəzarətini ələ keçirərkən təcavüzkar faylları açmaq üçün başqa yollardan istifadə edə bilər.
openrsync yardım proqramı üzərində işləyərkən Teo fayl sistemini gəzmə imkanlarını məhdudlaşdırmalı idi, lakin bu, uneven() və pledge() funksiyalarından istifadə etməklə mümkün deyildi. Daha sonra openat()-a bənzər, lakin pledge/unveil funksiyasını tamamlayan və ya hətta onlar olmadıqda işləyən təhlükəsizlik xüsusiyyətlərinə malik bir mexanizm düşündü.
Əsas fikir məhdudiyyətləri qovluq təsvirçisinin özünün bir hissəsi etməkdir. Buna nail olmaq üçün fcntl() vasitəsilə təyin edilə bilən F_BELOW bayrağını və ya open() üçün O_BELOW bayrağını təklif edirik. Bu şəkildə məhdudlaşdırılan "dirfd" təsvirçisi qovluq ağacında yalnız aşağıya doğru keçidlərə icazə verəcək: mütləq yolla openat() çağırışları və ya ".." vasitəsilə yuxarıya doğru keçidlər ENOENT xətası ilə uğursuz olacaq. Kod icra hücumu halında, prosesin fayl təsvirçi cədvəlində hücum səthini məhdudlaşdıran daha az funksional "dirfd"-lər olacaq.
Mənbə: opennet.ru
