Jeżeli po załadowaniu bezpiecznych wtyczek aplikacja pozbędzie się wyższych uprawnień, to załadowane później wtyczki użytkownika nic nie zrobią.
// (C) 2019 Paweł Kraszewski
#include <stdio.h>
#include <unistd.h>
int main() {
int uid, gid;
int euid, egid;
uid = getuid();
euid = geteuid();
gid = getgid();
egid = getegid();
printf("Przed zrzuceniem uprawnień: UID=%d EUID=%d GID=%d EGID=%d\n", uid, euid, gid, egid);
if (uid != euid) { seteuid(uid); }
if (gid != egid) { setegid(gid); }
uid = getuid();
euid = geteuid();
gid = getgid();
egid = getegid();
printf("Po zrzuceniu uprawnień: UID=%d EUID=%d GID=%d EGID=%d\n", uid, euid, gid, egid);
return 0;
}
W praniu:
> gcc -o uidgid uidgid.c
> ./uidgid
Przed zrzuceniem uprawnień: UID=1000 EUID=1000 GID=1000 EGID=1000
Po zrzuceniu uprawnień: UID=1000 EUID=1000 GID=1000 EGID=1000
> sudo ./uidgid
Przed zrzuceniem uprawnień: UID=0 EUID=0 GID=0 EGID=0
Po zrzuceniu uprawnień: UID=0 EUID=0 GID=0 EGID=0
> sudo chown 0:0 uidgid
> sudo chmod u+s,g+s uidgid
> ./uidgid
Przed zrzuceniem uprawnień: UID=1000 EUID=0 GID=1000 EGID=0
Po zrzuceniu uprawnień: UID=1000 EUID=1000 GID=1000 EGID=1000
Zawsze wolno ci zresetować EUID/EGID do odpowiednich UID/GID. Do zmiany EUID/EGID na inne niż UID/GID oraz do zmiany UID/GID potrzeba podwyższonych uprawnień.