安全擦除 Bash 环境变量



假设我在Bash shell脚本中有一个保存敏感值(例如密码(的环境变量。在退出脚本之前,如何安全地覆盖保存此变量值的内存?

如果可能的话,用于执行此操作的技术将不依赖于我正在使用的 Bash 的特定实现。我想找到一种尊重标准/规范的方式来做到这一点,它适用于所有正确的 Bash 实现。

请注意,以下内容不在问题范围内: 1. 如何将敏感值放入环境变量中 2. 如何将存储在环境变量中的敏感值传递给使用它的程序

2017/7/10 5:03 更新地址 评论者 rici

里奇,谢谢你的评论,复制到这里:

"退出脚本确实是可靠地删除 脚本驻留内存中的环境变量。你为什么 感觉脚本终止后字符串的安全性低于脚本终止时的安全性 在跑吗?

我在这里的目的是遵循良好做法,并在使用完所有加密敏感值后立即从内存中清除它们。

我不知道 Bash 是否在脚本退出时主动清理脚本使用的内存。我怀疑它没有。如果确实没有,敏感的加密值将保留在内存中,并可能被对手捕获。

在 C/C++ 中,可以轻松清理值的内存位置。我试图在 Bash 中找出这是可能的。Bash可能根本不是安全敏感型应用程序的正确工具。

首先,我们需要区分环境变量和shell变量。环境变量在进程的生存期内存在,无法覆盖。不仅如此,在许多系统上,它们对其他进程都是微不足道的可见的。例如,Linux提供了/proc文件系统,它允许对正在运行的进程进行大量内省,包括观察其环境变量。

下面是尝试覆盖环境变量的 Bash 脚本的示例。请注意,尽管脚本中的值发生了更改,但进程的环境并未更改:

$ SECRET=mysecret bash -c 
'strings /proc/$$/environ | grep SECRET
SECRET=overwritten
echo "SECRET=$SECRET"
strings /proc/$$/environ | grep SECRET'
SECRET=mysecret
SECRET=overwritten
SECRET=mysecret

因此,除非控制对计算机的所有访问,否则将机密存储在环境变量中从来都不安全。

在(非环境(shell 变量中保存机密要安全得多,因为攻击者需要能够访问进程的内存,这通常只有内核才能做到。虽然你说得对,尽量减少你掌握这些秘密的时间是一个很好的做法,但通常不值得跳过很多箍。保护您的系统和执行环境更为重要,因为具有足够访问权限的有动机的攻击者可以观察到机密,即使它只存在于内存中很短的时间。在内存中保存秘密的时间超过绝对必要的时间只是风险的轻微增加,而在不安全的系统上运行特权程序已经意味着所有赌注都已关闭。

最新更新