当前位置: 首页 > 面试题库 >

RealUID,已保存的UID,有效的UID。这是怎么回事?

方心思
2023-03-14
问题内容

这是一个set-root-uid程序

$ls -l
-rwsr-sr-x 1 root root 7406 2011-12-13 22:37 ./x*
int main(void) {
    printf(
        "         UID           GID  \n"
        "Real      %d  Real      %d  \n"
        "Effective %d  Effective %d  \n",
             getuid (),     getgid (),
             geteuid(),     getegid()
    );

seteuid(600);
    printf(
        "         UID           GID  \n"
        "Real      %d  Real      %d  \n"
        "Effective %d  Effective %d  \n",
             getuid (),     getgid (),
             geteuid(),     getegid()
    );

setuid(1000);

    printf(
        "         UID           GID  \n"
        "Real      %d  Real      %d  \n"
        "Effective %d  Effective %d  \n",
             getuid (),     getgid (),
             geteuid(),     getegid()
    );

setuid(0); // HOW DOES THIS SUCCEED IN SETTING THE EUID BACK TO 0
    printf(
        "         UID           GID  \n"
        "Real      %d  Real      %d  \n"
        "Effective %d  Effective %d  \n",
             getuid (),     getgid (),
             geteuid(),     getegid()
    );

    return 0 ;       
}

输出值

         UID           GID  
Real      1000  Real      1000  
Effective 0  Effective 0  
         UID           GID  
Real      1000  Real      1000  
Effective 600  Effective 0  
         UID           GID  
Real      1000  Real      1000  
Effective 1000  Effective 1000  
         UID           GID  
Real      1000  Real      1000  
Effective 0  Effective 1000

我的问题

手册页指出setuid将更改实际,保存和有效的uid。因此,在通话后setuid(1000),所有三个都更改为1000。那setuid(0)让我如何更改euid0


问题答案:

有两种情况

  1. 您想在执行setuid程序时暂时放弃root特权
  2. 您想在执行setuid程序时永久放弃root特权…

  • 您可以通过将euid设置为实际用户ID然后将uid更改为所需的任何内容来临时执行此操作。稍后,当您需要root特权时,可以将setuid设置为root,有效的userid将更改回root。这是因为保存的用户标识未更改。
  • 您可以通过立即将uid更改为较少特权的用户ID来永久放弃特权。此后,无论如何您都无法获取root特权。

情况1:

setuid程序开始执行后

1.seteuid(600);
2.setuid(1000);
3.setuid(0);

在这种情况下,可以再次获得root特权。

              +----+------+------------+
              | uid|euid  |saved-uid   |
              |----|------|------------|
            1.|1000| 0    | 0          |
            2.|1000| 600  | 0          |
            3.|1000| 1000 | 0          |
            4.|1000|  0   | 0          |
              |    |      |            |
              +------------------------+

情况2:

setuid程序开始执行后

1.setuid(1000);
2.setuid(0);



               +----+------+------------+
               | uid|euid  |saved-uid   |
               |----|------|------------|
             1.|1000|0     | 0          |
             2.|1000|1000  | 1000       |
               |    |      |            |
               +------------------------+

在这种情况下,您无法取回root特权。可以通过以下命令进行验证,

cat / proc / PROCID / task / PROCID /状态| 减

Uid:    1000    0       0       0
Gid:    1000    0       0       0

此命令将显示一个Uid和Gid,它将具有4个字段(前三个字段是我们关注的字段)。像上面的东西

这三个字段代表uid,euid和saveed-user-id。您可以在setuid程序中引入一个暂停(来自用户的输入),并检查cat /proc/PROCID/task/PROCID/status | less命令的每个步骤。在每个步骤中,您都可以检查保存的uid是否如前所述进行更改。

如果您的euid是root用户,并且更改了uid,则特权将被永久删除。如果有效的用户ID不是root用户,则保存的用户ID不会被触及,您可以在程序中随时重新获得root特权。



 类似资料:
  • 登陆 Linux 系统时,虽然输入的是自己的用户名和密码,但其实 Linux 并不认识你的用户名称,它只认识用户名对应的 ID 号(也就是一串数字)。Linux 系统将所有用户的名称与 ID 的对应关系都存储在 /etc/passwd 文件中。 说白了,用户名并无实际作用,仅是为了方便用户的记忆而已。 要论证 "Linux系统不认识用户名" 也很简单,在前面章节,我们曾经在网络上下载过 ".tar

  • 问题内容: 实际的UID,有效的UID,以及某些系统甚至具有“已保存的UID”。所有这些的目的是什么,尤其是最后一个? 问题答案: 每个UNIX进程都有3个与之关联的UID。超级用户特权是UID = 0。 真实的UID 这是创建此流程的用户/流程的UID。仅当正在运行的进程的EUID = 0时才可以更改。 有效的UID 此UID用于评估执行特定操作的进程的特权。如果EUID!= 0,则可以将EUI

  • 我在HTC DESIRE 626GPlus双SIM卡和Android 4.4.2上得到了这个错误

  • 问题内容: 我想通过NodeJS或Javascript API从Firebase提取Auth User(s)UID。我已经为其附上了屏幕截图,以便您了解我在寻找什么。 希望你们能帮助我。 问题答案: Auth数据在Firebase 3中是异步的。因此,您需要等待事件,然后才能访问当前登录用户的UID。您将无法获得其他人。应用也会同时打开时会被调用。 如果愿意,您也可以仅在收到事件后才渲染您的应用程

  • 问题内容: 我想获得Mifare Ultralight NFC标签的UID。在Java中,我有以下代码: 问题是我收到两个字节而不是UID。有什么问题?APDU是否正确? 问题答案: 您实际使用的命令不是您期望的。 使用此阅读器获取UID /序列号/枚举标识符的正确命令APDU为: 但是,您使用的构造函数定义为: 所以用 要创建一个C-APDU以下参数,,,。到目前为止,这与上述APDU相同。但是

  • 此错误“”getter'uid'在null上被调用。receiver:null尝试调用:uid“ 退出按钮: 控制台: widgets库捕获的异常接收者:null尝试调用:uid 相关的导致错误的小部件是:Qr file://g://androidstudioprojects/facem/lib/screens/home/home.dart:687:67当抛出异常时,这是堆栈:#0 object.