Почему команда ps выполняется пользователем, выполняемым пользователем root в MacOS? - PullRequest
0 голосов
/ 01 сентября 2018

Я недавно заметил, что когда я запускаю команду ps в терминах (Terminal, iTerm, ...), команда запускается пользователем root.

machine:~ vincent$ ps ux | grep ps
vincent  2846   0,2  0,0  4277992    848 s001  S+    2:10     0:00.00 grep ps
root     2845   0,2  0,0  4287948   1120 s001  R+    2:10     0:00.00 ps ux

Это происходит как при вводе команды от имени администратора, так и от имени обычного пользователя без прав администратора, и это влияет как на Yosemite, так и на High Sierra (так, вероятно, на многие другие версии системы).

Почему это?

Есть ли другие команды, затронутые этим поведением?

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Если вы посмотрите на разрешения для файла ps, вы заметите, что бит SUID включен (отметьте 's' во флагах разрешений).

ls -ltr /bin/ps
-rwsr-xr-x  1 root  wheel  51280 Dec  1  2017 /bin/ps

это означает, что процесс, порожденный этим файлом, получает разрешение от владельца файла, а не от его родительского процесса (который может быть терминалом bash, с которого вы ввели команду), и этот пользователь является пользователем root.

Так работает sudo и многие другие системные команды.

0 голосов
/ 01 сентября 2018

Я подозреваю, что это сделано (через бит разрешений setuid), чтобы позволить __proc_info() (системный вызов, используемый функциями <sys/libproc.h>) для доступа к адресным пространствам другого процесса для считывания, например. путь исполняемого файла. (Это не хранится в ядре - оно фактически читается из argv[0] процесса; и да, это означает, что его можно подделать.)

Вы всегда можете попытаться сделать копию двоичного файла ps (или скомпилировать его из исходного кода), удалить бит setuid, запустить его как непривилегированный пользователь и посмотреть, что ломается.

...