Jak mohu použít capsh: Snažím se spouštět neprivilegovaný ping s minimálními schopnostmi
On 13 února, 2021 by adminExperimentuji s funkcemi na Debian Gnu / Linux.
Zkopíroval jsem / bin / ping do svého aktuálního pracovního adresáře. Jak se dalo očekávat, nefunguje to, původně to byl kořen setuid.
Potom dávám pingu minimální možnosti (ne root) pomocí sudo /sbin/setcap cap_net_raw=ep ./ping
a mého pingu funguje podle očekávání.
Poté sudo /sbin/setcap -r ./ping
tuto schopnost odvolat. Nyní nefunguje podle očekávání.
Nyní se pokusím o spuštění příkazu ping pomocí capsh
.
capsh
nemá žádná oprávnění, takže jej musím spustit jako root, ale poté spustit root a tedy všechny ostatní oprávnění.
Myslím si, že potřebuji také secure-keep-caps
, toto není zdokumentováno v capsh
, ale je v možnosti manuál. Získal jsem čísla bitů z /usr/include/linux/securebits.h
. Zdá se, že jsou správné, protože výstup --print
ukazuje, že tyto bity jsou správné.
Hodiny si fičím, zatím to mám.
sudo /sbin/capsh --keep=1 --secbits=0x10 --caps="cap_net_raw+epi" == --secbits=0x10 --user=${USER} --print -- -c "./ping localhost"
Nicméně ping
chyby s ping: icmp open socket: Operation not permitted
, to se stane, když to nemá schopnost. Také --print
zobrazuje Current: =p cap_net_raw+i
, to nestačí, stačí e
.
sudo /sbin/capsh --caps="cap_net_raw+epi" --print -- -c "./ping localhost"
nastaví schopnost na Current: = cap_net_raw+eip
to je správné, ale ponechává nás jako root
.
Edit-1
Nyní jsem vyzkoušel sudo /sbin/capsh --keep=1 --secbits=0x11 --caps=cap_net_raw+epi --print -- -c "touch zz; ./ping -c1 localhost;"
Tím se vytvoří:
touch: cannot touch `zz": Permission denied ping: icmp open socket: Operation not permitted
První chyba se očekává jako secure-noroot: yes
Druhá však není Current: = cap_net_raw+eip
Edit-2
Pokud vložím ==
před --print
, nyní ukazuje Current: = cap_net_raw+i
, což vysvětluje předchozí chybu, ale ne důvod, proč ztrácíme schopnost při přepnutí z root, ale secure-keep-caps
by měl oprav to.
Edit-3
Z toho, co vidím, ztrácím Effective (e) a Permitted (p), když se volá exec. Očekává se to, ale myslel jsem si, že zabezpečené uzávěry by měly zabránit jejich ztrátě. Chybí mi něco.
Edit-4
Dělám více průzkumů a znovu si čtu příručku. Zdá se, že normálně e
a p
možnosti jsou ztraceny, když: přepnete z uživatelského root
(nebo použijte secure-noroot
, čímž se root stane běžným uživatelem), toto lze přepsat pomocí secure-keep-caps
; když zavoláte exec
, pokud vím, jedná se o invariant.
Pokud vím, funguje to podle příručky. Pokud vím, neexistuje žádný způsob, jak s capsh
udělat něco užitečného. Pokud vím, pro použití funkcí musíte: používat schopnosti souborů nebo mít program s vědomím schopností, který nepoužívá exec
. Proto žádný privilegovaný obal.
Takže moje otázka nyní zní, co mi chybí, k čemu je capsh
.
Edit-5
Přidal jsem odpověď na okolní funkce. Možná lze capsh
použít také se zděděnými schopnostmi, ale aby to bylo užitečné, bude třeba je nastavit na spustitelný soubor. Nevidím, jak může capsh dělat cokoli užitečného bez okolních schopností nebo povolit zděděné schopnosti.
Verze:
-
capsh
z balíčkulibcap2-bin
verze1:2.22-1.2
- před úpravou-3 jsem popadl nejnovější
capsh
odgit://git.debian.org/collab-maint/libcap2.git
a začal jej používat. -
uname -a
Linux richard-laptop 3.2.0-4-amd64 #1 SMP Debian 3.2.65-1+deb7u2 x86_64 GNU/Linux
Uživatelská země je 32bitová.
Komentáře
Odpověď
Schopnosti jsou vlastnosti procesů. Tradičně existují tři sady:
- Povolené funkce ( p ): funkce, které mohou být „activated“ in the current process.
- Effective capabilities ( e ): schopnosti, které jsou aktuálně použitelné v současném procesu.
- Zděděné funkce ( i ): schopnosti souborů, které lze zdědit.
Programy spuštěné jako root mají vždy plné povolené a efektivní funkce, takže „přidání“ dalších funkcí nemá žádný znatelný účinek. (Sada dědičných funkcí je obvykle prázdná.) S setcap cap_net_raw+ep ping
tyto funkce ve výchozím nastavení povolíte pro každého uživatele, který používá tento program.
Tyto funkce jsou bohužel vázány na spuštěný soubor a po provedení nového podřízeného procesu se nezachovají. Linux 4.3 představen Ambientní funkce , které umožňují dědění schopností podřízenými procesy. (Viz také Transformace schopností během execve () v schopnostech (7) .)
Při hraní s schopnosti, všimněte si těchto úskalí:
- Při změně uživatele z root na non-root budou vymazány efektivní a povolené schopnosti (viz Vliv změn ID uživatele na schopnosti v schopnostech (7) ). Můžete použít možnost
--keep=1
zcapsh
, abyste se vyhnuli vymazání sad. - Sada funkcí okolí se vymaže, když změna ID uživatele nebo skupiny. Řešení: Přidejte funkce prostředí po změně ID uživatele, ale před provedením podřízeného procesu.
- Funkci lze přidat pouze do funkcí prostředí nastaveno, pokud již je v povolené i dědičné sadě funkcí.
Od verze libcap 2.26 získal program capsh
možnost upravovat okolní funkce prostřednictvím možností, jako je --addamb
( potvrzení ). Pořadí možností je významné. Příklad použití:
sudo capsh --caps="cap_net_raw+eip cap_setpcap,cap_setuid,cap_setgid+ep" \ --keep=1 --user=nobody --addamb=cap_net_raw -- \ -c "./ping -c1 127.0.0.1"
Tip: Možnost --print
můžete přidat kdekoli v capsh
příkazový řádek a podívejte se na jeho aktuální stav schopností.
Poznámka: cap_setpcap
je potřeba pro --addamb
zatímco cap_setuid,cap_setgid
jsou potřebné pro možnost --user
.
Komentáře
- Které konkrétní číslo verze libcap od té doby mají capsh –addamb? Poznámky k vydání 2.32 zmínily nové funkce kapsu, ale slova byla vágní.
- @ 把 友情 留 在 无 盐 Když byla odpověď původně napsána, podporoval ji pouze git master. Od té doby byl vydán libcap 2.26 s podporou volby
--addamb
. Odpověď jsem odpovídajícím způsobem aktualizoval. - Tyto funkce jsou bohužel vázány na spuštěný soubor a po provedení nového podřízeného procesu nejsou zachovány. – podřízeným procesem Normálně myslím na
fork(2)
, který tyto schopnosti zdědí. Pouzeexecve(2)
nezdědí funkce ‚ t, ale ‚ nevytvoří dítě proces. Mýlím se? - Cituji
man capabiltiies
: Dítě vytvořené pomocífork(2)
zdědí kopie svého rodiče ‚ sady schopností.
Odpověď
Odpověď Lekensteyna se zdá být přesná a úplná, ale pokusím se poskytnout další vysvětlení z jiného úhlu, které se pokusí zdůraznit problém, který řeší sada funkcí prostředí.
Když spustíte sudo capsh --user=<some_user> --
Existují dvě systémová volání zájmu, která způsobují přepočítání schopností (a potenciální zrušení):
-
setuid
: Podleman capabilities
:
SECBIT_KEEP_CAPS Nastavení tohoto příznaku umožňuje vláknu, které má jedno nebo více 0 UID zachovat své schopnosti, když přepne všechny své UID na nenulovou hodnotu. Pokud tento příznak není nastaven, pak takový UIDswitch způsobí, že vlákno ztratí všechny funkce.
Jinými slovy, v našem výše uvedeném příkazu capsh
se musíme ujistit, že je během setuid
systémové volání. Jinak jsou ztraceny všechny funkce. To je --keep=1
. Nyní se tedy příkaz stává sudo capsh --user=<some_user> --keep=1 --
-
execve
: použijte možnost--keep=1
, všechny sady schopností (efektivní, povolené, zděděné) budou zachovány až doexecve
systémové volání, aleexecve
způsobí přepočítání schopností (i pro uživatele bez oprávnění root) a v ne tak zřejmý způsob.Stručně řečeno, před přidáním okolních funkcí nastavených pro možnost být ve vlákně „s“ povoleno “ nastaveno poexecve
volání, buď:- Soubor musí mít tuto schopnost ve své „povolené“ sadě . lze provést pomocí
setcap cap_net_raw+p /bin/bash
. Tím se celé cvičení stane nepoužitelným, protože sady schopností vlákna (jiné než ohraničující sada) již nemají žádný účinek. - Soubor i vlákno musí mít tuto schopnost ve svých „zděděných“ sadách . Možná si myslíte, že
setcap cap_net_raw+i
by tento trik zvládl, ale ukázalo se, žeexecve
způsobí, že při volání uživatele budou zrušena neoddělitelná oprávnění vlákna neprivilegovaní uživatelé (kterými v současné době jsme díkysetuid
). Tuto podmínku tedy jako neprivilegovaný uživatel neexistuje.
- Soubor musí mít tuto schopnost ve své „povolené“ sadě . lze provést pomocí
Možnosti prostředí zavedené v systému Linux 4.3 umožňují, aby si vlákno zachovalo své schopnosti i po setuid
neprivilegovanému uživateli následovanému execve
, bez nutnosti spoléhat se na možnosti souborů.
Odpověď
V jádře může být chyba / funkce. Proběhla nějaká diskuse:
- https://bugzilla.altlinux.org/show_bug.cgi?id=16694
- http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-03/5224.html
Nemám tušení, jestli něco bylo d jeden, opravit to.
Nechápejte mě špatně – aktuální chování je zabezpečené. Ale je to tak bezpečné, že se dostává do cesty věcem, které by měly fungovat.
Upravit: Podle http://man7.org/linux/man-pages/man7/capabilities.7.html existuje nová sada funkcí Ambient (od Linuxu 4.3). Vypadá to, že to umožní to, co je potřeba.
Odpověď
Mírná úprava odpovědi společnosti Lekensteyn přináší kratší vyvolání pro nedávná jádra:
sudo /usr/sbin/capsh --keep=1 --user=$USER \ --inh=cap_net_raw --addamb=cap_net_raw -- \ -c "./ping -c1 localhost"
Poznámka: V závislosti na souboru sudoers to může způsobit nepořádek ve vašem prostředí (např. změna HOME). capsh změní vaše uid, ale nebude nic dělat, aby se vrátily změny prostředí sudo.
Takže co se tady děje? Podívejme se:
-
sudo /usr/sbin/capsh
: Začínáme jako root, který má všechny možnosti ve svých účinných (umí to) a povolených (umí to přidat do efektivních) sad, ale nic v ostatních sadách . Tyto další sady pokryjeme za okamžik. -
--keep=1
: Z bezpečnostních důvodů (čtení: starší) schopnosti obvykle nedědí po kořenech > přepínače ID bez oprávnění root. Tento příznak povoluje funkci známou jakoSECBIT_KEEP_CAPS
, která to umožňuje. Stojí za zmínku, že je automaticky vymazán na exec , což je dobrý nápad. -
--user=$USER
: Nyní, když neztratíme všechny naše možnosti při změně UID, vypadneme z kořene. DíkySECBIT_KEEP_CAPS
si zachováváme oprávnění typu root, což nám umožňuje dále se pohrávat s našimi schopnostmi. -
--inh=cap_net_raw
: To přidá naši cílovou schopnost do dědičné sady, protože nemůžete vytvořit schopnost prostředí (viz další položka), pokud to není dědičné. -
--addamb=cap_net_raw
: I když jsme „požadovaliSECBIT_KEEP_CAPS
,execve
z neprivilegovaného (žádný setuid / setgid / setcap) binární stále zrušte naše schopnosti, což nebude mít žádná oprávnění. Linux 4.3 přidal okolní sadu, která se přidá zpět k účinným a povoleným sadám při provádění neprivilegovaných binárních souborů. Perfektní! -
-- -c ...
: Po nastavení všeho provedeme bash s těmito args. Sady schopností jsou vymazány (protože bash je neprivilegovaný), okolní sada je přidána zpět a voila! Máme nezbytné oprávnění k otevření raw zásuvky.
Toto můžete zkontrolovat pomocí speciálního ==
argument pro capsh, který způsobí, že se provede sám se zbytkem příkazového řádku:
sudo /usr/sbin/capsh --keep=1 --user=$USER \ --inh=cap_net_raw --addamb=cap_net_raw == --print Current: = cap_net_raw+eip
Což znamená, že máme cap_net_raw jako efektivní (umí to), zděděný (může ho předat podřízeným procesům) a povolený (smí jej získat). A žádné další možnosti v žádném z nich.
Chcete-li získat další informace o funkcích a jejich fungování, nejlepší bude manuálová stránka schopností (7) . Konkrétně nadpis Transformation of capabilities during execve()
.
Komentáře
- Co tím myslíte brzy, protože to vyžaduje řadu dalších funkcí, které ‚ t klesnout, dokud nebude ‚ hotovo. ?Ve vašem případě provádíte činnost jako “ root „, takže ani
--user
nebyl ‚ Pokud jste se změnili, ‚ budete mít později potřebné funkce? - Děkujeme, že jste na to upozornili! Předchozí verze tohoto příkazového řádku výslovně upustila od privs, takže bylo nutné před tím nastavit setuid. Nyní, když jsou privy implicitně zahozeny jako součást exec, to ‚ není nutné.
capsh
z úložiště collab-maint by vám neposkytlo „nejnovější“capsh
, balíček Debian stále nepodporuje okolní schopnosti. Upstream 2.27 ano.capsh
, při absenci prostředí (jak to původně bylo). Co mi chybí Musí to mít své využití.