操作系统openpty()之后不允许操作操作系统集ID()从根到美国

2024-09-27 07:32:28 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我们从根用户123设置euid(123),它将失败。无论如何要跑操作系统openpty()直接作为用户123,它将成功。有什么提示吗?在

在python2.7或3.6中都是相同的。在Redhat 7上:

>>> os.openpty()
(3, 4)
>>> os.seteuid(12345)
>>> os.openpty()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
PermissionError: [Errno 1] Operation not permitted

Tags: 用户inmostosstdinlinecallfile
1条回答
网友
1楼 · 发布于 2024-09-27 07:32:28

strace输出(最好是使用C版本):

setresuid(-1, 123, -1)                  = 0
open("/dev/ptmx", O_RDWR)               = 3
statfs("/dev/pts", {f_type=DEVPTS_SUPER_MAGIC, f_bsize=4096, f_blocks=0, f_bfree=0, f_bavail=0, f_files=0, f_ffree=0, f_fsid={val=[0, 0]}, f_namelen=255, f_frsize=4096, f_flags=ST_VALID|ST_NOSUID|ST_NOEXEC|ST_RELATIME}) = 0
ioctl(3, TCGETS, {B38400 opost isig icanon echo ...}) = 0
ioctl(3, TIOCGPTN, [6])                 = 0
stat("/dev/pts/6", {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 6), ...}) = 0
getuid()                                = 0
chown("/dev/pts/6", 0, 5)               = -1 EPERM (Operation not permitted)
close(3)                                = 0

由于geteuid()不再是根,所以不可能将TTY更改为getuid()所有。在

您的选择是:

  • 更改UID,而不仅仅是EUID
  • openpty调用之前立即重置EUID,chown自己设置,然后在之后再次更改EUID
  • 自己实现openpty。。。在Linux上,它非常简单(您不需要可怕的BSD回退)。。。你需要多便携?在

相关问题 更多 >

    热门问题