web-dev-qa-db-ja.com

ポイズンされたキーをインポートした後(単に削除せずに)GnuPGを修正する方法

私の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 のほとんどは、解決策は単にキーを削除することであると言っていますが、新しいコピーをダウンロードせずにローカルで公開キーをクリーンアップするにはどうすればよいですか(改ざんのための不要なベクトルを導入します)?

4

私はこれを修正する方法を調べるのに少し時間を費やしました、そして 私はそれについての記事を私のウェブサイトに公開しました 。以下は、この質問に対する解決策の要約です。

1.毒された鍵を特定する

まず、次のコマンドを使用して、キーリングの公開鍵のサイズ(バイト単位)を一覧表示できます(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であることがわかります。これが私たちの毒の鍵です。

この記事に続くコマンドは、このkeyidF20691179038E5C6)を使用してキーリングを操作します。以下のコマンドのこの文字列を、マシンの上記のコマンドにある対応するkeyidに置き換える必要があります。

2.ポイズンキーのエクスポート

ポイズニングされたキーを特定したので、削除する前に安全に保管するためにエクスポートしましょう。

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であることに注意してください!

3.ポイズニングされたキーを削除する

ポイズニングされたキーの安全なバックアップがディスクにあるので、キーリングから削除しましょう。

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:~$ 

4.クリーニングされたキーの再インポート

公開鍵のクリーンコピーを再インポートするには、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:~$ 

上記の出力は、

  1. 2019-06-17に14,400の署名がキーに作成され、
  2. 2019-06-18にキーに40,200の署名が行われました

次のように、この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:~$ 

5.GnuPG構成を更新する

Robert J. Hansen(2019-06-19にpgpキーが149,100の署名でスパムされた)がこの問題について優れた包括的な 要点 で指摘したように、次の方法でgpgクライアントが壊れないようにすることができます。

  1. `gpg.conf`ファイルの` keyserver`で始まる行を削除し、
  2. `dirmngr.conf`を更新して、` keyserver` = `keyserver hkps:// keys.openpgp.org`が1つだけになるようにします。

そのkeys.openpgp.orgキーサーバーは、これらの攻撃に対してより耐性のある新しい実験的なサーバーです(興味深いことに、これらの汚染された証明書がアップロードされるわずか数週間前に稼働しました)。完全に提供される証明書 サードパーティの署名がない であり、ユーザーが 明示的にオプトイン でない限り、キーからUIDパケットを削除することにも注意してください。

6.MUA構成を更新します

MUAを更新する必要がある場合もあります。たとえば、Thunderbirdのenigmailは、キーリングのキーを更新するように構成されている場合もあります。

Enigmailがキーサーバーからキーを更新しないようにするには、Thunderbirdの設定->詳細->構成エディター...->リスクを受け入れます!

そして、extensions.enigmail.keyRefreshOnfalseに設定します

補遺

キーボックスキーリング形式は、 最大キーサイズ が5 MiBであるため、位置付けされたキーのインポートを拒否することに注意してください。古いインストールを使用しているユーザーは、キーリングをキーボックス形式に移行することを検討する必要があります。

これは、Debianベースのシステムで migrate-pubring-from-classic-gpg コマンドを使用して簡単に実行できます。

3

しかし、新しいコピーをダウンロードせずにローカルで公開鍵をクリーンアップするにはどうすればよいですか(改ざんのための不要なベクトルが導入されます)?

テストされていない方法:

  1. gpg --edit-key <keyid> clean saveを実行します。

別の方法:

  1. --export-options export-cleanを使用してキー(またはすべてのキー)をファイルにエクスポートします(これにより、キーリング内の信頼できるキーに対して検証できないすべての署名がスキップされます)。
  2. キーを削除します。
  3. 以前に作成したファイルからキーをインポートします。

さらに別の方法:

  1. キーのフィンガープリント(16桁の「キーID」だけでなく、フルレングスのフィンガープリント)を書き留めます。
  2. キーを削除します。
  3. フィンガープリントに基づいて新しいコピーをダウンロードします(今回は、キーサーバーを使用する場合は--keyserver-options self-sigs-onlyを使用します)。
2
user1686