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

Jos*_*ler 17 linux security environment-variables

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

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

请注意,我不是在谈论将明文机密放入文件中。另请注意,我不是在谈论暴露于 root 帐户(我认为试图隐藏 root 作为非启动者的对手的秘密)。

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

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

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

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

gun*_*ert 11

正如 Gilles在 security.stackexchange.com 上对类似问题的非常全面的回答中所解释的那样,只有拥有进程的用户(当然还有 root)才能访问进程环境。


phe*_*mer 9

环境变量非常安全。您链接到的问题是,如果系统受到威胁,那么在配置文件上使用环境变量的唯一安全优势就是默默无闻。这意味着如果有人获得了 root 访问权限,他们就可以同时访问这两者。
是否将环境变量用于秘密数据被认为是“晦涩难懂的”也值得商榷。这是一种非常普遍的做法,因此我不会这么认为。

您只能在 2 个地方访问存储在环境变量中的数据:

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
Run Code Online (Sandbox Code Playgroud)

  • 另一个可能的位置:如果环境变量是通过 shell 设置的(例如 `export FOO=bar`),那么如果用户没有采取预防措施,它也可能出现在历史文件中(例如 `~/.bash_history`)阻止它保存,或将其删除。 (3认同)
  • 你还应该提到 `ps` 的 `e` 修饰符。它还只允许查看用户拥有的进程的环境。 (2认同)