~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/Documentation/translations/zh_CN/userspace-api/no_new_privs.rst

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

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

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php