Получить текущий процесс сохраненный set-user-id - PullRequest
0 голосов
/ 08 октября 2018

Совершенно очевидно, как получить реальный идентификатор пользователя (Process.uid) и эффективный идентификатор пользователя (Process.euid)текущего запущенного процесса в Ruby с помощью stdlib.Но мне интересно, где находится родной метод для сохраненного set-user-ID , что-то вроде Process.suid?Существует только метод Process::UID.sid_available?, который позволяет определить, поддерживает ли работающая платформа описанную функцию.

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

Ответ на этот вопрос: https://superuser.com/questions/1149421/how-do-i-find-the-effective-user-id-euid-real-user-id-ruid-and-saved-user-i

Здесь можно угадать начальный эффективный UID (а также сохраненный UID): поскольку в файле установлен флаг setuid, ипринадлежит пользователю 'anna', его запуск создаст процесс с эффективным UID пользователя 'anna'.

suid, это один из атрибутов файла, поэтому мы можем просто сравнитьтекущий идентификатор процесса и идентификатор владельца файла

Из документации https://ruby -doc.org / core-1.9.3 / File / Stat.html # method-i-Owned-3F

Вы можете попробовать использовать этот метод из stat:

owned? → true or false

Возвращает true, если эффективный идентификатор пользователя процесса совпадает с владельцемстат.Примеры: File.stat("testfile").owned? #=> true

File.stat("/etc/passwd").owned? #=> false

И если uid процесса и владелец файла не совпадают, мы можем сказать, что двоичный файл имеет suid, и мы можем лучше определить, есть ли у нас suidс помощью следующего метода из документации:

https://ruby -doc.org / core-1.9.3 / File / Stat.html # method-i-setuid-3F

setuid? → true or false

Возвращает true, если для stat установлен бит разрешения set-user-id, и false, если нет или если операционная система не поддерживает эту функцию.

File.stat("/bin/su").setuid? #=> true

0 голосов
/ 08 октября 2018

Ну, вам это не понравится, но AFAICT, это единственный способ получить suid для процесса.

suid = `ps -o pid,suid`[/(?<=^#{Process.pid}\s)\s*\d+/].strip
#⇒ "1000"

Возможно, стоит проверить, доступна ли suid заранее.,По сути, это регулярное выражение ищет строку, начинающуюся с текущего процесса 'pid.

...