作者:GorgonMeducer 傻孩子
首发:裸机思维
(图片来自 Wikipedia 词条 Caerlaverock Castle : https://en.wikipedia.org/wiki...\_Castle)
在前面的文章中,我们介绍了中文中同为"安全"的两个概念 Security 和 Safety 在嵌入式系统中的区别——Safety 通常可以理解为“功能安全”而 Security 则可以理解为“信息安全”——为了和大家耳熟能详的“网络信息安全”加以区别,在后面的讨论中除非做了特殊说明,“信息安全”就特指“嵌入式信息安全”。
那么,嵌入式信息安全的本质是什么呢?
嵌入式信息安全(Security)的本质是隔离(Isolation)
值得强调的是,这里的隔离并不区分软件(Software Security)、硬件(Hardware Security)和团队相关的各类流程(Team / Design Flow Security)。换句话说,用“隔离(Isolation)”的方式去实现“信息安全(Security)”,在嵌入式系统中无论放到任何语境都是成立的——或者说是放之四海而皆准的公理。
提到隔离,我们立即就面临以下几个问题:
- 把谁从谁那里隔离开来?(防谁)
- 要隔离的东西是什么?(保护什么)
- 用什么办法进行隔离?(怎么隔离)
别小看这三个问题,他们可是信息安全系统设计的关键。正确回答了这三个问题,是防止博士卖驴下笔千言离题万里的最有效方法。
“等下,等下……”,有人坐不住了:“隔离什么的我不管,信息安全不应该是加密解密,握手鉴权这一类的东西么?”“对啊,对啊,什么DES,3DES,什么AES128已经不安全应该用AES256之类的话题么?”又有人附和道:“MD5啊,RSA啊之类的算法和 Isolation 有什么关系呢?难道是把所有内容都加密了来实现隔离么?”
所以说,你们有些同志,图样图森破,就知道些个加密解密的算法,以为所谓的信息安全就是加个密,保护个密钥,让人看不懂就行了。这都是非常片面的。打个比方,加解密算法、密钥管理、鉴权之类的东西相对信息安全就是砖头和房子的关系——造房子要有需求(房屋的用途是什么,给谁住,有什么需求,预算是多少?设计寿命是多少?房屋所在地又怎样的自然和地质灾害?需要抗击到什么成都?)、目标规划(多少预算,多久造出来,找谁来造,如何施工?如何验收?验收标准是什么)、还要有理论指导——最终通过工程实践,使用各类建筑材料造出符合要求的房子来。你看看,要不是你们打岔,浪费这么多口舌,结果什么有用的东西都没有说。要完整的搞清楚这里面的关系,我会在随后的文章中详细介绍,这里我们先从更本质的东西开始理解信息安全。
- 防谁和保护什么
这两个问题通常是一起考虑的,具体讲究太多,三言两语讲不完,我就讲个大家身边的故事:
小李是个硬件工程师,自学软件开发小有所成,经常接一些私活赚点烧烤钱。这次,他从相熟的私人小老板那里接了一个开发的活,具体什么硬件,什么功能并不重要,但值得说明的是,小李很自豪里面的一个软件算法,这个算法可以极大的提高产品的参数,用较小的硬件成本实现那些“昂贵高级”货才能做到的参数。为了保护这个算法,小李又额外花了大量心思对产品进行了加密,什么“对固件升级的通信尽心加密啦”,“用状态机混淆算法逻辑啦”,什么“固件完整性检测啦”,“多重密钥保护啦”……总之,网上能找到的算法他都用了,虽然花了不少时间,私人小老板一分钱也不多给,但是他还是很满意的。然而……产品推出不到两周,市场上就出现了一模一样的克隆产品。对方通过暴力开盖的方法复制出来固件,然后用同样的固件进行了批量的生产。小老板很不满,找到了小李,责问他是不是嫌钱给的不够,又把设计卖给了别人。小李很委屈,他一再强调,自己已经对产品做了加密,别人绝对没法获得自己的算法——听到这里,小老板冷冷一笑,“没人感兴趣你的算法,人家感兴趣的只是如何克隆整个产品,然后量产就行了!——你浪费那么多时间精力,却没有对关键的UID做绑定,真不知道怎么说你才好。”
真是老话说得好:长得再屌,一砖撂倒。加密再好,克隆拉倒。
这个故事告诉我们,很多时候,如果你实现的隔离手段本质上只是关起门来防贼,但如果别人连你房子一起挖走了……所以,针对不同的攻击手段,要设计不同的隔离方式,不能只想到空间上的隔离,时间上的隔离也不能放过。
- 怎么隔离
有位电影里的长者说过,你看那世间纷争,不过“名、利”二字,看透了……看透了就会明白,两手抓两手都要硬才是真正的人生赢家。有位象牙塔里的长者说过,你看那时间纷繁,不过“时、空”二字,看透了——就会明白,做信息安全,时间隔离(Temporal Isolation)和空间隔离(Spatial Isolation)两手抓两手都要硬!
空间隔离
空间隔离好理解,比如一个32bit的4G地址空间,你通过硬件把它分成一小段一小段的(大小任意),然后每一段都可以拥有不同的访问权限(No-Access / Read-Only / Full Access)。这就是空间隔离。但时间隔离怎么理解呢?难道是一对穿越时空的恋人,都到达过同一个空间,却一直错过?你真这么理解,其实也不错,不过你确信你是程序猿,而不是程序媛?要想正确的理解这个问题,我们首先从两类不同资源的空间隔离谈起。
非共享资源的隔离
非共享资源,是指在多任务系统中,由某一个任务“独享”的资源。对于这类资源,非常简单,在任务切换时将当前任务的资源配置写入到专用的存储器隔离外设(例如Cortex-M中的Memory Protection Unit,简称MPU)就可以了。这样,每个任务都可以将自己独享的资源与其它任务隔离开。
共享资源的隔离
共享资源,顾名思义,就是在多个任务间共享的资源,比如,共享的各类外设(UART,SPI之类)。对共享资源来说,要想实现隔离,单纯从静态空间角度出发是做不到的,因为隔离本质上就是一种“排他”——我的东西别人都不准用——那么又如何做到多任务之间进行“共享”呢?很自然的,“分时复用”的概念就被引入进来。简单说就是在时间轴上,把时间像地址空间那样分段,然后把不同的段落划分给不同的任务,这样,对每个任务来说,在自己的时间片内,这个资源就是独享的。
分时复用的概念并不是什么新鲜玩意,那么它跟隔离有什么关系呢?严格来说,一毛钱关系都没有。单纯的分时复用并没有起到任何隔离的作用——在分时复用的情况下,所谓的隔离,应该体现在,前后彼此相邻的两个任务在切换资源使用权后,后来者应该无法获取前者的残留信息——否则就是任务的信息泄露了。要实现这个功能,我们需要引入现场的概念:
- 当一个任务获得资源的使用权时,要回复自己的现场,以继续之前的工作
- 当一个任务被迫要放弃使用权时,不光要保护自己的现场,以便下次能继续,还要毁掉现在的现场,以防止泄露信息给资源的其它使用者
这一过程并不难理解,但值得强调的是,对共享资源来说,每个任务都有了一个针对该资源的“现场”。现场保存在哪里?还不是属于任务的某段存储器里?所以说,容易推导出:
共享资源的隔离,就是每个任务对资源专属现场(context)的空间隔离。
更进一步的,上述这种给每个任务都配备一个“现场”,从而将一个公共资源在多个任务之间共享的方式叫“虚拟化(Virtualisation)”——也就是
用一个物理的资源,用分时复用的方式给每个任务都虚拟一个资源出来。
而
虚拟化,就是实现“时间隔离”的核心方式。
好吧,饶了半天,终于绕回来了。我们来简单总结下:
- 非共享的资源——我们使用存储器管理外设,简单的用空间隔离就行了
- 共享资源——我们使用虚拟化技术,通过空间隔离“现场”的方式,实现资源在时间上的隔离(防止信息在任务切换时发生泄露)
说了这么多,我们来解释一个有趣的事情:流水线(pipeline)其实是一个共享资源——多个任务共享同一个流水线,通过分时复用的方式来执行任务代码。针对流水线的“现场”,我们习惯上叫任务上下文。从这个意义上说,OS不过是对流水线进行了虚拟化,使得每个任务执行时都能暂时的独占流水线。那么问题来了,你注意到没有,如果说前后台系统是简单的多任务,那么普通MCU在进行中断处理时,虽然有出入栈操作,但并没有“抹掉”前一个任务留下的“现场残骸”!——也就是说,任务信息在中断处理的过程中是会泄露的!!在原理上,普通MCU就是无法可靠实现“时间隔离”!
ARMv8-M TrustZone架构做了一件什么事情呢?就是,当程序在Secure模式下运行,突然来了Non-Secure的中断,除了普通现场保护,硬件还会帮你把Secure运行的现象抹掉!——也就是在架构上彻底通过硬件的方法实现了可靠的“时间隔离”,这是老的ARMv7-M和ARMv-6M架构无法通过硬件做到的——这就是为啥从原理上ARMv8-M的TrustZone比老的架构更安全。
在理解了隔离(Isolation)的基本概念后,时值ARM发布了PSA架构(Platform Security Architecture),下一篇文章,我们将介绍实践中,PSA是如何玩转隔离的。
—————以上正文结束—————
专栏推荐文章
大白话说嵌入式安全(1)
什么是嵌入式系统(上)
什么是嵌入式系统(中)
什么是嵌入式(下)—— “重力”和“沉淀”
如果你喜欢我的思维,欢迎订阅裸机思维
版权归裸机思维(傻孩子图书工作室旗下公众号)所有,
所有内容原创,严禁任何形式的转载。