关于信号安全价值恢复的几点思考

2020-07-13 10:22:39

在过去的几个月里,Signal一直在推出一系列新功能,以使其应用程序更易于使用。其中一项功能最近在用户中引起了一些争议。这是一种基于称为安全价值恢复(SVR)的新系统的联系人列表备份功能。SVR功能允许Signal将您的联系人上传到Signal的服务器,而表面上甚至Signal本身都无法访问它。

新的信号方法在安全人员中造成了一些创伤,因为它最近在没有特别明确的解释的情况下被启用。有关该问题的简短摘要,请参阅本文。在这篇文章中,我想更深入地探究为什么这些决定让我如此担忧,以及正在采取哪些信号来试图缓解这些担忧。

对于那些不熟悉它的人来说,Signal是由Moxie MarlinkSpike的Signal Technology Foundation开发的一个开源应用程序。Signal受到了安全界的厚爱。这基本上有两个原因。首先:Signal应用程序已经成为Signal协议的一种技术演示,Signal协议是Facebook Messenger和WhatsApp等流行应用程序以及它们的数十亿用户所依赖的基本密码学基础。

其次,Signal应用程序本身在注重安全的人中很受欢迎,主要是因为该应用程序的用户基础相对较小,技术含量更高,在安全体验方面倾向于采取毫不妥协的方式。与WhatsApp等更商业化的替代方案相比,Signal历来选择了更谨慎、更安全的方法,无论在哪里,可用性问题都与安全发生冲突。作为一种获得大规模采用的战略,这是一个糟糕的战略。如果您的目标是构建一个真正安全的消息传递产品,那么它会给人留下非常深刻的印象。

像WhatsApp和苹果的iMessage这样的加密信使会定期将你的短信内容和联系人列表备份到远程云服务器上。这些备份在很大程度上破坏了端到端加密提供的强大安全性-因为它们使黑客和政府更容易获得您的明文内容。您可以禁用这些备份,但要将其做好却出人意料地不明显(至少对我来说是这样)。较大的服务通过指出其技术含量较低的用户往往更担心丢失的消息历史记录,而不是理论上的云黑客,来证明这种备份默认是合理的。

相比之下,Signal在备份方面采取了谨慎得多的方法。今年6月,他们终于增加了一种手动将消息历史记录从一部iPhone转移到另一部iPhone的方式,现在这种转移涉及扫描二维码。对于Android,如果用户愿意写下30位数的加密密钥,云备份是可能的。这对许多用户来说可能真的很烦人,但对于安全性来说绝对是非常棒的。同样,由于Signal完全依赖于您联系人数据库中的电话号码(诚然,许多用户讨厌这一点),因此它永远不需要将您的联系人列表备份到服务器。

最近的变化是,Signal已经开始吸引更多的用户。当怀有传统期望的用户进入画面时,他们已经对Signal的局限性感到不满。作为回应,Signal开发人员已经开始探索在不损害安全性的情况下提供这些功能的方法。这真的很有挑战性,我很同情开发人员。

他们试图解决问题的一个领域是他们新的联系人备份解决方案:一种名为“安全价值恢复”的系统。

Signal的Secure Value Recovery(SVR)是一个基于云的系统,允许用户将加密数据存储在Signal的服务器上-这样即使Signal也无法访问它-而不会出现传统加密密钥管理带来的可用性问题。目前,SVR被用来存储用户的联系人列表,而不是消息内容,尽管这些数据可能会出现在菜单上以备将来备份。

存储加密备份数据的挑战在于,高度加密需要强(或“高熵”)密钥和密码。由于我们中的大多数人都不善于选择,更不用说记住强密码了,这就带来了一个具有挑战性的问题。此外,这些密钥不能只存储在您的设备上-因为备份的全部目的是处理丢失的设备。

SVR的目标是允许用户使用人类实际上可以记住的更弱的密码来保护他们的数据,例如4位PIN。使用传统的基于密码的加密,这样的密码将是完全不安全的:从信号服务器获得加密数据的有动机的攻击者可以简单地运行字典攻击-在几秒钟或几分钟内尝试所有10,000个这样的密码,从而获得您的数据。

Signal的SVR以一种由来已久的方式解决了这个问题:它引入了一台即使Signal也无法破解的计算机。更具体地说,Signal利用了英特尔处理器的一个新扩展,称为软件保护扩展,或SGX。SGX允许用户编写在特殊虚拟化处理器模式下运行的称为“Enclaves”的程序。在此模式下,飞地对于计算机上的所有其他软件(包括操作系统)是不可见和不可触及的。如果需要存储,Enclaves可以永久存储(或“密封”)数据,这样任何篡改程序的尝试都将使数据无法访问。(更新:需要注意的是,SVR并不持久地存储数据。)。

Signal的SVR在信号服务器上部署了这样一个Enclave程序。这个程序执行一个简单的功能:对于每个用户,它生成并存储一个随机的256位密码秘密“种子”以及用户PIN的散列。当用户联系服务器时,它可以向飞地提供其PIN,并请求将PIN与服务器上的密码值混合在一起。Enclave检查PIN是否与散列匹配,如果匹配,则将种子和PIN纠缠在一起。结果是可用于加密或解密备份数据的加密强加密密钥。

此方法的关键在于,加密密钥现在既取决于用户的密码,也取决于由SGX飞地存储在服务器上的强加密秘密。如果SGX完成了它的工作,那么即使是侵入信号服务器的用户-这里我们包括信号开发商本身,可能是在胁迫下操作-也将无法检索到该用户的密码值。访问备份加密密钥的唯一方法是实际运行Enclave程序并输入用户的PIN(或其派生的PIN)。为了防止暴力猜测,Enclave会跟踪不正确输入PIN的次数,并且在完全锁定该用户的帐户之前只允许有限的次数。

这是一种优雅的方法,在概念上与苹果和谷歌已经部署的系统非常相似,这两家公司使用专用的硬件安全模块(Hardware Security Modules)来实现可信组件,而不是SGX。

SVR方法的主要缺点是它强烈依赖于SGX执行的安全性和完整性。正如我们稍后将讨论的那样,新交所的记录并不是一尘不染的。

任何时候,当您遇到从根本上依赖于某个组件(特别是存在于商用硬件中的组件)可信性的系统时,您的第一个问题应该是:“如果该组件实际上不值得信任会发生什么?”

让我们退后一步。回想一下,SVR的目标是确保三件事:

备份加密密钥至少部分基于用户选择的密码。强密码意味着强加密密钥。

即使使用弱密码,加密密钥仍将具有密码强度。这来自于SGX选择和存储的随机种子的集成。

任何攻击者都不能暴力破解密码空间。这是由新交所通过猜测限制强制执行的。

请注意,只有第一个目标真正由密码术本身强制实现。并且只有在用户选择强(高熵)密码的情况下才能实现该目标。有关其外观的示例,请参见右侧的图片。

剩下的目标完全取决于新交所的诚信。因此,让我们扮演魔鬼的代言人,想想如果SGX不安全,SVR会发生什么。

如果攻击者能够转储正在运行的信号SGX Enclave的内存空间,他们将能够暴露秘密种子值和用户密码散列。有了这些值,攻击者就可以运行基本的脱机字典攻击来恢复用户的备份密钥和密码。完成此攻击的难度完全取决于用户密码的强度。如果是BIP39短语,那就没问题了。如果它是一个4位数的PIN,就像Signal应用程序的UI强烈建议的那样,你就不会是这样的了。

(如果您的PIN恰好与您的手机密码相同,则此数据的敏感度将变得更差。确保它不是!)。

同样,如果攻击者能够破坏SGX执行的完整性:例如,使用陈旧的“状态”而不是新数据导致Enclave运行,则他们可能能够突破错误密码(“重试”)尝试的次数限制。这将允许攻击者在飞地上运行主动猜测攻击,直到他们恢复您的PIN。(编辑:这与SVR无关,因为数据只存储在RAM中,从不写入磁盘。)。

最后,也是更微妙的问题是,Signal的SVR还允许“复制”备份数据库。这解决了Signal方面真正关心的问题,即备份服务器可能会出现故障-导致所有用户备份数据丢失。这将是一场UX噩梦,可以理解的是,Signal不希望用户接触到它。

为了解决这个问题,Signal的操作员可以在云提供商上启动Signal服务器的新实例。新实例将拥有SGX Enclave软件的第二个副本,此软件可以从原始Enclave请求完整种子数据库的副本。(甚至还有一个复杂的共识协议,以确保在复制此副本后,两个副本在重试计数器的状态方面保持一致。)。

需要记住的重要一点是,此复制过程的安全性完全取决于这样一种想法,即原始Enclave只会将其数据移交给在支持SGX的安全处理器上运行的同一Enclave软件的另一个实例。如果有可能在新飞地的状态上欺骗原始飞地-例如,说服它将数据库移交给仅在正常执行模式下模拟SGX飞地的系统-那么受攻击的信号操作员将能够使用此机制渗出数据库的明文副本。这将彻底破坏这个系统。

对此攻击的预防是通过Intel SGX的另一项称为“远程证明”的功能来实现的。本质上,每个英特尔处理器都包含一个唯一的数字签名密钥,该密钥允许它证明它是合法的英特尔处理器,并且它正在运行特定的Enclave软件。这些签名可以在英特尔的帮助下进行验证,英特尔允许飞地验证他们是否直接与另一块合法飞地对话。

该系统的强大也包含其脆弱性:如果从支持SGX的单个处理器中提取单个SGX证明密钥,这将为任何能够危害信号开发人员的实体提供后门。

考虑到这些担忧,值得问的是,新交所将达到使该系统正常工作所需的高安全门槛,这有多现实。

老实说,不太好。维基百科上给出了新加坡交易所妥协的清单,但这并不能说明全部情况。

针对SGX的各种攻击多种多样,但很大程度上都有一个共同的原因:SGX的设计目的是在复杂的通用处理器上提供程序的虚拟化执行,并表示处理器有许多奇怪和未被探索的行为。如果攻击者可以让处理器行为不正常,这反过来又会破坏SGX的安全性。

这导致了诸如“掠夺式电压”之类的攻击,恶意软件能够实时篡改处理器的电压电平,从而导致泄漏关键数据的故障。它包括利用飞地加载方式中的故障的攻击,这可能允许攻击者在适当的飞地的位置注入恶意代码。

针对SGX的最可怕的攻击依赖于“投机性执行”侧通道,这可让攻击者从SGX提取机密-最高可达并基本上包括飞地使用的所有工作内存。这可以允许提取Signal的SVR使用的种子密钥或密封密钥(用于加密磁盘上的数据)等值。更糟糕的是,这些攻击不是一次而是两次成功地提取了用于执行密码证明的密码签名密钥。最近的一个是几周前打的补丁。这些都是非常活生生的攻击,你可以打赌会有更多的攻击即将到来。

最后一部分对SVR不利,因为如果攻击者甚至可以提取一个处理器的证明签名密钥的单个副本,并且可以泄露信号管理员的机密,他们可能会强制Signal将他们的数据库复制到模拟的SGX飞地上,而该飞地实际上并不在SGX内部运行。一旦SVR将其数据库复制到系统中,每个人的秘密种子数据都将以明文形式可用。

但真正让我害怕的是,我在上面列出的这些攻击只是对该系统进行学术探索的结果。在过去两年中的任何时候,我都能与密歇根大学的丹尼尔·根金(Daniel Genkin)或特拉华州大学格拉茨分校(TU Graz)的丹尼尔·格拉斯(Daniel Gruss)这样的人喝过啤酒,我知道这两位教授(或他们的团队)至少在新交所存在一个灾难性的未打补丁的漏洞。他们都是非常聪明的人。但他们并不是世界上唯一的聪明人。而且有一些聪明人拥有更多的资源,他们非常想要访问备份的信号数据。

值得一提的是,上面的大多数攻击都是纯软件攻击-也就是说,它们假定攻击者只能获得对服务器的逻辑访问权限。这些攻击之所以受到如此限制,是因为SGX实际上并不是为了防御复杂的物理攻击者而设计的,这些攻击者可能会试图窃听系统总线,或者直接试图解包并将探测器附加到处理器本身。虽然这些攻击代价高昂且具有挑战性,但肯定有一些机构会毫不费力地执行它们。

最后,我还应该提到,SVR方法的安全性假设英特尔是诚实的。坦率地说,这可能是我们已经在做的一个假设。那我们就赌一把吧。

我对SVR的主要问题是它基本上是我不想要的,也是不信任的。我很高兴Signal将它作为一个选项提供给用户,只要允许用户选择不使用它。不幸的是,直到本周,Signal还没有给用户提供这样的选择。

更具体地说:几周前,Signal开始喋喋不休地要求用户创建PIN码。应用程序本身并没有很好地解释设置此PIN会启动SVR备份。我采访过的许多人说,他们认为PIN是为了保护本地存储,或者是为了保护他们的账户不被劫持。

信号不只是要这个密码。它遵循了硅谷诞生的一个常见的“黑暗模式”,即基本上迫使用户添加PIN,首先通过反复唠叨他们,然后最终通过一个巨大的模式对话框阻止访问整个应用程序。

就其优点而言,这是一种不好的行为,更严重的是:它可能不会产生好的PIN选择。为了让它消失,我选择了应用程序允许的最简单的PIN,也就是9512。我想很多其他用户只是简单地输入了他们的手机密码,这本身就是一个令人讨厌的安全风险。

有些人会说这没什么大不了的,因为SVR目前只保护用户的联系人列表-而这些联系人列表已经以明文形式存储在竞争对手的消息传递系统上。事实上,这是莫克西提出的论点之一。

但我不相信这个。没有人会仅仅为了存储联系人列表而设计像Signal的SVR这样复杂的东西。一旦你有了像SVR这样的锤子,你就会想用它来敲掉其他的钉子。您将发现用户厌倦了丢失的其他关键数据,并且您将应用SVR来备份该数据。由于消息内容备份是Signal用户体验中最大的痛点之一,您迟早也会想要应用SVR来解决这个问题。

在过去,我的观点是这很好-因为Signal肯定会给用户提供选择加入或退出邮件备份的能力。最近信号的决定动摇了我的信心。

这已经是一篇很长的帖子了,但我认为分享Signal的观点才是公平的。

我已经和Moxie谈过我对SVR的担忧,他有两个坚实的观点要表达。此外,对于不放心的用户来说,还有一个有点复杂的解决办法,目前正在推出。

正如上面提到的,Moxie的第一点是,SVR目前只用于存储联系人列表,这是必要的,因为Signal现在不再只使用电话号码来识别联系人-因此它不再依赖于您手机的联系人数据库。他指出,许多竞争对手的应用程序只是在他们的服务器上以明文备份联系人列表,而SVR要比这好得多。这几乎肯定是真的。

Moxie还建议,用户可以通过设置一个强大的、高熵的密码,然后(如果他们讨厌备份)忘记它,从而绕过SVR的任何可察觉到的弱点。他特别建议我应该生成一个BIP39密码短语,在我看来,这对于非技术用户来说并不容易。他还向我承诺,只要我没有打开Signal的“注册锁定”功能,扔掉这个代码不会给我带来任何不良影响,除了无法恢复我的联系人列表。我很高兴听到这件事,因为这对我来说一点也不明显。

我问莫西,为什么Signal可以为我做这项工作,他说他们可以。事实上,截至本周,Signal在其最新的测试版中增加了“禁用PIN”功能。加密的数据仍然会传输到信号服务器,但现在加密的方式是没有人能访问的。Moxie还承诺,Signal在没有给用户选择的情况下,永远不会启用消息数据备份。我希望让他信守诺言。

最后,我们对SVR数据库中的复制漏洞进行了长时间的技术讨论。冒着错误陈述他的观点的风险:莫西的观点是,这种复制是运行功能服务所必需的,保留持久备份数据的需要超过了潜在的安全问题。我建议用户只需在服务器发生故障时重新上传数据,这样做的好处是通知用户潜在的复制事件正在发生。莫西认为,让用户参与这个决定是糟糕的用户体验,也是一种反功能。

在我看来,这将填补这个系统中的一个非常大的漏洞。我希望信号能考虑一下。