有没有办法使某个脚本的 SIGSTOP 无效?
Is there a way to nullify SIGSTOP for a certain script?
我已经创建了一个脚本,我希望它实际上是 "immune" 到 SIGSTOP。
我知道 SIGKILL 和 SIGSTOP 都不能被捕获或忽略。
我知道 Linux 的初始化系统无法接收 "fatal" 信号,因为它的信号结构标志上有 SIGNAL_UNKILLABLE 标志(尽管该句子的后半部分飞过我的头大部分)。
我愿意编辑我的内核以授予此脚本免疫力,唯一的问题是我不知道如何。
所以,我的问题是,有没有办法使某个 script/process 的 SIGSTOP 无效?
由于我的脚本(使用 systemd)的服务文件中的 Restart 参数,我能够处理 SIGKILL,虽然我滚动浏览了手册以寻找与暂停进程类似的内容,但我还没有找到什么都没有。
对于SIGSTOP导致的进程挂起,有类似Restart=always的吗?
我宁愿不必经历改变内核或与内核相关的事情的过程,但如果这是唯一的方法,我会的。
谢谢。
好的,我能想到的最好的解决方案是 SELinux。
SELinux 是由 NSA 创建的内核插件,后来发布到 public。它常用于 Linux 系统,默认情况下出现在 Android 设备上。 SELinux 允许创建 "contexts"。上下文是提供给文件和进程的附加标签,允许细分责任和权限。
这如何解决您的问题?好吧,您可以限制您的用户进程(甚至是 root 用户)的 SELinux 权限,这样您甚至根本不允许向其他进程发出信号。事实上,您可以阻止与它的任何交互。如果您愿意,您甚至可以阻止自己关闭 SELinux(尽管从操作角度可以避免,最好不要这样做)。在某种程度上,这可能是您最接近不可破解范围内任何地方的解决方案。话虽这么说,SELinux 为此目的的设置和配置并不完全是在公园里散步。文档是有限的(但存在),特定于发行版,在某些情况下甚至是深奥的。我自己确实有一些使用 SELinux 的经验。
编辑:
通过快速谷歌搜索,似乎可以在 Arch 上安装 SELinux,但就像 Arch 上的大多数东西一样,它需要一些努力——超出 Whosebug 评论块的范围。但是,一旦安装了 SELinux,我将在这里简要描述您的目标集:
- 确定您当前所在的上下文。使用 "id" 命令应该提供此上下文。
- 使用 context process transition 以便在您执行脚本时,该脚本 运行 处于新的上下文中。您可能需要为您的脚本创建一个新的上下文 运行 in.
- 创建 sepolicy 规则,允许该脚本根据需要与您的进程进行交互。也许这包括在不同上下文中杀死其他进程的能力,或者使用嗅探等从 tcp 端口读取的能力。您可以使用 audit2allow 程序来帮助您创建这些规则。
默认情况下,SELinux 拒绝任何未明确允许的内容。您现在的目标是确保允许您可能想在系统上执行的所有操作,并添加策略规则以允许所有这些操作。查看 SELinux 审计日志是了解 SELinux 抱怨的所有内容的好方法 - 你的工作是检查并将所有这些审计失败转换为 "allow" 规则。
完成所有这些后,请确保不要 "allow" 您的 processes/shell 开始的任何上下文能够杀死或发出脚本 运行 所在的上下文,你应该完成了。现在尝试 SIGSTOP 或 SIGKILL 应该生成 "Permission denied error".
我已经创建了一个脚本,我希望它实际上是 "immune" 到 SIGSTOP。
我知道 SIGKILL 和 SIGSTOP 都不能被捕获或忽略。
我知道 Linux 的初始化系统无法接收 "fatal" 信号,因为它的信号结构标志上有 SIGNAL_UNKILLABLE 标志(尽管该句子的后半部分飞过我的头大部分)。
我愿意编辑我的内核以授予此脚本免疫力,唯一的问题是我不知道如何。
所以,我的问题是,有没有办法使某个 script/process 的 SIGSTOP 无效?
由于我的脚本(使用 systemd)的服务文件中的 Restart 参数,我能够处理 SIGKILL,虽然我滚动浏览了手册以寻找与暂停进程类似的内容,但我还没有找到什么都没有。
对于SIGSTOP导致的进程挂起,有类似Restart=always的吗?
我宁愿不必经历改变内核或与内核相关的事情的过程,但如果这是唯一的方法,我会的。
谢谢。
好的,我能想到的最好的解决方案是 SELinux。
SELinux 是由 NSA 创建的内核插件,后来发布到 public。它常用于 Linux 系统,默认情况下出现在 Android 设备上。 SELinux 允许创建 "contexts"。上下文是提供给文件和进程的附加标签,允许细分责任和权限。
这如何解决您的问题?好吧,您可以限制您的用户进程(甚至是 root 用户)的 SELinux 权限,这样您甚至根本不允许向其他进程发出信号。事实上,您可以阻止与它的任何交互。如果您愿意,您甚至可以阻止自己关闭 SELinux(尽管从操作角度可以避免,最好不要这样做)。在某种程度上,这可能是您最接近不可破解范围内任何地方的解决方案。话虽这么说,SELinux 为此目的的设置和配置并不完全是在公园里散步。文档是有限的(但存在),特定于发行版,在某些情况下甚至是深奥的。我自己确实有一些使用 SELinux 的经验。
编辑: 通过快速谷歌搜索,似乎可以在 Arch 上安装 SELinux,但就像 Arch 上的大多数东西一样,它需要一些努力——超出 Whosebug 评论块的范围。但是,一旦安装了 SELinux,我将在这里简要描述您的目标集:
- 确定您当前所在的上下文。使用 "id" 命令应该提供此上下文。
- 使用 context process transition 以便在您执行脚本时,该脚本 运行 处于新的上下文中。您可能需要为您的脚本创建一个新的上下文 运行 in.
- 创建 sepolicy 规则,允许该脚本根据需要与您的进程进行交互。也许这包括在不同上下文中杀死其他进程的能力,或者使用嗅探等从 tcp 端口读取的能力。您可以使用 audit2allow 程序来帮助您创建这些规则。
默认情况下,SELinux 拒绝任何未明确允许的内容。您现在的目标是确保允许您可能想在系统上执行的所有操作,并添加策略规则以允许所有这些操作。查看 SELinux 审计日志是了解 SELinux 抱怨的所有内容的好方法 - 你的工作是检查并将所有这些审计失败转换为 "allow" 规则。
完成所有这些后,请确保不要 "allow" 您的 processes/shell 开始的任何上下文能够杀死或发出脚本 运行 所在的上下文,你应该完成了。现在尝试 SIGSTOP 或 SIGKILL 应该生成 "Permission denied error".