Existují dva případy,
- Chcete dočasně zrušit oprávnění uživatele root při provádění programu setuid
- Chcete trvale zrušit oprávnění uživatele root při provádění programu setuid...
- Můžete to dočasně provést nastavením euid na skutečné ID uživatele a poté změnou uid na cokoli, co chcete. A později, až budete potřebovat oprávnění root zpět, můžete nastavit nastavení na root a efektivní uživatelské ID se změní zpět na root . Důvodem je, že uložené ID uživatele se nezmění.
- Oprávnění můžete trvale zrušit tak, že okamžitě změníte uid na méně privilegované uživatelské jméno. Bez ohledu na to poté nemůžete získat zpět oprávnění root.
Případ 1:
Po spuštění programu setuid
1.seteuid(600);
2.setuid(1000);
3.setuid(0);
V tomto případě lze oprávnění root získat znovu.
+----+------+------------+
| uid|euid |saved-uid |
|----|------|------------|
1.|1000| 0 | 0 |
2.|1000| 600 | 0 |
3.|1000| 1000 | 0 |
4.|1000| 0 | 0 |
| | | |
+------------------------+
Případ 2:
Po spuštění programu setuid ,
1.setuid(1000);
2.setuid(0);
+----+------+------------+
| uid|euid |saved-uid |
|----|------|------------|
1.|1000|0 | 0 |
2.|1000|1000 | 1000 |
| | | |
+------------------------+
V tomto případě nemůžete získat zpět oprávnění root. To lze ověřit pomocí následujícího příkazu
cat /proc/PROCID/task/PROCID/stav | méně
Uid: 1000 0 0 0
Gid: 1000 0 0 0
Tento příkaz zobrazí Uid a Gid a bude mít 4 pole (první tři pole jsou ta, která nás zajímají). Něco jako výše
Tato tři pole představují uid, euid a uložené-id-uživatele. Ve svém setuid programu můžete zavést pauzu (vstup od uživatele) a zkontrolovat pro každý krok cat /proc/PROCID/task/PROCID/status | less
příkaz. Během každého kroku můžete zkontrolovat, jak se uložené uid změnilo, jak je uvedeno.
Pokud jste euid je root a změníte uid, oprávnění budou trvale zrušena. Pokud efektivní uživatelské ID není root, uložené ID uživatele se nikdy nedotkne a můžete získat oprávnění root, kdykoli budete chtít ve vašem programu.
DESCRIPTION setuid() nastavuje efektivní ID uživatele volajícího procesu. Pokud je efektivní UID volajícího isroot, nastaví se také skutečné UID a uložené set-user-ID.
V Linuxu je setuid() implementováno jako verze POSIX s funkcí _POSIX_SAVED_IDS. To umožňuje programu set-user-ID (jiného než root) zrušit všechna svá uživatelská oprávnění, provést nějakou neprivilegovanou práci a poté znovu bezpečně zapojit původní efektivní ID uživatele.
Pokud je uživatel root nebo je program set-user-ID-root, je třeba věnovat zvláštní pozornost. Funkce setuid() kontroluje skutečné ID uživatele volajícího, a pokud se jedná o superuživatele, všechna uživatelská ID související s procesem jsou nastavena na uid. Poté, co k tomu dojde, je nemožné, aby program znovu získal oprávnění root.
Program set-user-ID-root, který si přeje dočasně zrušit oprávnění root, převzít identitu neprivilegovaného uživatele a poté znovu získat oprávnění root, nemůže použít setuid(). Můžete toho dosáhnout pomocí seteuid(2).
(z Linux Programmers' Manual, 2014-09-21, page setuid.2
)
Ó! Tyto funkce je obtížné správně používat.
Man stránka uvádí, že setuid změní skutečné, uložené a efektivní uid. Takže po volání setuid(1000) se všechny tři změní na 1000.
To platí tehdy a jen tehdy, když máte euid 0. V době, kdy voláte setuid(0)
jste však euid 1000 a zachráněni uid 0 (zkontrolujte getresuid(2)
, například). To je důvod, proč můžete znovu získat oprávnění.