私のGnuPGクライアントは、キーサーバーからキーリングのキーを自動的に更新し、ポイズンされたキーをインポートしました。汚染された公開鍵を削除せずにキーリングを修正するにはどうすればよいですか?
先月、公開鍵をスパムすることによる Certificate Flooding 攻撃( CVE-2019-1305 )を介して多くの 有名なpgp証明書が攻撃されました 数万(または数十万)の署名があり、毒された公開鍵をキーサーバーにアップロードします。
たとえば、キーリングに " Tor Browser Developers(signing key) "があり、2019-06-30以降にキーサーバーから--refresh-keys
を試行した場合(キーが121,000の偽の署名が殺到します)、gpg(およびたとえばThunderbirdをenigmailで使用している場合は電子メール)は ハングして使用できなくなります 。
coverage of this issue のほとんどは、解決策は単にキーを削除することであると言っていますが、新しいコピーをダウンロードせずにローカルで公開キーをクリーンアップするにはどうすればよいですか(改ざんのための不要なベクトルを導入します)?
私はこれを修正する方法を調べるのに少し時間を費やしました、そして 私はそれについての記事を私のウェブサイトに公開しました 。以下は、この質問に対する解決策の要約です。
まず、次のコマンドを使用して、キーリングの公開鍵のサイズ(バイト単位)を一覧表示できます(GnuPG課題追跡システムでは reported として)。
user@disp1754:~$ gpg --export | gpg --list-packets | awk -F= -v oldoff=-1 -v keyid=unset '
/^# off=/{ off = $2 + 0 }
/^:public key/{ if (oldoff>-1) { print (off - oldoff) " " keyid }; oldoff = off; keyid = "unset"; }
/keyid:/ {if (keyid == "unset") { keyid = $1; } }
END { print (off - oldoff) " " keyid ; };' | sort -n
7284 keyid: 1DCBDC01B44427C7
119748 keyid: 4E2C6E8793298290
124557 keyid: 403C2657CD994F73
16934647 keyid: F20691179038E5C6
user@disp1754:~$
上記のコマンドの実行に数秒以上かかる場合は、問題があります。 20分ほどすると、問題のあるキーが下部に表示されます。 8桁(> 10 MB)の場合は、危険信号です。
ⓘ注:上記の例では、id =
F20691179038E5C6
の公開鍵のサイズが16934647
バイト= 16Mであることがわかります。これが私たちの毒の鍵です。この記事に続くコマンドは、この
keyid
(F20691179038E5C6
)を使用してキーリングを操作します。以下のコマンドのこの文字列を、マシンの上記のコマンドにある対応するkeyid
に置き換える必要があります。
ポイズニングされたキーを特定したので、削除する前に安全に保管するためにエクスポートしましょう。
user@disp1754:~$ time gpg -a --export 'F20691179038E5C6' > pubkey.asc
real 3m30.950s
user 3m24.430s
sys 0m0.322s
user@disp1754:~$ du -sh pubkey.asc
22M pubkey.asc
user@disp1754:~$
数分後、コマンドは終了し、毒された公開鍵の内容を含むpubkey.asc
という名前のファイルが作成されます。このASCII公開鍵を1つだけ含む装甲ファイルは22Mであることに注意してください!
ポイズニングされたキーの安全なバックアップがディスクにあるので、キーリングから削除しましょう。
user@disp1754:~$ time gpg --delete-key 'F20691179038E5C6'
gpg (GnuPG) 2.1.18; Copyright (C) 2017 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
pub ed25519/F20691179038E5C6 2019-01-19 Daniel Kahn Gillmor <[email protected]>
Delete this key from the keyring? (y/N) y
real 12m15.265s
user 11m54.242s
sys 0m0.715s
user@disp1754:~$
公開鍵のクリーンコピーを再インポートするには、gpg
引数--import-filters
を使用して すべて削除 署名(drop-sig
)を作成します。証明書に署名が殺到した日付。
公開鍵ファイル(上記でエクスポートしたバックアップなど)が与えられた場合、次のコマンドを使用して、証明書が1日に受信した署名の数を一覧表示できます。
user@disp1754:~$ time gpg --list-packets pubkey.asc | grep -i 'sig created ' | sort -n | uniq -c
11 hashed subpkt 2 len 4 (sig created 2019-01-19)
2 hashed subpkt 2 len 4 (sig created 2019-01-20)
4 hashed subpkt 2 len 4 (sig created 2019-01-21)
2 hashed subpkt 2 len 4 (sig created 2019-01-28)
14400 hashed subpkt 2 len 4 (sig created 2019-06-17)
40200 hashed subpkt 2 len 4 (sig created 2019-06-18)
real 0m23.061s
user 0m17.803s
sys 0m0.150s
user@disp1754:~$
上記の出力は、
次のように、この2日間のスパム署名を省略してキーをインポートできます(日付を、マシンの上記のコマンドから出力された対応する日に置き換えてください)。
user@disp1754:~$ time gpg --import-filter drop-sig="sig_created_d=2019-06-17 || sig_created_d=2019-06-18" --import pubkey.asc
gpg: key F20691179038E5C6: 54614 signatures not checked due to missing keys
gpg: key F20691179038E5C6: public key "Daniel Kahn Gillmor <[email protected]>" imported
gpg: Total number processed: 1
gpg: imported: 1
gpg: no ultimately trusted keys found
real 3m12.091s
user 3m6.991s
sys 0m0.284s
user@disp1754:~$
そして今、物事ははるかに正気であるはずです:
user@disp1754:~$ time gpg --export | gpg --list-packets | awk -F= -v oldoff=-1 -v keyid=unset '
> /^# off=/{ off = $2 + 0 }
> /^:public key/{ if (oldoff>-1) { print (off - oldoff) " " keyid }; oldoff = off; keyid = "unset"; }
> /keyid:/ {if (keyid == "unset") { keyid = $1; } }
> END { print (off - oldoff) " " keyid ; };' | sort -n
7284 keyid: 1DCBDC01B44427C7
8930 keyid: F20691179038E5C6
119748 keyid: 4E2C6E8793298290
124557 keyid: 403C2657CD994F73
real 0m0.063s
user 0m0.059s
sys 0m0.016s
user@disp1754:~$ gpg -a --export '403C2657CD994F73' > pubkey2.asc
user@disp1754:~$ du -sh pubkey2.asc
168K pubkey2.asc
user@disp1754:~$
Robert J. Hansen(2019-06-19にpgpキーが149,100の署名でスパムされた)がこの問題について優れた包括的な 要点 で指摘したように、次の方法でgpgクライアントが壊れないようにすることができます。
そのkeys.openpgp.org
キーサーバーは、これらの攻撃に対してより耐性のある新しい実験的なサーバーです(興味深いことに、これらの汚染された証明書がアップロードされるわずか数週間前に稼働しました)。完全に提供される証明書 サードパーティの署名がない であり、ユーザーが 明示的にオプトイン でない限り、キーからUIDパケットを削除することにも注意してください。
MUAを更新する必要がある場合もあります。たとえば、Thunderbirdのenigmailは、キーリングのキーを更新するように構成されている場合もあります。
Enigmailがキーサーバーからキーを更新しないようにするには、Thunderbirdの設定->詳細->構成エディター...->リスクを受け入れます!
そして、extensions.enigmail.keyRefreshOn
をfalse
に設定します
キーボックスキーリング形式は、 最大キーサイズ が5 MiBであるため、位置付けされたキーのインポートを拒否することに注意してください。古いインストールを使用しているユーザーは、キーリングをキーボックス形式に移行することを検討する必要があります。
これは、Debianベースのシステムで migrate-pubring-from-classic-gpg コマンドを使用して簡単に実行できます。
しかし、新しいコピーをダウンロードせずにローカルで公開鍵をクリーンアップするにはどうすればよいですか(改ざんのための不要なベクトルが導入されます)?
テストされていない方法:
gpg --edit-key <keyid> clean save
を実行します。別の方法:
--export-options export-clean
を使用してキー(またはすべてのキー)をファイルにエクスポートします(これにより、キーリング内の信頼できるキーに対して検証できないすべての署名がスキップされます)。さらに別の方法:
--keyserver-options self-sigs-only
を使用します)。