非特权用户是否可以修改/注入其他用户(root)的进程?

信息安全 注射 核心 过程
2021-08-14 17:13:40

虽然我不是任何类型的内核专家,也不会使用类似的语言进行编程C/C++,因此我对在操作系统级别管理进程的关键概念没有深入的理解,但我确实觉得我用语言编写的进程/守护进程/套接字侦听器喜欢PHPand JavaScript (Node),尽管相当简单,但很容易被恶意程序使用,不一定有root特权

所以,我想知道非特权用户是否有可能修改/注入其他用户的(root)进程,如果是这样,这个向量/入口点是什么?

(像 setuid-ing 执行argv[1]STDIN的二进制文件这样的明显愚蠢不在这个问题的范围内。)


我问这个问题是因为我想扩展我对主题的了解 - 假设一些进入 apache/www-data 可写目录并设法注入 root 拥有的进程的 web shell 所造成的损害,根据定义,对安全来说是致命的。

2个回答

由于内存保护技术,这远非一项简单的任务

在 MS-DOS、Windows 9x 和等效的家用计算系统的旧时代,内存确实在所有正在运行的进程之间平均共享。在这种情况下你的感觉是对的:任何用户进程都可以访问和修改其他进程的内存,即使是操作系统内核也没有办法完全屏蔽自己。

但现在这是老故事了。作为大型计算机(用于高度敏感和并行任务的大型冰箱外观单元)的继承,家用计算机操作系统和处理器架构获得了真正的内存保护技术。

在这种技术的基础上,有一个映射允许将内存与其拥有的进程匹配多亏了这一点,一个进程不再被允许访问它自己的内存之外的任何东西。如果一个进程试图打破这个规则(通常是由于一个错误),操作系统会无情地杀死它(这是可怕的分段错误,或者亲密的“segfault”)。

这是否意味着您所描述的威胁再也不会发生?在安全方面,永远不要说“从不”:每个看似安全的系统都有其缺陷:

  • 整个事情由操作系统内核控制,因此内核中的一个缺陷可能会导致绕过这种安全性并像过去一样获得对整个内存的访问权限。Linux 上的一个示例可能是ptrace系统调用,旨在允许跟踪(调试)进程。不时会发现漏洞,允许非特权进程滥用此功能以获得这种能力。
  • 在链条的另一端,您可能还想完全绕过操作系统,直接攻击物理 RAM 存储。此类别中最著名的攻击是行锤:已发现在许多 RAM 模块上,由于某些电子缺陷,快速且反复更改存储在某个位置的值的事实可能会影响并可能更改存储在附近位置的值。

关于您的“相当简单”的脚本语言,您的噩梦可能会成真,例如,存在Row Hammer 攻击的有效 JavaScript 实现所以肯定是的,非特权 JavaScript 程序有可能在根进程中注入一些代码。然而,这不是一件简单的事情,随着新方法的发现,新的保护技术也被开发出来:IT 安全的无尽故事;)!

是的,但这取决于操作系统。这样做的一种方法称为缓冲区溢出攻击。这些攻击是内核级别漏洞的结果,因此它们相对较少。

Computerphile 有一个关于该主题的完整视频:https ://m.youtube.com/watch?v=1S0aBV-Waeo