Ўсім прывітанне. Мы актыўна ўліваемся ў работу і ўжо ў студзені рыхтуем шмат магутных запускаў. Сярод іншых, абвешчаны набор на новы струмень упадабанага ўсім курсу
Файлавыя дазволы прапануюць бяспечную альтэрнатыву выкананым файлам SUID, але могуць здацца трохі заблытанымі на першы погляд.
Усе мы ведаем, што двайковыя файлы
Я зэканомлю вам час, калі вы жадаеце пазбегнуць падрабязнага чытання артыкула вышэй: у сутнасці, файлавыя дазволы дазваляюць працэсам, якія запускаюцца ад імя root-карыстача і, такім чынам, маюць права штосьці рабіць, захоўваць вызначаныя магчымасці, абмежаваныя.
Дазволы выдатна падыходзяць для сэрвісаў, якія звычайна заўсёды запускаюцца ад імя root-карыстача, але як наконт утыліт каманднага радка? На шчасце, гэта таксама падтрымліваецца пры ўмове, што ў вас устаноўлены правільныя ўтыліты. Калі вы карыстаецеся Ubuntu, вам, напрыклад, спатрэбіцца пакет libcap2-bin
. Вам таксама трэба будзе запусціць ня архаічнае ядро (пачынаючы з версіі 2.6.24).
Гэтыя функцыі дазваляюць звязваць дазволы з выкананымі файламі аналагічна наладзе біта SUID, але толькі для вызначанага набору дазволаў. Утыліта 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
На гэтым этапе вы павінны мець магчымасць запускаць выкананы файл як непрывілеяваны карыстач, і ён павінен мець магчымасць працаваць з неапрацаванымі сокетамі, але не мець ніякіх іншых прывілеяў, якімі валодае root-карыстач.
Такім чынам, што азначае гэты дзіўны суфікс =eip
? Тут спатрэбіцца доля разумення прыроды дазволаў. Кожны працэс мае тры наборы дазволаў. эфектыўныя, спадчынныя і даступныя (effective, inheritable і permitted):
- Эфектыўныя (Effective) дазволы - гэта тыя, якія вызначаюць, што працэс можа на самой справе рабіць. Напрыклад, ён не можа мець справу з неапрацаванымі сокетамі, калі
CAP_NET_RAW
не знаходзіцца ў эфектыўным наборы. - Даступныя (Permitted) дазволы - гэта тыя, якія дазволена мець працэсу, калі ён запытвае іх з дапамогай адпаведнага выкліку. Яны не дазваляюць працэсу фактычна штосьці рабіць, калі толькі ён не быў спецыяльна напісаны для запыту названага дазволу. Гэта дазваляе пісаць працэсы для дадання асоба важных дазволаў у эфектыўны набор толькі на той перыяд, калі яны сапраўды патрабуюцца.
- Успадкоўваныя (Inheritable) дазволы - гэта тыя, якія могуць быць атрыманы ў спадчыну ў даступным наборы спароджанага даччынага працэсу. Падчас аперацыі
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
Па-першае, файлавыя магчымасці не працуюць з сімлінкамі - вы павінны прымяніць іх да самага двайковага файла (гэта значыць да мэты сімлінка).
Па-другое, яны не працуюць з інтэрпрэтаванымі скрыптамі. Напрыклад, калі ў вас ёсць скрыпт Python, якому вы жадаеце прызначыць дазвол, вы павінны прызначыць яго самому інтэрпрэтатару Python. Відавочна, што гэта патэнцыйная праблема бяспекі, таму што тады ўсе скрыпты, якія выконваюцца з гэтым інтэрпрэтатарам, будуць мець паказаны дазвол, хоць гэта ўсё ж значна лепш, чым зрабіць SUID. Найболей распаўсюджаны абыходны шлях, відаць, складаецца ў напісанні асобнага выкананага файла на C ці аналогу, які можа выконваць неабходныя аперацыі і выклікаць яго са скрыпту. Гэта падобна на падыход, які выкарыстоўваецца Wireshark, які выкарыстоўвае двайковы файл /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
, Каб прымусіць сваю бібліятэку выклікацца ў перавазе перад сістэмнай, і, такім чынам, мець уласны адвольны код, які выконваецца з тымі ж прывілеямі, што і выклікае дадатак.
На гэтым усё. Падрабязна аб праграме курса, можна будзе даведацца на
Крыніца: habr.com