AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / computer / 问题 / 1459617
Accepted
Michael Altfield
Michael Altfield
Asked: 2019-07-15 02:33:05 +0800 CST2019-07-15 02:33:05 +0800 CST 2019-07-15 02:33:05 +0800 CST

导入中毒密钥后如何修复 GnuPG(不只是删除它)

  • 772

我的 GnuPG 客户端自动从密钥服务器刷新其密钥环中的密钥,并导入了一个中毒密钥。如何在不删除中毒公钥的情况下修复我的密钥环?

上个月,许多备受瞩目的 pgp 证书受到证书泛洪攻击 ( CVE-2019-13050 )的攻击,他们用数万(或数十万)个签名向他们的公钥发送垃圾邮件,并将他们的中毒公钥上传到密钥服务器。

例如,如果您的密钥环中有“ Tor Browser Developers(签名密钥) ”,并且您--refresh-keys在 2019 年 6 月 30 日之后尝试从密钥服务器获取(当时他们的密钥被 121,000 个虚假签名淹没),那么您的 gpg(和因此,如果您正在使用 thunderbird 和 enigmail,您的电子邮件将挂起并变得无法使用。

这个问题的大部分报道都说解决方案只是删除密钥——但是我如何才能在本地清理公钥而不必下载新副本(这会引入不必要的篡改向量)?

thunderbird security
  • 2 2 个回答
  • 1611 Views

2 个回答

  • Voted
  1. Best Answer
    Michael Altfield
    2019-07-15T10:43:48+08:002019-07-15T10:43:48+08:00

    我花了一些时间研究如何解决这个问题,并在我的网站上发表了一篇关于它的文章。下面是对这个问题的解决方案的总结。

    1.识别中毒密钥

    首先,我们可以使用以下命令列出密钥环中公钥的大小(以字节为单位)(如GnuPG 问题跟踪器中所报告):

    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大小为16934647bytes = 16M。这是我们的毒钥匙。

    本文后面的命令使用此keyid ( F20691179038E5C6) 来操作密钥环。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 装甲文件是 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.重新导入清理过的key

    要重新导入公钥的干净副本,我们将使用gpg参数删除在证书被签名淹没之日创建的所有--import-filters签名( )。drop-sig

    给定一个公钥文件(就像我们刚刚导出的备份),我们可以使用以下命令列出证书每天收到的签名数量:

    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 个签名

    我们可以导入密钥,同时忽略这两天的这些垃圾邮件签名,如下所示(请务必将日期替换为您机器上上述命令打印的相应日期):

    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(他的 pgp 密钥在 2019 年 6 月 19 日被发送了 149,100 个签名的垃圾邮件)在他们关于这个问题的优秀综合要点中指出的那样,您可以通过以下方式防止您的 gpg 客户端崩溃:

    1. 删除 `gpg.conf` 文件中以 `keyserver` 开头的任何行
    2. 更新 `dirmngr.conf` 使其只有 1 个 `keyserver` = `keyserver hkps://keys.openpgp.org`

    该keys.openpgp.org密钥服务器是一个新的实验服务器(有趣的是,它在这些中毒证书上传前几周就上线了),它更能抵抗这些攻击。请注意,它提供的证书完全没有第三方签名,并且它还会从密钥中剥离 UID 数据包,除非用户明确选择加入。

    6. 更新你的 MUA 配置

    您可能还需要更新您的 MUA。例如,thunderbird 中的 enigmail 也可以配置为更新密钥环中的密钥。

    要防止 enigmail 从密钥服务器刷新您的密钥,请转到您的 thunderbird 首选项 -> 高级 -> 配置编辑器... -> 我接受风险!

    并设置extensions.enigmail.keyRefreshOn为false

    附录

    请注意,keybox keyring 格式将拒绝导入定位密钥,因为它的最大密钥大小为 5 MiB,并且使用旧安装的用户应考虑将其 keyring 迁移到 keybox 格式。

    这可以在基于 debian 的系统中使用migrate-pubring-from-classic-gpg命令轻松完成

    • 4
  2. user1686
    2019-07-15T05:31:47+08:002019-07-15T05:31:47+08:00

    但是我怎样才能在本地清理公钥而不必下载新副本(这会引入不必要的篡改向量)?

    未经测试的方法:

    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

相关问题

  • Thunderbird 使用过滤器的反网络钓鱼方法?

  • 删除子块

  • 使用 Thunderbird 过滤器以最佳方式将电子邮件分类到子文件夹中

  • 校验和失败——Fedora 29 或旋转 KDE Plasma

  • 为什么 Thunderbird 不会完全删除电子邮件?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    Windows 照片查看器因为内存不足而无法运行?

    • 5 个回答
  • Marko Smith

    支持结束后如何激活 WindowsXP?

    • 6 个回答
  • Marko Smith

    远程桌面间歇性冻结

    • 7 个回答
  • Marko Smith

    Windows 10 服务称为 AarSvc_70f961。它是什么,我该如何禁用它?

    • 2 个回答
  • Marko Smith

    子网掩码 /32 是什么意思?

    • 6 个回答
  • Marko Smith

    鼠标指针在 Windows 中按下的箭头键上移动?

    • 1 个回答
  • Marko Smith

    VirtualBox 无法以 VERR_NEM_VM_CREATE_FAILED 启动

    • 8 个回答
  • Marko Smith

    应用程序不会出现在 MacBook 的摄像头和麦克风隐私设置中

    • 5 个回答
  • Marko Smith

    ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] 证书验证失败:无法获取本地颁发者证书 (_ssl.c:1056)

    • 4 个回答
  • Marko Smith

    我如何知道 Windows 安装在哪个驱动器上?

    • 6 个回答
  • Martin Hope
    Albin 支持结束后如何激活 WindowsXP? 2019-11-18 03:50:17 +0800 CST
  • Martin Hope
    fixer1234 “HTTPS Everywhere”仍然相关吗? 2019-10-27 18:06:25 +0800 CST
  • Martin Hope
    Kagaratsch Windows 10 删除大量小文件的速度非常慢。有什么办法可以加快速度吗? 2019-09-23 06:05:43 +0800 CST
  • Martin Hope
    andre_ss6 远程桌面间歇性冻结 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney 为什么在 URL 后面加一个点会删除登录信息? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension 鼠标指针在 Windows 中按下的箭头键上移动? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    Inter Sys Ctrl+C 和 Ctrl+V 是如何工作的? 2019-05-15 02:51:21 +0800 CST
  • Martin Hope
    jonsca 我所有的 Firefox 附加组件突然被禁用了,我该如何重新启用它们? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK 是否可以使用文本创建二维码? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 更改 git init 默认分支名称 2019-04-01 06:16:56 +0800 CST

热门标签

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve