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

2
Tensho 8 Окт 2018 в 17:38

2 ответа

Лучший ответ

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

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

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

1
Aleksei Matiushkin 8 Окт 2018 в 16:07

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

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

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

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

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

owned? → true or false

Возвращает истину, если эффективный идентификатор пользователя процесса совпадает с идентификатором владельца stat. Примеры: 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

1
Ivan Gurzhiy 9 Окт 2018 в 08:10