涉及 gpg 对称加密的 bash 脚本的安全性

fra*_*p21 5 security bash encryption gpg vulnerability

注意这个问题已经讨论了完全相同的漏洞,但是问题的不同设置(在我的例子中我不需要存储密码)允许使用不同的解决方案(使用文件描述符而不是将密码保存在一个文件,请参阅ilkkachu 的回答)。

假设我有一个对称加密的文件my_file(使用 gpg 1.x),我在其中存储了一些机密数据,并且我想使用以下脚本对其进行编辑:

read -e -s -p "Enter passphrase: " my_passphrase
gpg --passphrase $my_passphrase --decrypt $my_file | stream_editing_command | gpg --yes --output $my_file --passphrase $my_passphrase --symmetric
unset my_passphrase
Run Code Online (Sandbox Code Playgroud)

stream_editing_command流中替换/附加某些内容的地方。

我的问题:这安全吗?变量$my_passphrase和/或解密的输出是否以某种方式可见/可访问?如果不安全,我应该如何修改脚本?

ilk*_*chu 8

gpg --passphrase $my_passphrase 
Run Code Online (Sandbox Code Playgroud)

我的问题:这安全吗?变量 $my_passphrase 和/或解密的输出是否以某种方式可见/可访问?

不,这并不真正被认为是安全的。密码将在 的输出中可见ps,就像所有其他正在运行的进程的命令行一样。数据本身将不可见,其他用户无法访问管道。

手册页gpg有这样的说法--passphrase

--passphrase string    
Run Code Online (Sandbox Code Playgroud)

使用字符串作为密码。这只能在仅提供一个密码短语时使用。显然,这在多用户系统上的安全性非常值得怀疑。如果可以避免,请不要使用此选项。

当然,如果您在系统上没有其他用户并且相信您的服务没有受到损害,那么应该没有人查看进程列表。

但在任何情况下,您都可以改为使用--passphrase-fd并让 shell 将密码短语重定向到程序。使用此处字符串:

#!/bin/bash
read -e -s -p "Enter passphrase: " my_passphrase
echo        # 'read -s' doesn't print a newline, so do it here
gpg --passphrase-fd 3 3<<< "$my_passphrase" --decrypt "$my_file" |
    stream_editing_command |
    gpg --yes --output "$my_file" --passphrase-fd 3 3<<< "$my_passphrase" --symmetric
Run Code Online (Sandbox Code Playgroud)

请注意,只有当第二个gpg在获得完整输入之前没有截断输出文件时才有效。否则第一个gpg可能无法在文件被截断之前读取文件。


为避免使用命令行,您还可以将密码存储在文件中,然后使用--passphrase-file. 但是您需要小心设置文件的访问权限,然后将其删除,并为其选择合适的位置,以便密码不会实际存储在持久存储中。