GNU/Linux >> Znalost Linux >  >> Linux

Proč setuid bit funguje nekonzistentně?

Změnilo se to /bin/sh buď se stalo bash nebo zůstal dash který dostal další příznak -p napodobující bashovo chování.

Bash vyžaduje -p příznak, aby se neztratilo oprávnění setuid, jak je vysvětleno v jeho manuálové stránce:

Pokud je shell spuštěn s efektivním id uživatele (skupiny), které se nerovná skutečnému id uživatele (skupiny), a není zadaná volba -p, nebudou čteny žádné spouštěcí soubory, funkce shellu nejsou zděděny z prostředí, SHELLOPTS, Proměnné BASHOPTS, CDPATH a GLOBIGNORE, pokud se vyskytují v prostředí, jsou ignorovány a efektivní ID uživatele je nastaveno na skutečné ID uživatele . Pokud je při vyvolání zadána volba -p, chování při spuštění je stejné, ale skutečné ID uživatele se neresetuje.

Před, dash se o to nestaral a povolil spuštění setuid (tím, že neudělal nic, aby tomu zabránil). Ale dash Ubuntu 16.04 Manuová stránka uživatele má popsanou další možnost, podobnou bash :

-p přív
Nepokoušejte se resetovat efektivní uid, pokud neodpovídá uid. Toto není ve výchozím nastavení nastaveno, aby se zabránilo nesprávnému použití bysetuid kořenové programy přes system(3) nebo popen(3).

Tato možnost neexistovala v upstreamu (který nemusel být reaktivní na navrhovaný patch) ani v Debianu 9, ale je přítomen v Debian buster, který dostal patch od roku 2018.

POZNÁMKA:Jak vysvětlil Stéphane Chazelas, je příliš pozdě na vyvolání "/bin/sh -p" v system() protože system() spustí cokoli zadané prostřednictvím /bin/sh a tak je setuid již zrušen. derobertova odpověď vysvětluje, jak s tím zacházet, v kódu před system() .

více podrobností o historii zde a tam.


Shell pravděpodobně z nějakého důvodu mění své efektivní ID uživatele zpět na skutečné ID uživatele jako součást svého spuštění. Můžete to ověřit přidáním:

/* needs _GNU_SOURCE; non-Linux users see setregid/setreuid instead */
uid_t euid = geteuid(), egid = getegid();
setresgid(egid, egid, egid);
setresuid(euid, euid, euid);

před vaším system() . (Ve skutečnosti i na Linuxu pravděpodobně potřebujete nastavit pouze ty skutečné; uložené by mělo být v pořádku nechat na pokoji. Toto je jen hrubá síla k ladění. V závislosti na tom, proč máte nastaveno id, můžete samozřejmě potřebovat abyste si někde uložili i skutečné ID.)

[Také, pokud to není jen cvičení, které se naučí, jak funguje setid, pak je tu spousta bezpečnostních problémů, kterých se musíte obávat, zvláště když voláte shell. Existuje mnoho proměnných prostředí, například, které ovlivňují chování shellu. Preferujte již existující přístup, jako je sudo pokud je to vůbec možné.]


Linux
  1. Proč regulární výraz funguje v X, ale ne v Y?

  2. Jak Sticky Bit funguje?

  3. Proč Bashrc kontroluje, zda je aktuální shell interaktivní?

  1. Linux – Proč Setuid nefunguje?

  2. Linux – Proč Locale Es_mx funguje, ale Es ne?

  3. Jak funguje příkaz Exit na Unixovém terminálu?

  1. Proč „ukončit &“ nefunguje?

  2. Jak funguje příkaz 'ls' v Linuxu/Unixu?

  3. Proč je setuid v adresářích ignorován?