Solo固件安全分析:降级攻击漏洞与Fuzzing测试

本文详细分析了SoloKeys固件v3.0.1的安全评估结果,包括一个高危的固件降级攻击漏洞和通过AFL fuzzing发现的tinycbor库解析问题。文章涵盖了漏洞原理、修复方案以及安全测试方法论。

安全分析背景

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

Doyensec对当时版本为v3.0.1的固件进行了安全评估。在10人/天的项目期间,发现了3个漏洞:其中2个为信息类问题,1个被评级为高危漏洞,并在v3.1.0中修复。完整报告包含所有细节,本文提供项目与发现的高级摘要。

为何进行安全分析?

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

近期,我们开始基于NXP LPC55S69微控制器和Rust重写的新固件开发新Solo模型(即将发布相关博客文章)。由于主要精力将投入新固件,我们不希望当前基于STM32的固件被遗弃。尽管会继续支持并修复漏洞,但社区关注度可能降低。因此,此时进行安全分析正合适。

我们要求Doyensec不仅详细报告发现,还描述其过程,以便在新Rust固件发布时重新验证。预计将对新固件进行另一轮分析,但尚无具体计划。

主要发现:降级攻击

安全审查包括手动源代码审查和固件fuzzing。一名研究员在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 Fuzzing TinyCBOR

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

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

总结

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

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

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