Неверный eUID в `/ proc / PID / status` при использовании SETUID

Другое решение:

Это будет работать только с файлами в текущей директории.

.

1
04.08.2015, 16:56
2 ответа

Это потому, что вы еще слишком рано, если вы дождетесь изменения UID, ваш процесс будет работать как user2 . У меня это сработало:

./program "test" &
PID=$!
sleep 0.0005
kill -SIGSTOP $PID
grep ^Uid /proc/$PID/status

Еще одна попытка - добавить задержку с помощью usleep () и отправить SIGSTOP позже во время этого сна. Затем программа запускается с user2 в качестве действующего uid. Вы можете проверить это, но без подключения с помощью gdb или strace . Скорее всего, это что-то вроде внутреннего ядра Linux, что процессу нужно время, чтобы изменить UID.

При запуске процесса с терминала вызывается системный вызов execve () ; из справочной страницы:

Если бит set-user-ID установлен в файле программы, на который указывает filename, [...] и вызывающий процесс не отслеживается, то {{1} } эффективный идентификатор пользователя вызывающего процесса изменяется на идентификатор владельца программного файла.

Когда вы присоединяете gdb к процессу, вы не увидите uid user2 , потому что вы ptrace в процессе, как описано в страницу руководства выше. Или же вы можете подключиться к процессу sudo и получить права root.

Однако эта программа никогда не получает ошибку сегментации ( SIGSEGV ), если только вы не заставите ее с помощью kill -SIGSEGV $ PID . ЕСЛИ ваша программа получает SIGSEGV , вызывается подпрограмма launch_debugger () .Это вызовет gdb и в качестве аргумента только двоичную программу программы без каких-либо аргументов, которая заменит текущий запущенный процесс. Таким образом, в отладчике будут привилегии user2 , и поэтому вы можете делать там все, что хотите, с разрешениями user2 .

Затем вы можете, например, сделать следующее внутри gdb :

(gdb) file bash
Reading symbols from /bin/bash...(no debugging symbols found)...done.
(gdb) run
Starting program: /bin/bash
user2@host:~$ id
uid=1035(user2) gid=1003(user1) groups=1035(user2),1003(user1)

Теперь рассмотрим тот же двоичный файл с битом setuid, а его владельцем является root.

3
27.01.2020, 23:20

Выполняется ли программа на файловой системе, которая принимает бит setuid на файлы ( mount -o nosuid)?

Если бы я отлаживал это, я бы распечатал вывод getuid() и geteuid() при запуске программы, чтобы посмотреть, выполняется ли чествование бита setuid.

1
27.01.2020, 23:20

Теги

Похожие вопросы