Bash

涉及 gpg 對稱加密的 bash 腳本的安全性

  • June 30, 2021

注意:這個問題中已經討論了同樣的漏洞,但是問題的不同設置(在我的情況下,我不需要儲存密碼)允許不同的解決方案(使用文件描述符而不是將密碼保存在一個文件,請參閱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

在哪裡stream_editing_command替換/附加一些東西到流中。

我的問題:這安全嗎?變數$my_passphrase和/或解密的輸出是否會以某種方式可見/可訪問?如果不安全,我應該如何修改腳本?

gpg --passphrase $my_passphrase 

**我的問題:**這安全嗎?變數 $my_passphrase 和/或解密的輸出是否會以某種方式可見/可訪問?

不,這並不真正被認為是安全的。密碼片語將在 的輸出中可見ps,就像所有其他正在執行的程序的命令行一樣。數據本身將不可見,其他使用者無法訪問管道。

手冊頁gpg有這樣的說法--passphrase

--passphrase string    

使用字元串作為密碼。僅當僅提供一個密碼時才能使用此功能。顯然,這在多使用者系統上具有非常可疑的安全性。如果可以避免,請不要使用此選項。

當然,如果您在系統上沒有其他使用者並且相信您的任何服務都沒有受到損害,那麼應該沒有人查看程序列表。

但在任何情況下,您都可以改為使用--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

請注意,僅當第二個gpg在獲取完整輸入之前不截斷輸出文件時才有效。否則,第一個gpg可能無法在文件被截斷之前讀取文件。


為避免使用命令行,您還可以將密碼儲存在文件中,然後使用--passphrase-file. 但是您需要小心設置文件的訪問權限,之後將其刪除,並為其選擇適當的位置,以便密碼不會實際儲存在持久儲存中。

引用自:https://unix.stackexchange.com/questions/469518