【问题标题】:Get current process saved set-user-id获取当前进程保存的 set-user-id
【发布时间】:2018-10-08 14:38:10
【问题描述】:

在标准库的帮助下,如何在 Ruby 中获取当前正在运行的进程的真实用户 ID (Process.uid) 和 有效用户 ID (Process.euid) 非常明显.但我想知道 保存的 set-user-ID 的兄弟方法在哪里,例如 Process.suid?只有Process::UID.sid_available?方法可以判断运行平台是否支持描述的特性。

【问题讨论】:

    标签: ruby unix process privileges


    【解决方案1】:

    好吧,你不会喜欢这个,但是 AFAICT,这是获得suid 的唯一方法。

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

    可能应该先检查suid 是否可用。基本上,这个正则表达式搜索从当前进程'pid 开始的行。

    【讨论】:

    • 对于 MacOS,suid 应替换为 svuid
    • 短版 – `ps -p #{Process.pid} -o svuid=`.strip
    【解决方案2】:

    根据这个问题回答: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' 所有,因此运行它会创建一个有效的进程'anna' 用户的 UID。

    因为它是文件的属性之一,所以我们可以比较当前进程的uid和文件的所有者id

    来自文档https://ruby-doc.org/core-1.9.3/File/Stat.html#method-i-owned-3F

    您可以尝试从 stat 中使用此方法:

    owned? → true or false

    如果进程的有效用户ID与stat的所有者相同,则返回true。 例子: File.stat("testfile").owned? #=&gt; true

    File.stat("/etc/passwd").owned? #=&gt; false

    如果进程 uid 和文件所有者不相等,我们可以说二进制文件有 suid,我们可以更好地确定我们是否有文档中的下一个方法的 suid:

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

    setuid? → true or false

    如果 stat 设置了 set-user-id 权限位,则返回 true,如果没有设置或操作系统不支持此功能,则返回 false。

    File.stat("/bin/su").setuid? #=&gt; true

    【讨论】:

    • 仅链接的答案不受欢迎,因为如果外部资源被更改、删除或移动,答案将变得毫无用处。请在此处发布链接中的相关部分。
    • 感谢@bolov cmets 改进答案
    • 感谢@Cristic cmets 改进答案。
    • 让我继续您的回答,以确保我理解正确。至于内核在进程启动时将有效 UID 复制(保存)到保存的 UID,其他一切都无关紧要(是否设置了 suid 标志)——我们只需检查可执行文件所有者并将其视为保存的 ID( suid) – File.stat($0).uid。还是我错过了一些具体案例?
    猜你喜欢
    • 2010-12-25
    • 2013-11-12
    • 2013-06-24
    • 1970-01-01
    • 1970-01-01
    • 2011-07-28
    • 2010-10-06
    • 2011-02-06
    • 1970-01-01
    相关资源
    最近更新 更多