xref: /linux/Documentation/translations/zh_CN/userspace-api/no_new_privs.rst (revision 7ae9fb1b7ecbb5d85d07857943f677fd1a559b18)
1*72b0ec35SRui Li.. SPDX-License-Identifier: GPL-2.0
2*72b0ec35SRui Li.. include:: ../disclaimer-zh_CN.rst
3*72b0ec35SRui Li
4*72b0ec35SRui Li:Original: Documentation/userspace-api/no_new_privs.rst
5*72b0ec35SRui Li
6*72b0ec35SRui Li:翻译:
7*72b0ec35SRui Li
8*72b0ec35SRui Li 李睿 Rui Li <me@lirui.org>
9*72b0ec35SRui Li
10*72b0ec35SRui Li============
11*72b0ec35SRui Li无新权限标志
12*72b0ec35SRui Li============
13*72b0ec35SRui Li
14*72b0ec35SRui Liexecve系统调用可以给一个新启动的程序授予它的父程序本没有的权限。最明显的两个
15*72b0ec35SRui Li例子就是setuid/setgid控制程序和文件的能力。为了避免父程序也获得这些权限,内
16*72b0ec35SRui Li核和用户代码必须小心避免任何父程序可以颠覆子程序的情况。比如:
17*72b0ec35SRui Li
18*72b0ec35SRui Li - 程序在setuid后,动态装载器处理 ``LD_*`` 环境变量的不同方式。
19*72b0ec35SRui Li
20*72b0ec35SRui Li - 对于非特权程序,chroot是不允许的,因为这会允许 ``/etc/passwd`` 在继承
21*72b0ec35SRui Li   chroot的程序眼中被替换。
22*72b0ec35SRui Li
23*72b0ec35SRui Li - 执行代码对ptrace有特殊处理。
24*72b0ec35SRui Li
25*72b0ec35SRui Li这些都是临时性的修复。 ``no_new_privs`` 位(从 Linux 3.5 起)是一个新的通
26*72b0ec35SRui Li用的机制来保证一个进程安全地修改其执行环境并跨execve持久化。任何任务都可以设
27*72b0ec35SRui Li置 ``no_new_privs`` 。一旦该位被设置,它会在fork、clone和execve中继承下去
28*72b0ec35SRui Li,并且不能被撤销。在 ``no_new_privs`` 被设置的情况下, ``execve()`` 将保证
29*72b0ec35SRui Li不会授予权限去做任何没有execve调用就不能做的事情。比如, setuid 和 setgid
30*72b0ec35SRui Li位不会再改变 uid 或 gid;文件能力不会被添加到授权集合中,并且Linux安全模块(
31*72b0ec35SRui LiLSM)不会在execve调用后放松限制。
32*72b0ec35SRui Li
33*72b0ec35SRui Li设置 ``no_new_privs`` 使用::
34*72b0ec35SRui Li
35*72b0ec35SRui Li    prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
36*72b0ec35SRui Li
37*72b0ec35SRui Li不过要小心,Linux安全模块(LSM)也可能不会在 ``no_new_privs`` 模式下收紧约束。
38*72b0ec35SRui Li(这意味着一个一般的服务启动器在执行守护进程前就去设置 ``no_new_privs`` 可能
39*72b0ec35SRui Li会干扰基于LSM的沙箱。)
40*72b0ec35SRui Li
41*72b0ec35SRui Li请注意, ``no_new_privs`` 并不能阻止不涉及 ``execve()`` 的权限变化。一个拥有
42*72b0ec35SRui Li适当权限的任务仍然可以调用 ``setuid(2)`` 并接收 SCM_RIGHTS 数据报。
43*72b0ec35SRui Li
44*72b0ec35SRui Li目前来说, ``no_new_privs`` 有两大使用场景:
45*72b0ec35SRui Li
46*72b0ec35SRui Li - 为seccomp模式2沙箱安装的过滤器会跨execve持久化,并能够改变新执行程序的行为。
47*72b0ec35SRui Li   非特权用户因此在 ``no_new_privs`` 被设置的情况下只允许安装这样的过滤器。
48*72b0ec35SRui Li
49*72b0ec35SRui Li - ``no_new_privs`` 本身就能被用于减少非特权用户的攻击面。如果所有以某个 uid
50*72b0ec35SRui Li   运行的程序都设置了 ``no_new_privs`` ,那么那个 uid 将无法通过攻击 setuid,
51*72b0ec35SRui Li   setgid 和使用文件能力的二进制来提权;它需要先攻击一些没有被设置 ``no_new_privs``
52*72b0ec35SRui Li   位的东西。
53*72b0ec35SRui Li
54*72b0ec35SRui Li将来,其他潜在的危险的内核特性可能被非特权任务利用,即使 ``no_new_privs`` 被置位。
55*72b0ec35SRui Li原则上,当 ``no_new_privs`` 被置位时, ``unshare(2)`` 和 ``clone(2)`` 的几个选
56*72b0ec35SRui Li项将是安全的,并且 ``no_new_privs`` 加上 ``chroot`` 是可以被认为比 chroot本身危
57*72b0ec35SRui Li险性小得多的。
58