AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 778022
Accepted
rando
rando
Asked: 2024-06-09 20:54:19 +0800 CST2024-06-09 20:54:19 +0800 CST 2024-06-09 20:54:19 +0800 CST

执行权限有什么安全优势?

  • 772

假设某些系统管理员对其用户读取 /sbin 中的文件没有问题,但不希望他们运行这些文件。举个例子

/sbin/初始化
一位叛逆的用户使用
ld.so /sbin/poweroff
反而。弄清楚这一点后,系统管理员就会阻止执行访问
ld.so
这没问题,因为用户可以简单地将 /bin/ld.so 复制到他们的主目录并使用
chmod +x ./myld.so
./myld.so /sbin/init
系统管理员无法拒绝对 /bin/ld.so 的读取访问,因为它是 /lib/ld-linux-architecture.so 的符号链接,这样做会使系统对于叛逆的用户来说基本上毫无用处。

那么执行特权的意义是什么?

security
  • 3 3 个回答
  • 44 Views

3 个回答

  • Voted
  1. Marcus Müller
    2024-06-09T21:36:13+08:002024-06-09T21:36:13+08:00

    假设某些系统管理员对其用户读取 /sbin 中的文件没有问题,但不希望他们运行这些文件。举个例子

    然后该管理员就消失了。任何用户都可以

    cat /sbin/program > ~/program # only needs read privileges
    chmod o+x ~/program
    ~/program
    

    所以,这没有意义。两个例外:

    1. 原始版本可能已设置 suid 位。
    2. 原始版本可能有进一步限制它的安全 xattrs(SELinux、Apparmor、其他 LSM……)

    第二件事无关紧要。这是相对于以用户身份执行可执行文件副本的附加限制。

    首先:是的,这是个问题。但解决方案几乎无一例外地是放弃 setuid 二进制文件,转而采用进程不会获得起始用户没有的特权的机制。(你可以认为复杂的 sudo 规则是一种值得怀疑的权宜之计,但至少它有优势,因为你至少可以通过 /etc/sudoers 微调谁可以以不同用户身份执行什么。在我看来,它太容易出错了。)

    这种机制在非 GNU/BSD 用户态“人机界面”操作系统(即 Android、Windows、MacOS、iOS、MBOS,仅举我想到的几个)中相当普遍:你永远不会启动“系统修改”以非特权用户身份突然获得 root 访问权限的命令,因为这只是一个寻找错误的邀请,这些错误允许您让该程序执行您想要它执行的任何操作(您可以执行您希望它们执行的任何操作的 *nix 程序的精选列表)执行)。
    例如,一个流行的事情是,在科学计算服务器上,备份客户端被赋予 suid – 这样普通用户就可以将整个环境的备份运行到他们无法定期访问的存储服务中。好主意,除了能够在命令行上指定压缩器,然后以 root 身份运行之外。使用生成 telnet 服务器的脚本,否则将输入传递到未压缩的输出;完成后,你的后门就到了。

    相反,有一个由 init 进程(~equivalent)产生的系统管理守护进程,非特权用户向其发送非常明确的请求,该守护进程在内部检查特权(通常使用集中机制),然后执行预配置的操作。

    您的 /sbin/poweroff 示例完美地说明了这一点。对于当今的 Linux 发行版来说,关机是一个复杂的过程 - 您需要检查请求用户是否有权执行此操作,您需要检查没有其他人登录,您需要卸载已登录用户可能自己挂载的所有内容,包括网络文件系统,停止他们的用户守护进程(从他们的 emacs -d 到他们的 steam 客户端!),保存他们的工作,关闭他们的应用程序,注销他们,启动关机序列,按正确的顺序关闭所有内容(在系统 NFS 挂载仍在同步数据时不能关闭网络!)……
    我可能已经有十年没有见过多用户 Linux 系统了,其中 /sbin/poweroff 只是一个 suid 关机脚本。我敢肯定 BSD 有同样的问题并以类似的方式处理它。所以,如果存在这个问题,那是因为管理员在 1990 年代中期离开了他的系统。是时候做点什么了!

    Linux 桌面用户空间早已转向此。您的 Linux 桌面不再调用 Suid 来mount挂载您刚插入并想要以非特权用户身份打开的 USB 记忆棒,而是请求从磁盘管理守护进程访问。运行良好(并且,经过实践,它比 90 年代末/2000 年代初的 Linux 更可靠、更友好、更不容易出错)。

    那么,回到你的问题:

    那么执行特权的意义是什么?

    它允许您限制哪些文件可以立即执行。如前所述,SUID 和其他文件绑定安全机制的存在会产生影响;它会影响您是否可以使用某些东西作为文件格式的解释器,并且它会告诉您的 shell,当您键入“nano”时,您希望执行 /usr/bin/nano,而不是名为“的文本文件” nano”恰好结束在您路径中的其他地方。

    • 3
  2. Best Answer
    Stephen Kitt
    2024-06-09T21:41:35+08:002024-06-09T21:41:35+08:00

    文件的执行权限位并不是真正的安全功能,它主要用于区分可执行文件和不可执行文件。

    执行安全性由其他系统功能处理。例如,不想允许用户运行任意二进制文件的管理员可以确保用户可以写入的任何目录都位于noexec安装点上。权限提升(例如 setuid 二进制文件)依赖于复制二进制文件时丢失的属性:setuid 位、配置文件(例如sudoers或pkexec配置文件)中的条目等。

    • 1
  3. telcoM
    2024-06-10T00:18:18+08:002024-06-10T00:18:18+08:00

    那么执行特权的意义是什么?

    主要是它可以防止无意中执行实际上不包含可执行代码或脚本的文件。诸如README.txt.

    您认为拒绝程序文件的执行权限同时允许用户读取它是徒劳的,这是绝对正确的:用户可以读取的任何内容,他们都可以复制;新副本将归他们所有,可以根据他们的需要设置权限。

    但在某些情况下,您可能希望授予执行权限,而不授予相应的读取权限。一个示例可能是分配有 setuid/setgid 权限的程序。一些专有的 Unix 系统(以及一些强化指南)可能会将权限设置/bin/passwd为---s--x--x,所有者root,以阻止用户尝试通过使用反汇编程序或其他调试工具来查找 setuid 二进制文件中的弱点。

    在 Linux 和 BSD 等开源操作系统中,这种对权限的微观管理可以被认为是不必要的,因为这些 setuid/setgid 程序的源代码无论如何都可以免费提供给任何人。

    即便如此,内核和驱动程序仍然规定哪些操作需要比普通用户更多的权限。/sbin/ifconfig以普通用户身份访问可执行副本可能允许您查看系统的网络设置,但如果您尝试更改它们,您将得到的只是一条“权限被拒绝”错误消息。

    如果你尝试复制 setuid 或 setgid 二进制文件,你会发现许多文件系统驱动程序在写入文件时会自动删除这些权限位,因此在写入完成后需要明确放回这些位……但如果没有 root (或同等) 权限,你绝对不能生成除你自己的用户帐户之外任何人拥有的新文件,因此即使你可以保留或重新添加 setuid 位,副本也不会是 setuid root,而是 setuid yourself。它不会授予你任何你没有的权限,并且拥有它可能允许其他用户冒充你。

    setgid 位也是如此:如果您尝试将 setgid 位添加到您的用户帐户还不是其成员的组所拥有的文件中,则添加 setgid 位的请求将被默默忽略。

    看man 2 chmod:

    如果调用进程没有特权(Linux:没有 CAP_FSETID 能力),并且文件的组与进程的有效组 ID 或其补充组 ID 之一不匹配,则 S_ISGID 位将被关闭,但这不会导致返回错误。

    • 1

相关问题

  • 将外部 IP 放入变量中 - grep 操作失败 [重复]

  • 简而言之,OpenBSD 的承诺是什么?

  • 加强 rhel6/7 服务器的安全性 [关闭]

  • 如果某人被授予 root 访问权限,是否可以劫持服务器作为人质?[关闭]

  • 是否有实现 RFC 5848“签名系统日志消息”的系统日志守护程序?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve