Linux上脚本的功能


8

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

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

Answers:


8

在脚本上设置功能将无效。类似的情况是setuid脚本无法正常工作。与后一种情况类似,它是如何execve处理shebang及其背后的安全性推理的实现(有关详细信息,请参见:在shell脚本上允许setuid)。

我想你有这些选择

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

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

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

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

通常,您要确保没有人能够通过更改环境来更改解释器的行为。PYTHON_PATH或类似的东西。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.