Portál AbcLinuxu, 10. května 2025 07:23
useradd -u 555 -g ulohy -M -d /tmp/ -s /sbin/nologin uloznik passwd -d ulozniktest.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 groupsjenž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 testCo dělám špatně? Potřebuju, aby nový soubor (když už něco zkompiluji) měl práva jako "uloznik".
LABEL=/ / ext3 defaults 1 1
euid=geteuid(); setreuid(euid,euid);Takhle mi to funguje...
$ 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 testTak 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?
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...
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.