GNU/Linux >> Znalost Linux >  >> Linux

RealUID, UID UID, Efektivní UID. Co se děje?

Existují dva případy,

  1. Chcete dočasně zrušit oprávnění uživatele root při provádění programu setuid
  2. 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í.


Linux
  1. Co je uživatel Linuxu?

  2. Co je to sysadmin?

  3. Co dělá ?

  1. Používáte Setuid Bit správně?

  2. Co dělá Echo $? Dělat??

  3. Jaký je účel každého z různých UID, který proces může mít?

  1. Co je RAID?

  2. Co je :-!! v C kódu?

  3. Nelze vysledovat sudo; hlásí, že efektivní uid je nenulové