Trochu jsem experimentoval a všiml jsem si něčeho divného:nastavení bitu setuid na kopii bash umístěnou na /usr/bin/bash-test
zdálo se, že nemá žádný účinek. Když jsem spustil instanci bash-test
, můj domovský adresář nebyl nastaven na /root
a když jsem spustil whoami
příkaz z bash-test
, moje uživatelské jméno nebylo hlášeno jako root
, což navrhuje bash-test
neběžel jako root. Pokud však nastavím bit setuid na whoami
, byl jsem podle očekávání hlášen jako root v libovolném prostředí.
Zkusil jsem nastavit bit setuid na /usr/bin/bash
a pozorovali stejné chování.
Proč bash neběží jako root, když na něm nastavím bit setuid? Může s tím mít něco společného selinux?
Přijatá odpověď:
Vysvětlení je trochu nepříjemné:důvodem je bash samotný. strace
je náš přítel (aby to fungovalo, musí být samotný root SUID):
getuid() = 1000
getgid() = 1001
geteuid() = 0
getegid() = 1001
setuid(1000) = 0
setgid(1001) = 0
bash detekuje, že byl spuštěn SUID root (UID!=EUID) a použije svou sílu root k tomu, aby tuto moc zahodil a resetoval EUID na UID. A později dokonce FSUID, pro jistotu…:
getuid() = 1000
setfsuid(1000) = 1000
getgid() = 1001
setfsgid(1001) = 1001
Nakonec:bez šance. Musíte spustit bash s kořenem UID (tj. sudo).
Úprava 1
Manová stránka říká toto:
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í zadána volba -p, nečtou se žádné spouštěcí soubory, funkce shellu nejsou zděděny z prostředí, SHELLOPTS Proměnné , BASHOPTS, CDPATH a GLOBIGNORE, pokud se v prostředí vyskytují, 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.
Ale tohle mi nefunguje. -p
není ani uveden mezi možnostmi spuštění. Zkoušel jsem také --posix
; také nefungovalo.