Linux 上脚本的功能

0xC*_*22L 9 linux scripting capabilities

如果我想在一个可执行文件上设置一个功能 ( capabilities(7)),例如CAP_NET_BIND_SERVICE,并且该文件是一个脚本,我是否必须setcap(8)在启动该脚本的解释器上设置功能 ( ) 或者是否足以在脚本文件上设置它本身?

注意:该问题特别涉及 Scientific Linux 6.1,但我认为可以笼统地回答。

Mir*_*kár 9

脚本上的设置功能将无效。这与setuid在脚本上不起作用的情况类似。与后一种情况类似,它是如何execve处理 shebang的实现及其背后的安全推理(有关详细信息,请参阅:Allow setuid on shell scripts)。

我想你有这些选择

  1. 设置解释器本身的功能(实际上是它的副本)

    • 你在这里有一个问题,任何能够执行它的人都将使用这些提升的功能运行(能够执行一些任意脚本或以交互方式启动它)
  2. 编写一个包装器可执行文件,它将具有硬编码逻辑来执行您的脚本,并在此可执行文件上设置所需的功能

    • 确保没有人能够修改或删除/替换脚本
    • 仍然通过这样做chroot可能会误用这种包装器

在这两种情况下,您都必须execve通过设置inheritable标志来确保设置的功能能够继续存在。您通常还可以使用pam_cap分布式,libcap通过仅为选定用户的配置来实际激活所需的功能。

一般来说,您希望确保没有人能够通过改变环境来修改您的解释器的行为,例如。PYTHON_PATH或类似的东西。