Здравейте на всички. Активно се включваме в работата и вече през януари подготвяме много мощни стартирания. Между другото, обявен е набор за нов поток от обичания от всички курс. В навечерието на старта традиционно споделяме превода на полезен материал.

Файловите разрешения предлагат безопасна алтернатива на изпълнимите файлове SUID, но на пръв поглед могат да изглеждат малко объркващи.
Всички знаем, че двоичните файлове термините „primary/secondary“. За щастие, ако на приложението ви са необходими определени ограничени привилегии, съществува по-ефективен метод, наречен .
Ще спестя време, ако искате да избегнете подробно четене на горната статия: същността е, че файловите разрешения позволяват на процесите, които се изпълняват от името на потребителя root и следователно имат право да правят каквото и да е, да запазват определени възможности, ограничени когато освобождават привилегиите си и се стартират като неприлаган потребител. Това означава, че ако нападателят успее да компрометира процеса с помощта на буферно препълване или друг експлоит, той няма да може да се възползва от нищо освен определените минимални привилегии, от които наистина се нуждае процесът.
Разрешенията са отлични за услуги, които обикновено винаги се стартират от името на потребителя root, но какво ще кажете за командните утилити? За щастие, това също е подкрепяно, при условие че имате инсталирани правилните утилити. Например, ако използвате Ubuntu, ще ви е необходим пакетът libcap2-bin.Също така ще трябва да стартирате не архаично ядро (от версия 2.6.24).
Тези функции позволяват свързването на разрешения с изпълними файлове аналогично настройването на бита SUID, но само за определен набор от разрешения. Утилитата setcap се използва за добавяне и премахване на разрешения от файла.
Първата стъпка е да изберете необходимите разрешения. За тази статия приемам, че съществува инструмент за диагностика на мрежата, наречен tracewalk,който трябва да може да използва Обикновено за това е необходимо приложението да се стартира от името на потребителя root, но при преглед на изяснява се, че е нужно само разрешение 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разглежда всичко това по-подробно, но, надявам се, този пост малко демистифицировa случващото се. Остана да спомена само няколко предупреждения и трикове.
Първо, файловите способности не работят с симлинкове — трябва да ги приложите към самия бинарен файл (т.е. към целта на симлинка).
На второ място, те не работят с интерпретируеми скриптове. Например, ако имате 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
