Linux 上的非特权用户是否可以看到环境变量?

Linux 上的非特权用户是否可以看到环境变量?

我试图确定在 Linux 中,其他(非 root)用户是否可以观察进程的环境变量。

直接的用例是将秘密放入环境变量中。网络上很多地方都认为这是不安全的,但我无法将 Linux 中的确切暴露点归零。

请注意,我是不是谈论将明文秘密放入文件中。另请注意,我是不是谈论对 root 帐户的暴露(我认为尝试向具有 root 的对手隐藏秘密是不可能的)。

这个问题似乎是在解决我的问题,其中的评论将环境变量归类为完全没有安全性,或者只是简单地被混淆,但是如何访问它们呢?

在我的测试中,一个非特权用户无法通过进程表(“ps auxwwe”)观察另一个用户的环境变量。设置环境变量(例如导出)的命令是 shell 内置命令,它们不会进入进程表,并且扩展后也不在 /proc/$pid/cmdline 中。 /proc/$pid/environ 只能由进程所有者的 UID 读取。

也许混淆是在不同的操作系统或版本之间。网络上的各种(最近的)来源都谴责环境变量的不安全性,但我对不同 Linux 版本的抽查似乎表明,这至少不可能追溯到 2007 年(可能更远,但我没有盒子)手来测试)。

在Linux中,非特权用户如何观察另一个进程的环境变量?

答案1

正如吉尔斯在一篇非常全面的文章中所解释的那样回答对于 security.stackexchange.com 上的类似问题,进程环境只能由拥有该进程的用户(当然还有 root 用户)访问。

答案2

环境变量非常安全。您所链接的问题是说,如果系统受到损害,那么在配置文件上使用环境变量的唯一安全好处就是模糊性。这意味着如果有人获得了 root 访问权限,他们就可以同时访问这两个权限。
使用环境变量来存储秘密数据是否被认为是“模糊的”也是有争议的。这是一种很常见的做法,因此我不认为是这样。

您只能在两个位置访问存储在环境变量中的数据:

1.进程的运行环境

当进程运行时,可以通过 访问该进程的环境变量/proc/$PID/environ。但是,只有拥有该进程的用户或 root 才能访问该文件。

2.环境变量的来源

如果您使用 init 脚本,并且变量存储在该 init 脚本中,那么当然可以通过读取该脚本来获取变量。

或者,如果环境变量来自其他地方,那么无论它在哪里。

3.“ps”输出

是的,我知道我说的是 2,在任何像样的系统中,都会是 2。但是,如果管理员不知道他在做什么,则可以开辟第三条大道。

如果该进程是通过类似的方式启动的sh -c 'cd /foo/bar; POP=tart /my/executable',那么该sh进程将在以下位置可见ps

$ sh -c 'cd /; POP=tart sleep 10' &
[1] 3085

$ ps ax | grep POP
phemmer   3085  14   5  0.0  0.0 SN         00:00 sh -c cd /; POP=tart sleep 10

相关内容