.
Это потому, что вы еще слишком рано, если вы дождетесь изменения 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.
Выполняется ли программа на файловой системе, которая принимает бит setuid
на файлы ( mount -o nosuid
)?
Если бы я отлаживал это, я бы распечатал вывод getuid()
и geteuid()
при запуске программы, чтобы посмотреть, выполняется ли чествование бита setuid
.