Тео де Раадт openat функциясы аркылуу файл системасына кирүүнү чектөө үчүн өзгөртүүлөрдү сунуштады

Тео де Раадт OpenBSDге чабуул бетин азайтуу үчүн жаңы механизмди киргизүүнү сунуштады, ал openat системасынын чакыруусун кеңейтүү менен ишке ашырылат. openat жана open үчүн кошумча желектерди ишке ашырган, "/" аркылуу жогорку каталогдорго өтүү жана абсолюттук жолдорго жетүү мүмкүнчүлүгүн чектеген патчтар ядро, libc жана базалык системадагы айрым тиркемелер үчүн даярдалган. Өзгөртүүлөр азырынча OpenBSD-currentке киргизиле элек жана учурда иштеп чыгуучулар арасында талкууланып жатат.

openat(2) системасынын чакырууларынын үй-бүлөсү open(2) сыяктуу иштейт, бирок эгерде "path" параметри салыштырмалуу болсо, ачыла турган файл учурдагы иштеп жаткан каталогго эмес, "fd" файл дескриптору менен байланышкан каталогго салыштырмалуу болот. Эгерде сиз openatка абсолюттук жолду өткөрүп берсеңиз, мисалы: int dirfd = open("/tmp", O_RDONLY | O_DIRECTORY); int hfd = openat(dirfd, "/etc/hosts", O_RDONLY);

openat() функциясы "dirfd" функциясын этибарга албайт жана натыйжада абсолюттук жол кадимкидей иштетилет.

Ошондуктан, open() функциясын openat() функциясы менен алмаштыруу программанын коопсуздугун жакшыртпайт. Бул чакыруу жолду талдоону тездетиши мүмкүн, бирок файл системасына кирүүнү чектебейт. Абсолюттук жолдорду тыюу салган желекчелер (мисалы, openat2 үчүн RESOLVE_BENEATH жана/же RESOLVE_IN_ROOT) Linux): программист аларды бардык тиешелүү чакырууларга кошушу керек жана процессти башкарууну басып алганда, чабуулчу файлдарды ачуунун башка жолдорун колдоно алат.

openrsync утилитасы менен иштеп жатканда, Тео файл системасын кыдыруу мүмкүнчүлүктөрүн чектөөсү керек болчу, бирок бул uneveil() жана pledge() функцияларын колдонуу менен мүмкүн болгон жок. Андан кийин ал openat() сыяктуу механизмди ойлоп тапкан, бирок pledge/unveil функцияларын толуктап турган же алар жок болгон учурда да иштей турган коопсуздук функциялары бар.

Негизги идея - чектөөлөрдү каталог дескрипторунун өзүнүн бир бөлүгү кылуу. Буга жетүү үчүн биз fcntl() аркылуу орнотула турган F_BELOW желегин же open() үчүн O_BELOW желегин сунуштайбыз. Мындай жол менен чектелген "dirfd" дескриптору каталог дарагында ылдый карай өтүүгө гана мүмкүндүк берет: абсолюттук жол менен openat() чакыруулары же ".." аркылуу өйдө карай өтүү ENOENT катасы менен ишке ашпай калат. Кодду аткаруу чабуулу болгон учурда, процесстин файл дескрипторунун таблицасында чабуулдун бетин чектеген азыраак функционалдуу "dirfd"тер болот.

Source: opennet.ru

DDoS коргоосу, VPS VDS серверлери бар сайттар үчүн ишенимдүү хостинг сатып алыңыз 🔥 DDoS коргоосу, VPS VDS серверлери бар ишенимдүү веб-сайт хостингин сатып алыңыз | ProHoster