我试图确定在 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