.. SPDX-License-Identifier: GPL-2.0 .. include:: ../disclaimer-zh_CN.rst :Original: Documentation/userspace-api/no_new_privs.rst :翻译: æŽç¿ Rui Li <me@lirui.org> ============ æ— æ–°æƒé™æ ‡å¿— ============ execve系统调用å¯ä»¥ç»™ä¸€ä¸ªæ–°å¯åŠ¨çš„ç¨‹åºæŽˆäºˆå®ƒçš„çˆ¶ç¨‹åºæœ¬æ²¡æœ‰çš„æƒé™ã€‚最明显的两个 例å就是setuid/setgid控制程åºå’Œæ–‡ä»¶çš„能力。为了é¿å…父程åºä¹ŸèŽ·å¾—è¿™äº›æƒé™ï¼Œå†… æ ¸å’Œç”¨æˆ·ä»£ç å¿…é¡»å°å¿ƒé¿å…任何父程åºå¯ä»¥é¢ 覆å程åºçš„æƒ…况。比如: - 程åºåœ¨setuidåŽï¼ŒåЍæ€è£…è½½å™¨å¤„ç† ``LD_*`` 环境å˜é‡çš„ä¸åŒæ–¹å¼ã€‚ - 对于éžç‰¹æƒç¨‹åºï¼Œchroot是ä¸å…è®¸çš„ï¼Œå› ä¸ºè¿™ä¼šå…许 ``/etc/passwd`` 在继承 chroot的程åºçœ¼ä¸è¢«æ›¿æ¢ã€‚ - 执行代ç 对ptrace有特殊处ç†ã€‚ 这些都是临时性的修å¤ã€‚ ``no_new_privs`` ä½ï¼ˆä»Ž Linux 3.5 起)是一个新的通 用的机制æ¥ä¿è¯ä¸€ä¸ªè¿›ç¨‹å®‰å…¨åœ°ä¿®æ”¹å…¶æ‰§è¡ŒçŽ¯å¢ƒå¹¶è·¨execveæŒä¹…化。任何任务都å¯ä»¥è®¾ ç½® ``no_new_privs`` 。一旦该ä½è¢«è®¾ç½®ï¼Œå®ƒä¼šåœ¨forkã€cloneå’Œexecveä¸ç»§æ‰¿ä¸‹åŽ» ,并且ä¸èƒ½è¢«æ’¤é”€ã€‚在 ``no_new_privs`` 被设置的情况下, ``execve()`` å°†ä¿è¯ ä¸ä¼šæŽˆäºˆæƒé™åŽ»åšä»»ä½•没有execve调用就ä¸èƒ½åšçš„事情。比如, setuid å’Œ setgid ä½ä¸ä¼šå†æ”¹å˜ uid 或 gid;文件能力ä¸ä¼šè¢«æ·»åŠ åˆ°æŽˆæƒé›†åˆä¸ï¼Œå¹¶ä¸”Linux安全模å—( LSM)ä¸ä¼šåœ¨execveè°ƒç”¨åŽæ”¾æ¾é™åˆ¶ã€‚ 设置 ``no_new_privs`` 使用:: prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0); ä¸è¿‡è¦å°å¿ƒï¼ŒLinux安全模å—(LSM)也å¯èƒ½ä¸ä¼šåœ¨ ``no_new_privs`` 模å¼ä¸‹æ”¶ç´§çº¦æŸã€‚ (这æ„味ç€ä¸€ä¸ªä¸€èˆ¬çš„æœåŠ¡å¯åŠ¨å™¨åœ¨æ‰§è¡Œå®ˆæŠ¤è¿›ç¨‹å‰å°±åŽ»è®¾ç½® ``no_new_privs`` å¯èƒ½ 会干扰基于LSM的沙箱。) 请注æ„, ``no_new_privs`` å¹¶ä¸èƒ½é˜»æ¢ä¸æ¶‰åŠ ``execve()`` çš„æƒé™å˜åŒ–。一个拥有 适当æƒé™çš„任务ä»ç„¶å¯ä»¥è°ƒç”¨ ``setuid(2)`` 并接收 SCM_RIGHTS æ•°æ®æŠ¥ã€‚ ç›®å‰æ¥è¯´ï¼Œ ``no_new_privs`` 有两大使用场景: - 为seccomp模å¼2沙箱安装的过滤器会跨execveæŒä¹…åŒ–ï¼Œå¹¶èƒ½å¤Ÿæ”¹å˜æ–°æ‰§è¡Œç¨‹åºçš„行为。 éžç‰¹æƒç”¨æˆ·å› æ¤åœ¨ ``no_new_privs`` 被设置的情况下åªå…è®¸å®‰è£…è¿™æ ·çš„è¿‡æ»¤å™¨ã€‚ - ``no_new_privs`` 本身就能被用于å‡å°‘éžç‰¹æƒç”¨æˆ·çš„æ”»å‡»é¢ã€‚如果所有以æŸä¸ª uid è¿è¡Œçš„程åºéƒ½è®¾ç½®äº† ``no_new_privs`` ,那么那个 uid å°†æ— æ³•é€šè¿‡æ”»å‡» setuid, setgid å’Œä½¿ç”¨æ–‡ä»¶èƒ½åŠ›çš„äºŒè¿›åˆ¶æ¥ææƒï¼›å®ƒéœ€è¦å…ˆæ”»å‡»ä¸€äº›æ²¡æœ‰è¢«è®¾ç½® ``no_new_privs`` ä½çš„东西。 å°†æ¥ï¼Œå…¶ä»–潜在的å±é™©çš„å†…æ ¸ç‰¹æ€§å¯èƒ½è¢«éžç‰¹æƒä»»åŠ¡åˆ©ç”¨ï¼Œå³ä½¿ ``no_new_privs`` 被置ä½ã€‚ 原则上,当 ``no_new_privs`` è¢«ç½®ä½æ—¶ï¼Œ ``unshare(2)`` å’Œ ``clone(2)`` çš„å‡ ä¸ªé€‰ 项将是安全的,并且 ``no_new_privs`` åŠ ä¸Š ``chroot`` 是å¯ä»¥è¢«è®¤ä¸ºæ¯” chrootæœ¬èº«å± é™©æ€§å°å¾—多的。