linux setuid与seteuid函数的比较

w8f9ii69  于 2022-11-22  发布在  Linux
关注(0)|答案(3)|浏览(126)

setuid和seteuid函数之间有什么区别?在手册页中,这两个函数的描述类似。
setuid:

DESCRIPTION

   setuid()  sets  the  effective user ID of the calling process.  If the effective UID of the caller is root, the real UID and saved
   set-user-ID are also set.

设置uid:

DESCRIPTION

   seteuid()  sets  the  effective user ID of the calling process.  Unprivileged user processes may only set the effective user ID to
   the real user ID, the effective user ID or the saved set-user-ID.

在这两个描述中都包含sets the effective user ID of the calling process。那么这两个之间的区别是什么,以及这些函数之间的功能有何不同。
还有一个疑问是,只有使用chmod(chmod u+s),我们才能设置文件的设置用户id权限。那么只有在程序运行时,进程才有权限设置用户id。除此之外,这些函数是如何设置进程的有效用户id的。

syqv5f0l

syqv5f0l1#

man page

Thus, a set-user-ID-root program wishing to temporarily drop root
   privileges, assume the identity of an unprivileged user, and then
   regain root privileges afterward cannot use setuid().  You can
   accomplish this with seteuid(2).
ss2ws0br

ss2ws0br2#

在回答“为什么使用seteuid()"的问题时:一些系统应用程序使用seteuid(),以便它们可以尝试以“有效”用户的权限执行指令。2这允许以root身份运行的程序确保,例如,它创建的任何文件都是使用有效用户id而不是root id创建的。
也许最值得注意的应用程序是Unix“cron”系统,它必须以“root”用户身份运行,但也有责任以任意用户身份执行任意命令。

vpfxa7rd

vpfxa7rd3#

x1月0n1x日

  • 在以下各节中,

我们使用privileged process的传统定义作为effective user id为0的一个。

setuid()

    • unprivileged process调用setuid()时,
      仅更改了进程的effective user id

-| 此外,应当指出,
只能将其更改为+-与相同的值|+_|或者
|+|真实的用户ID或|+|保存的用户ID集。

    • privileged process使用非零参数执行setuid()时,

则真实的用户ID effective user id和保存的set-user-ID都被设置+-为uid参数中指定的值。

  • 这是一次单程旅行,

因为
一旦X1 M10 N1 X以这种方式改变了它的标识符,

它将失去所有特权
因此,随后不能使用setuid() +-将标识符重置为0。

seteuid()

    • unprivileged process只能将有效ID +-更改为与相应|+|真实的或|+|已保存的集合ID。
  • (换句话说,
    对于unprivileged process
    seteuid()和setegid()分别与setuid()和setgid()具有相同的效果,

但前面提到的BSD可移植性问题除外。)

    • 一个privileged process可以将一个有效ID +-改变为任何值。

如果privileged process使用seteuid() +-将其effective user id +-更改为非零值,
那么它就不再享有特权

(++但可能能够+-通过上一条规则重新获得权限)。

例如

  • 使用seteuid()是set-user-ID和set-group-ID程序+-临时删除并在以后重新获得权限的首选方法。

下面是一个例子:

euid = geteuid();               /* **Save initial effective user ID** (which is same as saved set-user-ID) */

if (seteuid(getuid()) == -1)    /* Drop privileges */
    errExit("seteuid");
if (seteuid(euid) == -1)        /* **Regain privileges** */
    errExit("seteuid");

  • (因此,setuid()seteuid()仅对privileged process不同)

seteuid()

(++但可能能够+-通过上一条规则重新获得权限)。

  • (Idk说明了如何实现这一点。)

参考

Linux编程接口(以上大部分内容直接抄自本书)

相关问题