GNU/Linux >> Znalost Linux >  >> Linux

Linux – Proč Setuid nefunguje?

Tato otázka zde již obsahuje odpovědi :Povolit setuid ve skriptech prostředí

(10 odpovědí)
Uzavřeno před 6 lety.

Chci zajistit, aby můj program mohl spouštět pouze uživatel xyz pomocí oprávnění root. Abych to udělal, nastavil jsem setuid bit pomocí:

chmod u+s program1.sh
ls -l program1.sh
rwsr-x--- 1 root house 1299 May 15 23:54 program1.sh

Také jsem přidal uživatele xyz do house seskupit tak, že pouze xyz a root může spouštět program1.sh.

V program1.sh je

id -u

aby mi mohl ukázat efektivní ID.

Spuštění program1.sh jako root ukazuje root . Ale běží s xyz účet, zobrazuje xyz . Zdá se, že se nespustil s oprávněním root. Nevím, co je tady špatně.

Přijatá odpověď:

Při spouštění skriptů shellu, které mají bit setuid (např. perms rwsr-xr-x), se skripty spouštějí jako uživatel, který je spouští, nikoli jako uživatel, který je vlastní. To je v rozporu s tím, jak se setuid zpracovává pro binární soubory (např. /usr/bin/passwd), které běží jako uživatel, který je vlastní, bez ohledu na to, který uživatel je spouští.

Podívejte se na tuto stránku:https://access.redhat.com/site/solutions/124693

Toto je bezpečnostní opatření přijaté operačním systémem. Svůj skript byste měli použít s sudo místo toho.

Pokud opravdu potřebujete použít setuid vašeho skriptu, můžete vytvořit binární soubor, který to udělá. Vytvořte nový soubor „program.c“ a zkopírujte následující kód:

   #include <stdio.h>
   #include <stdlib.h>
   #include <sys/types.h>
   #include <unistd.h>
     
   int main()
   {
     setuid(0);
     system("./program.sh"); #This line is dangerous: It allows an attacker to execute arbitrary code on your machine (even by accident).
     return 0;
   }

Zkompilujte a spusťte kód pomocí následujících příkazů:

$ gcc program.c -o program
$ sudo chown root.root program
$ sudo chmod 4755 program
$ ./program

Takhle to bude fungovat. Setuid funguje pro kompilovaný soubor a tento soubor může spouštět jiné soubory jako root.


Linux
  1. Proč Tomcat pracuje s portem 8080, ale ne s 80?

  2. Proč nefungují úpravy javascriptu v nástrojích pro vývojáře Chrome?

  3. Proč 'dd' nefunguje pro vytvoření bootovatelného USB?

  1. proč linux bridge nefunguje

  2. ZFS pod Linuxem, funguje to?

  3. Proč používáme su – a nejen su?

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

  2. Linux – proč používáme Su – a nejen Su?

  3. Linux – Arch Linux:Pacman nefunguje při Chrootingu?