Здраво свима. Активно улазимо у посао и већ припремамо многа моћна лансирања у јануару. Између осталог, најављен је упис за нови стрим свима омиљених курсева.
Дозволе за датотеке нуде безбедну алтернативу извршним СУИД датотекама, али у почетку могу изгледати мало збуњујуће.
Сви знамо да бинарности
Уштедећу вам мало времена ако желите да избегнете детаљно читање горњег чланка: У суштини, дозволе за фајл дозвољавају процесе који се покрећу као роот и стога им је дозвољено да ураде нешто да задрже одређене могућности, ограничене
Дозволе су одличне за услуге које обично увек раде као роот, али шта је са услужним програмима командне линије? Срећом, ово је такође подржано под условом да имате инсталиране одговарајуће услужне програме. Ако користите Убунту, биће вам потребан пакет libcap2-bin
. Такође ћете морати да покренете не-архаично језгро (од верзије 2.6.24).
Ове функције дозвољавају да се дозволе придруже извршним датотекама, слично постављању бита СУИД, али само за одређени скуп дозвола. Корисност setcap
користи се за додавање и уклањање дозвола из датотеке.
Први корак је да изаберете дозволе које су вам потребне. Зарад овог чланка, претпостављам да постоји алатка за дијагностику мреже која се зове tracewalk
, који би требало да буде у стању да користи CAP_NET_RAW
.
Под претпоставком да се налазите у директоријуму где се налази бинарни фајл tracewalk
, можете додати ову дозволу овако:
sudo setcap cap_net_raw=eip tracewalk
Занемарите суфикс за сада =eip
за решење, причаћу о томе за пар секунди. Имајте на уму да је назив дозволе написан малим словима. Сада можете да проверите да ли сте исправно конфигурисали дозволе са:
setcap -v cap_new_raw=eip tracewalk
Или можете навести све дозволе постављене за дату извршну датотеку:
getcap tracewalk
За референцу, такође можете уклонити све дозволе из извршног фајла са:
setcap -r tracewalk
У овом тренутку, требало би да будете у могућности да покренете извршни фајл као непривилеговани корисник, и требало би да буде у стању да ради са сировим утичницама, али не и друге привилегије које има роот корисник.
Дакле, шта значи овај чудни суфикс? =eip
? Ово захтева извесно разумевање природе дозвола. Сваки процес има три скупа дозвола − делотворан, наследан и дозвољен:
- Ефективно Дозволе су оне које дефинишу шта процес заправо може да уради. На пример, не може да се бави сировим утичницама ако
CAP_NET_RAW
није у ефективном скупу. - Доступан дозволе су оне које процесу сме да има ако их захтева помоћу одговарајућег позива. Они спречавају процес да заиста уради било шта осим ако није посебно написано да тражи поменуту дозволу. Ово омогућава да се напишу процеси за додавање критичних дозвола ефективном скупу само за период када су оне заиста потребне.
- Насљедно дозволе су оне које се могу наследити у приступачном скупу покренутог подређеног процеса. Током операције
fork()
илиclone()
подређеном процесу се увек даје копија дозвола родитељског процеса пошто у том тренутку још увек покреће исту извршну датотеку. Наследни скуп се користи кадаexec()
(или еквивалентан) се позива да замени извршну датотеку другом. У овом тренутку, доступни скуп процеса је маскиран наследним скупом да би се добио приступачни скуп који ће се користити за нови процес.
Дакле, корисност setcap
омогућава нам да додамо дозволе ова три скупа независно за дату извршну датотеку. Имајте на уму да се значење група тумачи мало другачије за дозволе за датотеке:
- На располагању Дозволе за датотеке су оне које су увек доступне извршној датотеци, чак и ако их родитељски процес који ју је позвао није имао. Некада су се звале „принудне“ дозволе.
- Наслеђено дозволе датотеке дефинишу додатну маску која се такође може користити за уклањање дозвола из скупа процеса позива. Примењују се као додатак наслеђеном скупу процеса позивања, тако да се дозвола наслеђује само ако постоји у оба скупа.
- Ефективно дозволе за фајл су заправо само један бит, а не скуп, и ако су постављене, то значи да се цео доступни скуп такође копира у ефективни скуп новог процеса. Ово се може користити за додавање дозвола процесима који нису посебно написани да их захтевају. Пошто је један бит, ако га поставите за било коју дозволу, мора бити подешен за све дозволе. Можете га сматрати застарелим битом јер се користи да дозволи да користе дозволе апликацијама које их не подржавају.
Приликом навођења дозвола путем setcap
три слова e
, i
и p
погледајте делотворан, наследан и доступан скупова респективно. Дакле, ранија спецификација:
sudo setcap cap_net_raw=eip tracewalk
...указује да је резолуција CAP_NET_RAW
мора бити додат доступним и наследним скуповима и да се ефективни бит такође мора поставити. Ово ће заменити све претходно постављене дозволе за датотеку. Да бисте поставили више дозвола одједном, користите листу раздвојену зарезима:
sudo setcap cap_net_admin,cap_net_raw=eip tracewalk
Прво, могућности датотеке не функционишу са симболичким везама - морате их применити на саму бинарну датотеку (тј. циљ симболичне везе).
Друго, не раде са интерпретираним скриптама. На пример, ако имате Питхон скрипту којој желите да доделите дозволу, морате је доделити самом Питхон тумачу. Очигледно је ово потенцијални безбедносни проблем јер ће тада све скрипте које се извршавају са тим тумачем имати наведену дозволу, иако је то ипак знатно боље него да буде СУИД. Чини се да је најчешће заобилазно решење да се напише засебан извршни програм у Ц или еквивалент који може да изврши неопходне операције и да га позове из скрипте. Ово је слично приступу који користи Виресхарк који користи бинарни фајл /usr/bin/dumpcap
за обављање привилегованих операција:
$ getcap /usr/bin/dumpcap
/usr/bin/dumpcap = cap_net_admin,cap_net_raw+eip
Треће, дозволе за датотеке су онемогућене ако користите променљиву окружења LD_LIBRARY_PATH
из очигледних безбедносних разлога(1). Исто важи и за LD_PRELOAD
, колико ја знам.
1. Пошто нападач очигледно може заменити једну од стандардних библиотека и користити LD_LIBRARY_PATH
да присили своју библиотеку да буде позвана у односу на системску, и да стога има сопствени произвољни код који се извршава са истим привилегијама као и апликација која позива.
То је све. Више детаља о програму курса можете пронаћи на
Извор: ввв.хабр.цом