如何在我和朋友之间验证 Keybase 的端到端加密?

信息安全 密钥交换 端到端加密 区块链 密钥库
2021-08-22 10:02:45

端到端加密(E2EE)的前提是客户端安全可信,你的终端设备安全可信,但网络和服务器不需要可信。您已经阅读了客户端中的所有代码,或者您信任的人已经为您完成了这些代码。但是在将代码加载到您的手机(安装 Keybase 应用程序)并开始与您的朋友聊天之后,您仍然需要验证服务器是否向您发送了正确的加密密钥。由于您无法托管自己的服务器,因此必须由 Keybase, Inc 的服务器向您发送您朋友的加密密钥。

(客户端)代码是开放的,服务器向您发送加密密钥,您可以在带外检查加密密钥,这是 E2EE 软件的标准。在 Signal 中检查安全号码,在 Wire 中检查设备指纹,在 Telegram 中检查加密密钥。如果它们匹配,您就知道(基于开放的客户端代码和它使用的密码术)中间没有(wo)人。

这如何与 Keybase 一起使用?他们的文档解释了其中的一部分:

Alice 和 Bob 共享一个对称加密密钥,他们通过服务器将其加密为每个设备的公共加密密钥。

好的,所以我们要么验证对称密钥(在两部手机上相同),要么验证公钥(我应该能够在我的手机上显示我的,我的朋友会打电话给他们的手机认为我的公钥是什么,并且应该匹配)。

奇怪的是,没有按钮可以执行这两项操作。该文档没有提及任何内容,我环顾四周时找不到它。

此外,它解释了将公钥放入您的签名链中:

所有 Keybase 设备在首次配置时都会发布一个crypto_box公钥和一个crypto_sign公钥。这些密钥存在于用户的签名链中 [...] 聊天对称加密密钥是 32 个随机字节。它由聊天中的每个人共享,[...] 当一个新设备需要这个共享密钥时,另一个拥有它的设备将使用新设备的公钥对其进行加密crypto_box,然后将其上传到 Keybase 服务器。

所以如果我没看错的话,当我的朋友和我开始新的聊天时,他们的客户端会生成共享密钥,它会从crypto_box我的签名链中获取公钥,并使用该公钥加密共享密钥,然后上传将结果发送到 Keybase 的服务器,以便我可以下载和解密它,从而建立共享密钥并开始聊天。

...但是那个签名链是从哪里来的?这必须从 Keybase 服务器获取,所以由于无法显示它,我必须相信服务器会向我发送正确的密钥。当他们声称“所有消息都是安全的、端到端加密的”时,这有什么意义?客户端偶尔也会在聊天上方短暂地显示一条横幅,上面写着“端到端加密”。

有关于如何逐步进行验证的文档,但除了说明被破坏(没有sigs字段root_desc,结果root.json?hash=X)之外,这不是我可以在手机上做的事情。恶意服务器可以向我的命令行客户端返回正确的答案,同时告诉移动应用签名链包含一个完全不同的密钥(即恶意行为者用来执行中间人的密钥)。

当与其他人谈论它时,他们提到这个区块链的东西是它安全的原因,不需要自己验证任何东西,但我不知道它是如何工作的。

  1. Keybase 聊天是否需要手动验证任何类型的密钥以进行端到端加密,或者区块链数据(应用程序可以在后台静默验证)以某种方式阻止我们必须比较指纹/密钥/sigchains?
  2. 如果我们确实需要比较指纹/密钥/sigchains,如何在 Keybase 应用程序中完成?

更新:一位朋友链接了这个 GitHub 问题,基本上说整个区块链的事情还没有由应用程序完成。中间是否(类似)SPV是一个好的解决方案,目前尚未实施。如果我没记错的话,那就是第一个选项。

由于该应用程序似乎也不允许实现第二个选项(比较密钥),我猜这得出的结论是 Keybase 目前没有实现 E2EE?攻击很难成功:即使是恶意服务器(非常理想的位置)也必须从一开始就进行中间人攻击,因此他们必须事先了解目标对象。但我们确实相信服务器至少在某些时候是诚实的。还是我仍然缺少某种方式来实现真正的端到端加密?

更新 2:黑客新闻中提到应用程序应自行检查第三方证明。这并不完全是端到端加密的含义,因为它仍然依赖于第三方,但是,在能够 MitM 某人的密钥(也是 TOFU 的)之前必须拥有 2 家或更多公司的服务器应该会给人一些信心.
然而,当在 Wireshark 中检查它是否真的这样做时(向 Twitter API 询问证明字符串并使用它从 Keybase 收到的公钥验证签名),我手机上的 Keybase 根本没有联系 Twitter。(然而,它确实自豪地宣称新的聊天是端到端加密的。)

对于那些想知道 Wireshark 测试是否可以控制各种事情的人:

  • 在数据包捕获之前,从未将用于开始聊天的用户名输入到测试系统(开始聊天的系统)中。
  • 这两个帐户以前从未在任何设备上进行过任何形式的联系。他们也不会互相关注。在聊天建立之前,对方连我的用户名都不知道,所以他们也无法触发任何事情。
  • 数据包捕获在用户名被输入到测试设备的搜索字段之前开始,并且仅在 Keybase 完全建立聊天并声称它是端到端加密后才结束。
  • Twitter 似乎将其所有服务托管在其自己的 IP 范围内,并且测试系统在建立聊天期间与之交谈的 IP 均不在该范围内。如果这个假设是错误的并且 Keybase 客户端使用了 之外的端点104.244.40.0/21,请发表评论。我检查了所有 IP,所有 IP 都不可能成为 Twitter 的前线(有关黑客新闻的详细信息),但我很想知道 Twitter 是否会在 Amazon Web Services 的简单存储服务或其他内容上发布推文。
  • 移动 Keybase 客户端简单地从存在于 Keybase 上的所有用户下载所有签名链并在开始数据包捕获之前检查他们的所有证明,这被认为是不可信的。这是我能想到的在数据包捕获之前如何验证第三方托管证明的唯一方法。
1个回答

Keybase 在应用程序中的聊天从未经过可验证的端到端加密。

当您第一次与某人交谈时,它会从 Keybase 服务器下载他们的加密密钥,并且您必须相信服务器会向您发送正确的密钥。它还可能向您发送假的,以便您使用恶意密钥加密您的消息。无法在应用程序中验证这一点。

在 Keybase 的案例中,公平地说,由于他们提供的检查,攻击很难实施,但它不是端到端加密,除非您想扩大定义以包括信任服务器进行密钥交换(再加上一点一厢情愿的想法,即使问题中提到的有关如何检查的说明被破坏,甚至有少数人曾经检查过 Merkle 根是否包含他们的密钥)。

如果要验证 Keybase 服务器没有执行任何类型的攻击,则必须使用命令行;在官方应用程序中是不可能的。“证明”(Twitter 证明、网站证明等)似乎不能可靠地工作(如问题中所述),但即使确实如此,Keybase 也将聊天标记为 E2EE,而无需任何第三方证明在您的帐户。如果没有给出原因,我认为我妈妈不会添加证据(甚至可能不会,这没关系,但不应该让她相信它比现在更安全)。Keybase 应用的机制通常称为 TOFU:首次使用时信任。它会一次性下载密钥,如果没有更改,则认为一切正常。

这是Keybase 去年在一篇博文中对 TOFU 的评价

它只是服务器信任 [...] (ewww!)
[...] 这些应用程序不必这种方式工作

我同意。好在他们向 NCC 集团的安全和密码学专家支付了超过 100 000 美元进行审计……在他们的报告中从未提到过这个问题?(我还通过电子邮件向其中一位审核员发送了此问题的链接,但从未收到过回执。)审核员确实发现了其他问题:

[这两个] 错误 [由 NCC 发现] 只有在我们的服务器恶意行为时才能被利用。我们可以向你保证他们不是,但你没有理由相信我们。这就是重点!

除了我们必须相信他们,因为我们不能只检查自己。

不过,也许我没有给予 Keybase 足够的信任。我引用的博客正确地指责其他应用程序只是接受和使用新的(可能是恶意的)密钥而不需要用户的输入。WhatsApp 是一个很好的例子:你能做的最好的就是打开警告,但 WhatsApp 客户端仍然会很乐意参与一个切换,攻击者会在你发送消息时立即向你发送一个新的加密密钥,让他们至少知道即使您非常小心并且仅在看到密钥未更改时才发送消息,也可以发送一个纯文本。但默认情况下,不会显示新的密钥通知,因此默认情况下它是随机加密的。我认识的许多技术人员似乎都信任它,因为它使用 Signal 协议,所以它一定很好。我希望 Keybase 应用程序可以正确执行此操作。如果它在那里,就会透露出来,所以 Keybase 可能做得很好。

但是,现在 Keybase 已被 Zoom 关闭,这个具体问题没有实际意义。我有点等待 Keybase 解决这个问题并发布一个满意的答案,等待一个独立的人重新进行我的分析并给出他们的结论,或者等待 Keybase 承认他们已经愚弄了整个安全社区。一位名叫Jared的好心陌生人对这个问题提出了悬赏,我将其发布到 Hacker News 以吸引答案,希望有一个人也尝试过密钥验证。但是现在这一切都不会发生,所以让我们从更广泛的角度来看,这个问题背后的原因。

用户应该要求遵循指示。我们应该质疑 Keybase,现在是 Zoom,以及任何提出强烈安全声明的人。他们声称它?您应该希望查看可以遵循的步骤验证它。由于您信任已发布的代码,因此这些说明不应涉及任何命令行编码工作,并且绝对不会存在诸如验证笔记本电脑上的密钥并希望服务器将相同的密钥发送到您的手机之类的空白。

举一个很好的例子,我不想这么说,Telegram 的通话功能就做到了这一点。他们在屏幕上显示四个表情符号以进行密钥验证。哎呀,这很有趣:在与我的女朋友通话时,我有时会发现我们随机进行验证,比较表情符号库的差异或取笑其中一个图标。我还没有研究过它的安全性,也许你需要五个表情符号才能获得超过 128 位的熵或其他什么,但从用户体验的角度来看,这是一个很好的例子。Matrix 对呼叫做了类似但(还没有)的事情。

Hacker News、Reddit、PrivacyTools(“ Keybase [provides] E2EE. ”)上的技术社区,甚至审计人员都忽略了这个纯粹的实际问题(我相信他们的专业知识,在如此复杂的项目中,没有审计是真正完整的作为 Keybase 或 Zoom 的)。当我提出问题时,人们充满敌意,假设我是一个菜鸟,无法阅读文档并弄清楚验证是如何工作的,而他们自己从未真正尝试过。更加好奇。当称为“端到端加密”时,密钥验证不应该很难,因为最终用户必须能够验证它。虽然我妈妈可能不得不相信有人检查过代码,但我(或像 F-Droid 这样的项目)可以独立编译二进制文件并将其提供给她。然而,能够检查她是否愿意这样做。我们知道,即使是 NSA 也很难破解好的密码学,并且要感谢 Keybase 构建好的密码学,但是攻击者可以通过交换服务器响应来解决它。