Lennart Pottering 引入了 run0 实用程序,它允许您以其他用户的标识符运行进程。新实用程序被定位为 sudo 程序的更安全的替代品,作为 systemd-run 命令的附加组件实现,并允许您摆脱使用带有 SUID 标志的可执行文件。 run0 实用程序包含在 systemd 256 的候选版本中。
需要注意的是,在 sudo 中使用 SUID 标志更改标识符会带来额外的风险,因为 SUID 进程继承的执行上下文包含许多由非特权用户控制的属性,例如环境变量、文件描述符、调度程序选项和cgroup 绑定。其中一些属性是由内核自动清除 SUID 进程的,还有一些是由应用程序本身清除的。然而,由于不小心处理可能受到非特权用户影响的外部数据,复杂的 SUID 程序(例如 sudo)中仍然经常发现漏洞。
run0 不使用 SUID,而是要求系统管理器使用指定的用户 ID 启动 shell 或进程,创建一个新的伪终端 (PTY),并在它和当前终端 (TTY) 之间传输数据。这种行为更让人想起使用 ssh 运行它,而不是使用经典 sudo 运行它。特权进程在隔离的上下文中运行,该上下文是由进程 PID 1 而不是由用户进程生成的,即不继承用户环境的属性,转发 $TERM 环境变量除外。转发是通过明确允许的属性列表进行管理的,而不是试图禁止危险属性(白名单的概念,而不是黑名单的概念)。
Polkit用于在run0中对用户能力进行授权和确定。不支持 sudo 使用的经典规则语言 (/etc/sudoers)。使用其他权限运行程序的功能内置于 systemd-run 中,并且 run0 命令被创建为 systemd-run 的符号链接,在使用时提供类似于 sudo 的命令行界面。
run0 的附加功能之一是通过在终端中设置微红色背景并向窗口标题添加红点来指示使用提升的权限。以其他权限终止执行后,点消失,背景变为正常。另外,run0支持所有“systemd-run”选项,例如“--property”参数,通过该参数可以为systemd服务进行任意设置(例如“CPUWeight=200 MemoryMax=2G IPAccounting=yes”) 。
来源: opennet.ru
