Solo固件安全分析:深入解析降级攻击与模糊测试漏洞

本文详细分析了SoloKeys固件v3.0.1的安全审计结果,重点揭示了高危的固件降级攻击漏洞和TinyCBOR库的崩溃问题,涵盖漏洞原理、修复方案以及AFL模糊测试的实施细节。

安全分析概述

本博客文章总结了SoloKeys与Doyensec的合作成果,最初由Emanuele Cesena发表在SoloKeys博客上。完整的安全审计报告可在此下载

Doyensec对SoloKeys固件v3.0.1进行了安全评估,在10人/天的项目中发现并报告了3个漏洞。其中两个问题被视为信息类,一个被评级为高危,并在v3.1.0中修复。完整报告包含所有细节,而本文提供项目和高层发现的摘要。

为何进行安全分析?为何现在进行?

在Solo的Kickstarter之后,我们收到的首批请求之一是进行独立安全审计。当时我们缺乏资源,直到2019年底甚至关闭了相关工单,引发了社区的系列投诉。

最近,我们分享了基于新微控制器NXP LPC55S69和用Rust重写的新固件开发新Solo模型的计划(固件博客文章即将发布)。由于大部分精力将投入新固件,我们不希望当前的基于STM32的固件被遗弃。我们将继续支持它,修复错误和漏洞,但可能受到社区较少关注。

因此,我们认为这是进行安全分析的好时机。我们要求Doyensec不仅详细说明发现,还描述其过程,以便在新Rust固件发布时重新验证。我们计划对新固件进行另一轮分析,尽管尚无具体计划。

主要发现:降级攻击

安全审查包括手动源代码审查和固件模糊测试。一名研究员在2020年1月21日至31日的两周内执行了审查。

简而言之,他发现了降级攻击,能够通过上传多个无序固件块来“升级”到旧版本。降级攻击通常非常敏感,因为它们允许攻击者降级到旧固件版本并利用已知漏洞。

然而,实际运行此类攻击需要物理访问密钥或在恶意网站上通过WebAuthn窗口获得用户明确确认。这意味着您的密钥几乎肯定是安全的。此外,我们始终建议使用官方工具升级固件。

请注意,我们的固件经过数字签名,此降级攻击无法绕过签名验证。因此,攻击者只能安装我们约20个旧版本中的一个。

不用说,我们非常重视此漏洞并立即修复了它。

降级攻击的剖析

这是有问题的代码。而这是补丁,应有助于理解发生了什么。

Solo固件更新是一个二进制blob,其中最后4字节代表版本。当新固件安装到密钥上时,会检查这些字节以确保版本高于当前安装版本。固件数字签名也经过验证,但此攻击仅允许安装旧的签名版本,因此签名验证无关。

新固件以块形式写入密钥。每次写入时,更新最后写入地址的指针,最终指向固件末尾的新版本。您可能看出问题:我们假设块仅按顺序写入一次,但未强制执行。补丁通过要求严格按升序写入块来修复问题。

例如,假设运行v3.0.1,并取一个旧固件(如v3.0.0)。在其中搜索四个字节,当解释为版本号时,似乎高于v3.0.1。首先,将整个v3.0.0固件发送到密钥。last_written_app_address指针现在正确指向固件末尾,编码版本v3.0.0。

然后,再次将选定的四个字节写入其原始位置。现在last_written_app_address指向固件中间,这四个字节被解释为“随机”版本。结果发现固件v3.0.0包含一些可解释为v3.0.37的字节——砰!这是一个完全可用的概念验证。

使用AFL模糊测试TinyCBOR

研究员还集成了AFL(American Fuzzy Lop)并开始模糊测试我们的固件。我们的固件依赖外部库tinycbor来解析CBOR数据。在大约24小时的执行中,研究员用超过1亿个输入测试代码,并发现超过4,000个错误输入被tinycbor误解并导致固件崩溃。有趣的是,初始输入由我们的FIDO2测试框架生成。

模糊测试器将很快集成到我们的测试工具链中。如果社区中有人对模糊测试感兴趣,并希望通过修复tinycbor中的错误来贡献,我们很乐意分享细节和示例。

总结

总之,我们聘请了安全工程公司Doyensec进行固件安全审查。您可以阅读完整报告了解过程和发现的降级攻击细节。如有其他问题或想帮助模糊测试tinycbor,请通过Twitter @SoloKeysSec或hello@solokeys.com联系我们。

我们感谢Doyensec帮助保护SoloKeys平台。请务必查看他们的网站,哦,他们很快将推出一款游戏。是的,一款以黑客为主题的手机游戏!

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计