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

2023-03-26 17:48

有两种情况

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

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          |
              |    |      |            |
              +------------------------+

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是否如前所述进行更改。

解决方法

这是一个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",getegid()
    );

setuid(1000);

    printf(
        "         UID           GID  \n"
        "Real      %d  Real      %d  \n"
        "Effective %d  Effective %d  \n",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",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