Ahoj všichni. Aktivně se zapojujeme do práce a už v lednu připravujeme mnoho silných spuštění. Mezi nimi zahajujeme nový běh oblíbeného kurzu. V předvečer spuštění tradičně sdílíme překlad užitečného materiálu.

Souborová oprávnění nabízejí bezpečnou alternativu ke spuštěným SUID souborům, ale na první pohled se mohou zdát trochu matoucí.
Všichni víme, že binární soubory Komitě IETF (Internet Engineering Task Force), která se zabývá rozvojem protokolů a architektury internetu, Naštěstí, pokud vaše aplikace vyžaduje určitá omezená oprávnění, existuje efektivnější způsob, zvaný .
Ušetřím vám čas, pokud se chcete vyhnout podrobnému čtení výše uvedeného článku: v podstatě souborová oprávnění umožňují procesům, které běží pod uživatelským jménem root, a tedy mají právo cokoli dělat, uchovat si určité možnosti, omezené když se zbaví oprávnění a spustí se jako neprivilegovaný uživatel. To znamená, že pokud se útočníkovi podaří kompromitovat proces pomocí přetečení vyrovnávací paměti nebo jiného zneužití, nebude schopen využít nic jiného než určité minimální oprávnění, která jsou opravdu potřebná pro proces.
Oprávnění jsou skvělá pro služby, které obvykle běží pod uživatelským jménem root, ale co příkazové řádky? Naštěstí je to také podporováno, pokud máte nainstalovány správné nástroje. Pokud používáte Ubuntu, budete potřebovat balíček libcap2-bin.Také budete potřebovat moderní jádro (od verze 2.6.24).
Tyto funkce umožňují spojení oprávnění se spustitelnými soubory podobně jako nastavení bitu SUID, ale pouze pro určitý soubor oprávnění. Nástroj setcap se používá k přidání a odebrání oprávnění ze souboru.
Prvním krokem je vybrat požadovaná oprávnění. Pro tento článek předpokládám, že existuje diagnostický nástroj sítě zvaný tracewalk,který by měl umět používat Obvykle pro to vyžaduje, aby aplikace běžela pod uživatelským jménem root, ale při prohlížení. zjistí se, že je potřeba pouze oprávnění CAP_NET_RAW.
Předpokládáme, že se nacházíte v adresáři, kde se nachází binární soubor tracewalk,, můžete toto oprávnění přidat následujícím způsobem:
sudo setcap cap_net_raw=eip tracewalk Prozatím ignorujte sufix =eip pro oprávnění, o tom si povíme za pár sekund. Všimněte si, že název oprávnění je psaný malými písmeny. Nyní můžete zkontrolovat, zda máte oprávnění správně nastavená pomocí:
setcap -v cap_new_raw=eip tracewalkNebo můžete vypsat seznam všech oprávnění nastavených pro daný spustitelný soubor:
getcap tracewalk
Pro informaci, můžete také odstranit všechna oprávnění ze spustitelného souboru pomocí:
setcap -r tracewalkV této fázi byste měli být schopni spustit spustitelný soubor jako neprivilegovaný uživatel, a měl by být schopen pracovat s syrovými sokety, ale neměl by mít žádná jiná privilegía, kterými disponuje uživatel root.
Takže, co znamená tento podivný sufix =eip? Здесь потребуется толика понимания природы разрешений. Каждый процесс имеет три набора разрешений — efektivní, dědičné a povolené (effective, inheritable a permitted):
- Efektivní (Effective) oprávnění jsou ta, která určují, co může proces skutečně dělat. Například nemůže pracovat s nevyužitými sokety, pokud
CAP_NET_RAWnení v efektivním setu. - Povolené (Permitted) oprávnění jsou ta, která proces může mít, pokud je požaduje prostřednictvím příslušného volání. Neumožňují procesu ve skutečnosti nic dělat, pokud nebyl speciálně napsán pro požadavek na konkrétní oprávnění. To umožňuje psát procesy pro přidání zvláštně důležitých oprávnění do efektivního setu pouze po dobu, kdy jsou skutečně potřeba.
- Dědičné (Inheritable) oprávnění jsou ta, která mohou být zděděna v dostupném setu potomkového procesu. Během operace
fork()neboclone()dceřinému procesu je vždy dána kopie oprávnění rodičovského procesu, protože v tu chvíli stále vykonává ten samý spustitelný soubor. Dědičný set se používá, kdyžexec()(nebo ekvivalent) je volán pro nahrazení spustitelného souboru jiným. V této fázi je dostupný set procesu maskován dědičným setem pro získání dostupného setu, který bude použit pro nový proces.
Takto nástroj setcap nám umožňuje nezávisle přidávat oprávnění těchto tří sad pro daný spustitelný soubor. Všimněte si, že hodnota skupin se mírně odlišně vykládá pro přístupová práva k souborům:
- Dostupné souborová oprávnění jsou ta, která jsou vždy dostupná pro spustitelný soubor, i když rodičovský proces, který jej vyvolal, je neměl. Dříve se jim říkalo „donucovací“ oprávnění.
- Děděná souborová oprávnění určují další masku, která také může být použita k odstranění oprávnění ze sady vyvolávajícího procesu. Používají se navíc k děděné sadě vyvolávajícího procesu, takže oprávnění je děděno pouze v případě, že existuje v obou sadách.
- Efektivní souborová oprávnění představují ve skutečnosti pouze jeden bit, nikoli sadu, a pokud je nastaven, znamená to, že celý dostupný souborový set je také zkopírován do efektivního setu nového procesu. Toto může být použito k přidání oprávnění k procesům, které nebyly speciálně navrženy pro jejich požadavek. Protože jde o jeden bit, pokud jej nastavíte na jakékoli oprávnění, musí být nastaven pro všechna oprávnění. Můžete o něm uvažovat jako o bity legace, protože se používá k povolení používání oprávnění pro aplikace, které je nepodporují.
Při zadávání oprávnění přes setcap tři písmena e, i a p se vztahují k efektivním, děděným a dostupným sadám resp. Takže starší specifikace:
sudo setcap cap_net_raw=eip tracewalk … uvádí, že oprávnění CAP_NET_RAW musí být přidáno k dostupným a děděným sadám a že by měl být také nastaven efektivní bit. To nahradí jakákoliv dříve nastavená oprávnění v souboru. Abyste nastavili více oprávnění najednou, použijte seznam oddělený čárkami:
sudo setcap cap_net_admin,cap_net_raw=eip tracewalkdiskutuje o všem podrobněji, ale doufám, že tento příspěvek trochu objasnil, co se děje. Zbývá zmínit jen pár upozornění a triků.
Za prvé, souborová oprávnění nefungují se symlinky — musíte je aplikovat na samotný binární soubor (tedy na cíl symlinku).
Za druhé, nepracují s interpretovanými skripty. Například pokud máte skript v Pythonu, kterému chcete přidělit oprávnění, musíte je přiřadit samotnému interpretu Pythonu. To je zřejmý bezpečnostní problém, protože všechna skripty spouštěné s tímto interpretem budou mít dané oprávnění, i když je to stále výrazně lepší než použití SUID. Nejběžnější obchvat se zdá být napsání samostatného spustitelného souboru v C nebo jeho ekvivalentu, který může vykonávat potřebné operace a volat jej ze skriptu. Toto je podobné přístupu, který používá Wireshark, který využívá binární soubor. /usr/bin/dumpcap k provádění privilegovaných operací:
$ getcap /usr/bin/dumpcap
/usr/bin/dumpcap = cap_net_admin,cap_net_raw+eip Za třetí, souborová oprávnění jsou deaktivována, pokud používáte proměnnou prostředí LD_LIBRARY_PATH z pochopitelných bezpečnostních důvodů.(1)To samé platí také pro LD_PRELOAD, jak víme.
1. Jelikož útočník může očividně nahradit jednu z standardních knihoven a používat LD_LIBRARY_PATH, aby přinutil svou knihovnu být volána před systémovou, a tudíž mít svůj vlastní libovolný kód prováděný se stejnými privilegii jako volající aplikace.
Tímto je vše. Podrobnosti o programu kurzu se dozvíte na
Zdroj: habr.com
