gpgコマンドがフリーズする件

GnuPGのgpgコマンドがフリーズするので原因を調べました

gpgコマンドのフリーズ

ファイル hoge.txt.gpg を復号しようとして

$ gpg --decrypt hoge.txt.gpg

を実行するとgpgコマンドがフリーズします

通常はパスフレーズの入力プロンプトが表示されるのですが,ある条件では何も表示されず gpgコマンドがフリーズするようです

調査

man gpg を見ると,トラブルシューティング用に --verbose オプションが用意されていました

早速,--verboseを付与してgpgコマンドを再実行してみます

$ gpg --verbose --decrypt hoge.txt.gpg

gpg: AES256.CFB暗号化済みデータ
gpg: pinentry launched (XXXXXX gnome3 1.2.1 /dev/pts/0 xterm-256color - XXXXXXX)

原因がわかりました.

まず pinentry launched とあります.pinentry は pin entry のための外部プログラムです.PINつまりパスフレーズの入力を受け取るダイアログを表示します.gnome3とありますので起動するプログラムは pinentry-gnome3 を使っていることが分かります.

そして --verboseコマンドはここで表示が止まるので,pinentry-gnome3を起動した後にgpgコマンドがフリーズしていることが分かります

原因

状況をまとめると

  1. 該当マシンをA,使用アカウントをBとする
  2. AのXサーバー(GUI)にBでログイン
  3. 同時に外部からAにsshで接続,Bでログインする
  4. ssh側のシェル上で gpg を起動する
  5. Xサーバ側に pinentry-gnome3 が立ち上がる?または立ち上げようとして失敗する?(めんどくさいので未確認)

ということでした.

発動条件がレアですが,これはバグだとも,セキュリティホールだとも主張できそうです.例えば,複数人でアカウントBを共有して,同時にAを使っている場合,パスフレーズを盗むことができます.


回避策

pinentry-gnome3を使わず,代わりに pinentry-curses を使うようにしました.

pinentry-cursesGUIを使わずにTUIでpinを入力するプログラムです.これでX11環境/ssh環境問わず動作するはずです

切り替えは alternatives を使います

$ sudo update-alternatives --config  pinentry 


切り替え後は,再ログインが必要です