是否有其他用户可以看到`export SECRET =“...”`?

时间:2017-03-09 04:53:06

标签: bash

我知道如果我在bash中运行命令,那么另一个用户可以使用许多不同的方式查看参数。所以SomeCommand $PASSWORD是一个坏主意。如果我这样做,我认为同样适用

env PASSWORD="SECRET" SomeCommand PASSWORD

其中SomeCommand现在读取其中的环境变量,比如python中的os.environ["PASSWORD"]。虽然现在密码的持续时间较短:它是env的命令行arg,它运行SomeCommand(环境中有PASSWORD,所以有人看{4}}会看到/proc。注意env PASSWORD="SECRET" SomeCommand PASSWORD只能由root读取,因为/proc/PID/environ通常是短暂的,这样更安全,但仍会泄漏其参数)。

但是,如果我使用env,则同样适用,例如export因为export PASSWORD="SECRET"; SomeCommand PASSWORD是内置的bash(即它不会泄漏导出的内容,比如通过export)?

1 个答案:

答案 0 :(得分:2)

  

SomeCommand $ PASSWORD是个坏主意

是。密码将显示在ps(1)检查的命令行中,并在/ proc中显示SomeCommand的持续时间。

  

env PASSWORD =" SECRET" SomeCommand PASSWORD

SECRET将在ps和/ proc中显示env;它将在SomeCommmand期间驻留在(私有)环境中。这个解决方案稍微(或远)更好。

  

如果我使用导出,则同样适用export PASSWORD =" SECRET&#34 ;; SomeCommand PASSWORD,因为导出是内置的bash?

export是一个bash内置的事实并不意味着什么。这个解决方案更糟糕,因为现在PASSWORD=secret将在/ proc中显示SomeCommand的持续时间(作为SomeCommand的environ var),并且永远存在于您自己的环境中!除非你后来取消它;那么,它与使用env的情况相同。

也许您可以将密码存储在您拥有的文件中,而其他人无法读取,SomeCommand应该从该文件中获取密码。或者,更好的是,实现一些使密码唯一的机制:例如,根据当前日期/时间,用某些东西来扰乱你的秘密,并让SomeCommand解密这个秘密。即使某人(root?)读取了混乱的秘密,也不会很快破坏安全性。

评论后更新:假设没有人可以隐藏任何[魔鬼命名] root,那么问题就是专注于隐私vs 其他普通用户。文件/ proc / PID / environment对他们来说是不可读的,因此可以认为环境是安全的。鉴于此,解决方案

  

export PASSWORD = secret; SomeCommand PASSWORD

是最好的,因为它会在安全自己的环境中编写 secret ,然后启动SomeCommand PASSWORD,这将在ps(1)中可见,但是不包含实际的秘密

另一种解决方案,

  

env PASSWORD = secret SomeCommand PASSWORD

非常相似,但是,短时间内,ps(1)将可以看到 secret 。在那么短的时间之后,envexport方式是等价的。 使用exportPASSWORD=secret保留在当前环境中,而env则不会:但假设环境是安全的,因为bash历史文件(包含最后一个文件的文件)是安全的命令已执行)。

在下面的rici发表评论后更新:对 - 没有必要使用导出。简单的PASSWORD=secret SomeCommand PASSWORD具有不在ps中可见的优点,并且都不会将秘密存储在当前环境中。如此简单......一个证明3个大脑比2个好的演示!

最后注意事项:如上所述,如果root用户可以访问SomeCommand的源,则可以通过root来破坏秘密。如果源无法访问,root仍然可以反汇编SomeCommand。 root可以看到系统的所有内存,如果需要的话。换句话说,root用户必须是可信任的......