gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 12:38:42 27 4
gpt4 key购买 nike

这是一个 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) 之后,这三个都变成了 1000setuid(0) 让我把 euid 改成 0 怎么样?

最佳答案

有两种情况,

  1. You want to temporarily drop root privilege while executing setuid program
  2. You want to permanently drop root privilege while executing setuid program...
  • 您可以通过将 euid 设置为真实用户 id,然后将 uid 更改为您想要的任何内容来临时做到这一点。稍后当您需要恢复 root 权限时,您可以将 uid 设置为 root,有效的用户 ID 将更改回 root .这是因为保存的用户 ID 没有改变。
  • 您可以通过直接将 uid 更改为特权较低的用户 id 来永久放弃特权。在此之后,无论如何您都无法恢复 root 权限。

案例一:

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/status |少

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

这个命令将显示一个 Uid 和 Gid,它有 4 个字段(前三个字段是我们关心的)。类似上面的东西

三个字段分别代表uid、euid和saved-user-id。您可以在 setuid 程序中引入暂停(来自用户的输入)并检查 cat/proc/PROCID/task/PROCID/status | 的每个步骤。少 命令。在每个步骤中,您都可以检查保存的 uid 是否发生了上述变化。

如果您是 euid 是 root 并且您更改了 uid,则权限将永久删除。如果有效用户 id 不是 root,则保存的用户 id 永远不会被触及,您可以重新获得 root 权限任何时候你想在你的程序。

关于linux - RealUID,保存的 UID,有效的 UID。这是怎么回事?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8499296/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com