Portál AbcLinuxu, 10. května 2025 07:23

Dotaz: setuid, spuštění skriptu a špatný vlastník souboru

11.1.2007 13:12 gagod | skóre: 2
setuid, spuštění skriptu a špatný vlastník souboru
Přečteno: 242×
Odpovědět | Admin
zdar, potřebuju pod apachem spustit skript, který zkompiluje a spustí cizí program pod jiným uživatelem. Pokud jsem správně pochopil setuid-skripty tak by měl ten program spustit shellskript právě pod tím jiným uživatelem.
useradd -u 555 -g ulohy -M -d /tmp/ -s /sbin/nologin uloznik
passwd -d uloznik
test.c
#include cstdlib
#include iostream
#include string
// http://yolinux.com/TUTORIALS/ForkExecProcesses.html, man execve
using namespace std;
main(){
  // nove prostredi
  char *env[]={"UID=555","USER=uloznik","LANG=en_US.UTF-8","PATH=/usr/bin:/bin",(char *) 0};
  char *Env_argv[] = { "./ko.sh",NULL, (char *) 0 };
  int ret;
  ret = execve (Env_argv[0], Env_argv, env);
  cout << "Failure! execve error code=" << ret << endl;
}
ko.sh
#!/bin/bash
touch novy_soubor
echo $USER
groups
jenže skript se sice spustí v novém prostředí, ale s mými pravy, což nechci
$ ./test
uloznik
maro users
$ ll novy_soubor test
-rw-r--r-- 1 maro    maro    0 Jan 11 13:04 novy_soubor
-rwsr-xr-x 1 uloznik maro 6787 Jan 11 12:48 test
Co dělám špatně? Potřebuju, aby nový soubor (když už něco zkompiluji) měl práva jako "uloznik".
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

marek_s avatar 11.1.2007 13:42 marek_s | skóre: 8 | Loučky
Rozbalit Rozbalit vše Re: setuid, spuštění skriptu a špatný vlastník souboru
Odpovědět | | Sbalit | Link | Blokovat | Admin
Nevim, nevim ... nemuze to byt tim, ze je oddil namountovan jako nosuid?
"Consummatum est" -- Iesus Nazarenus
11.1.2007 13:45 gagod | skóre: 2
Rozbalit Rozbalit vše Re: setuid, spuštění skriptu a špatný vlastník souboru
spoustim to v /tmp/
LABEL=/                 /                       ext3    defaults        1 1
11.1.2007 17:13 marek
Rozbalit Rozbalit vše Re: setuid, spuštění skriptu a špatný vlastník souboru
Uz je mne to jasne... V unixu existuji dva druhy uid (asi jeste vic) ... efektivni a realne. Efektivni je to co muzu delat a realne je to co jsem. Nastavenim setuidbitu zmenim Efektivni, NE VSAK realne. Potrebuji tedy v programu nastavit realne uid na efektivni. Jednoduse treba takto:
euid=geteuid();
setreuid(euid,euid);
Takhle mi to funguje...
11.1.2007 19:10 gagod | skóre: 2
Rozbalit Rozbalit vše Re: setuid, spuštění skriptu a špatný vlastník souboru
jo, funguje, ale pro skupinu mi to nejede...
$ cat ko.sh 
#!/bin/bash
touch novy_soubor
echo "user $USER"
echo "uid $UID"
echo "euid $EUID"
groups

$ cat test.c 
#include cstdlib
#include iostream
#include string
// http://yolinux.com/TUTORIALS/ForkExecProcesses.html
using namespace std;
main(){
        //"EUID=555","UID=555","USER=uloznik",
        char *env[]={"LANG=en_US.UTF-8","PATH=/usr/bin:/bin",(char *) 0};
        char *Env_argv[] = { "./ko.sh",NULL, (char *) 0 };
        int ret,euid,egid;
        euid = geteuid();
        setreuid(euid,euid);
        egid = getegid();
        setegid(egid);
   ret = execve (Env_argv[0], Env_argv, env);
   cout << "Failure! execve error code=" << ret << endl;
}

# chown uloznik:ulohy /tmp/test
# chmod gu+s /tmp/test

$ ./test
user 
uid 555
euid 555
maro apache users

$ ll test novy_soubor 
-rw-r--r-- 1 uloznik maro     0 Jan 11 19:09 novy_soubor
-rwsr-sr-x 1 uloznik ulohy 7160 Jan 11 19:08 test
Tak mě napadá, proč teoreticky nestačí to EUID nastavit v novém prostředí?
char *env[]={"UID=555","EUID=555","USER=uloznik","LANG=en_US.UTF-8","PATH=/usr/bin:/bin",(char *) 0};
Zkoušel jsem tuto kombinaci, ale novy_soubor ma porad skupinu "maro"
setreuid(euid,euid);
egid = getegid();
co ted?
marek_s avatar 11.1.2007 19:28 marek_s | skóre: 8 | Loučky
Rozbalit Rozbalit vše Re: setuid, spuštění skriptu a špatný vlastník souboru
myslim, ze setregid bude ta spravna volba. Podobne jako v predchozim to bude chtit (asi -nezkousel jsem to) udelat toto:
gid=getegid();
setregid(gid,gid);
Samotny setegid(egid) Vam nepomuze - nastavite efektivni gid na efektivni gid - tedy nic jste neudelal. Potrebujete ovsem nastavit realne na efektivni...
"Consummatum est" -- Iesus Nazarenus
11.1.2007 20:33 gagod | skóre: 2
Rozbalit Rozbalit vše Re: setuid, spuštění skriptu a špatný vlastník souboru
dík moc, to jsem potřeboval

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.