固件更新是我们软件生命周期中必须面临的问题。软件生命周期中有多种原因让我们需要固件更新,而固件更新也会带来安全问题,如使用固件更新来攻击电子钱包。
STM32 已经提供了很多的安全技术来应对固件更新的安全挑战。在这里和大家一起探讨,如何利用 STM32 安全技术,软件以及硬件安全技术,进行安全的升级固件。
讲座内容既包括了固件更新的一般原理,以及安全固件更新的额外设计。
安全固件更新离不开安全启动。STM32 安全启动为 STM32 安全固件更新提供了安全的运行环境。
什么是安全固件更新?
固件更新是指部分或者完全替换设备上的软件的操作,包括添加新应用,修改已有功能,或者去修复软件里的问题。安全固件更新,则是以安全的方式去实施固件更新。安全,也就是是防止固件在更新实施过程中被修改,被假冒以及被窃取的威胁。安全的三要素是保密,完整,可用,需要在安全固件更新的准备以及实施过程得到保证。完整可靠属于我们谈到的安全属性里的完整属性。
- 保密
- 完整
- 可靠
新功能带来新弱点,为什么需要固件更新
“离开软件,芯片就是一堆沙子”( Silicon Without Software is Just Sand)。芯片确实是从沙子中来。芯片需要晶圆,晶圆就是纯化的硅,需要从沙子中提炼。但是芯片有了软件,就可以执行各种各样的输入输出与计算,如同黄金般的珍贵。这句话还可以加一句,“离开固件更新,芯片就在回归沙子的路上"。因为,如果没有固件更新,软件不再适合应用场景,或者停止工作,那么这个芯片也可以说重新变成了沙子。
固件更新很重要,可以从以下几个方面理解:
① 固件更新可以解决系统的功能缺陷或者安全漏洞。
软件总是人开发的,人总是不完美的。人类要想在软件中一个Bug 都没有,那几乎是不可能的事情。所以固件更新的一个最重要的用途,就是给开发人员一个修改的机会,在这个产品生命周期内修复系统缺陷。这些缺陷也可以包括安全弱点。
② 固件更新可以给系统提供新功能新价值。
我们的安卓手机,在硬件不变的情况下,新的功能可以通过安装新的App 获得。同样,对于MCU 来说,固件更新可以提供先前所没有的价值。
③ 固件更新可以帮助产品加快进入市场的进度。
完全可以先实现一个最小的完备系统,支持基础性功能,同时带有固件更新的能力。那么 ,产品就可以进入工厂进行制造,不需要等待所有功能完成。这样可以加快进入市场的进度。
④ 固件更新可以降低设备的维护成本
有了固件更新,可以要求所有的设备都运行在某一个版本或者该版本之上。那么,支持的版本个数就减少了 ,从而支持多个版本的成本就可以显著降低。
为什么需要安全固件更新?
固件更新作为一个系统的修改入口,是可以被恶意的攻击者利用。同时,对安全来说,新功能总会带来新弱点,固件更新的自身的功能设计也可能带来新的安全弱点。黑客可以有多中手段对固件更新进行攻击 。
① 攻击固件本身
黑客可以在更新的起点替换固件。如果固件来源不可靠,则固件轻则不能运行,重则运行起来破坏这个设备。同样如果这个固件是不完整的 ,被破坏了,则固件更新了,还能不能运行就是个问号 。如 果固件一部分被注入了恶意软件,则固件更新之后系统就有了后门 ,也就相当于家里进了小偷或者强盗。
② 攻击固件传输的过程
如果在固件传输过程中,没有做到保密,则固件可以被所有人获得。同样,固件在传输过程中也可能被人为修改。
③ 攻击固件烧写的过程
即使我们在固件传输过程采取了固件加密措施,如果设备在烧写固件时,不采取相应的安全防护 ,那么固件的内容还是通过固件更新的过程泄密了。
④ 攻击固件的存储位置
固件的 存储位置对固件更新的安全也有影响 。当然 ,即使没有固件更新,用户固件存储的位置也会对系统安全的作用也不可忽视。
a. 存储在MCU 内部
用户固件可以存储在MCU 内部。存储在MCU 内部,可以很方便的使用MCU 自带的硬件安全技术来保护固件。例如,使用STM32 的RDP 级别2 来防止外部攻击,保护固件的保密,以及固件的完整可靠性。
b. 使用外扩Flash
外扩Flash 会带来极高的风险。攻击者可以将Flash 吹掉,放在读写器上读出Flash 里的内容。同时,外扩Flash 的引脚,会暴露在攻击者的枪口之下,即使固件得到验证后,也不应该直接从外扩Flash 直接执行。攻击者完全可以欺骗安全启动,在执行的一刹那,将外扩Flash 换成不安全的内容(hot-swapping)。
- 攻击固件的版本
就像我们提到的,新的版本可以解决系统的bug。这些bug 可以包含系统可能被攻击者利用的安全弱点。理论上新的版本总是比旧的版本要安全。而攻击者则反其道而行之,他们可以利用旧的版本来替换新的版本,从而降低系统的安全性。
a. 旧的版本
攻击者可以故意利用旧版本来替换新版本。旧版本带有明显的安全漏洞,则攻击者会利用该漏洞作为入口对系统进行攻击。
b. 介于新旧之间的版本
对于离线设备,攻击者可以利用一个有弱点的中间版本,来攻击设备。该中间版本,比设备上的版本新;但是又不是厂 家的最新版本。在这种情况下,设备是很难分辨是否应该要升级。