8.1 如何量化CPU安全

太长不看版:做梦

曾经有无数的人希望能够将安全问题量化,甚至有些人正在这个方向上付诸实践。但恕笔者直言,这是及其愚蠢的。我们首先naive地思考如何量化呢? 例如我们如何量化性能或者功耗:

  1. 首先,我们需要选择一个"有代表性"的benchmark,例如SPEC、GKB等等
  2. 然后,我们根据benchmark的不同case的结果,做加权平均或者某种类似的平均
  3. 最终得出一个数值,这个数值代表了在有代表性的场景中,该CPU/SoC的典型功耗/性能

实际上我们稍微做一个比喻就可以知道为什么量化安全是荒谬的:

你当然可以通过计算一个人的百米跑,马拉松,引体向上等等"有代表性"的项目,得出某个分数,代表一个人的运动能力。但是你能够通过给各个器官的病变程度打个分,得出某个分数,来代表一个人的健康分数么?

很显然,这种算法你当然可以设计,例如用各种医学指标,例如血氧,心率,各种检测指标来设计出一个最终分数。但是,它有意义么? 假设一个人其他指标都正常,但是突然心率变成了0(嘎了),心率的比重是多少?10%?20%?那么他还能得80分 60分啊,好像很健康?你能对着一个猝死的人说:哥们别怕,你的健康程度还有80分哦~

也就是说,你当然可以设计某种类似于加权平均的方式来将一个领域的方方面面的评价reduce到一个归一化的数值上。但是,它没有任何意义,因为在这个数值上的偏序不能够代表你整体的好坏。这是因为安全方向上的逻辑并不是等价的,并且每个层级下的子问题间也不是等价的。因此你只能做一定方向上的分类、分级,而永远不可能用一个数值来概括"安全性"。

当然,有人可能会抬杠:既然平均不行,我们可以做更复杂的算法啊,比如一个人的心率必须大于30才能记分,否则就是总分为0。确实,我们可以通过非"加权平均"的非线性的算法来做另一个分数。但是还是有问题:

  • 安全的每个方向内都需要一个定制化的非线性算法,如何达成一致?
    • 例如不同的漏洞的评分标准都不一样,你认为这写漏洞在你的评价体系内到底采纳哪一种?
    • 例如不同的侧信道的难度不同,你如何界定他们之间的对比关系是如何的?
  • 不同的安全场景下的安全需求也不同,而CPU是为不同场景服务的,也就是说它某些情况下不可接受的安全问题可能在另一个场景下完全不care。
  • 上述两个问题交叉在一起,又会产生茫茫多不同的标准(不同场景下,不同方向下的不同指标以及非线性算法)

理论上当然也是可行的,但是别忘了你量化的初衷是什么?是懒!哦不,是希望用一个数值或者很简单的表现方式来描述CPU的安全的整体属性,用来比较或者作为某种指标、标准。(其实还是懒,因为我们没有足够的精力去打开里面每个概念,而希望只看一个数字/标准就解决问题)你如果这么一搞,还让人怎么懒?

想一想医学和其他方向上的逻辑不通就完全能理解这个区别了,医学你只能看你心肺功能如何,肝功能如何等等,但是他们没有办法整合到一个指标上。你以为没有公司想通过一个健康分数直接来筛选出哪些人适合工作,哪些人尽早辞退?当然有,但是这个复杂度只能reduce到一张体检报告,这个体检报告最后的风险也只可能取个所有风险的最高值(也就是只在"风险"这个维度表达出来),而不可能用一个数值代表你整体的健康属性。其实这种"对于某种属性做一个足够简单的评价"的需求永远是社会所需要的:学习能力是否复杂,难以量化?那我们不还是动用了举国的力量完成高考这个史诗级复杂的项目来把每个公民从初期就把学习能力表征到一个分数上?可以理解有些人觉得很多事情可以加权来减少他的脑细胞占用,但是有些领域就是做不到的。

所以,如果你对特定的应用场景,或者特定的安全方向,可以构造某种标准(而非某种分数)。但是想对CPU整体做一个量化的"安全分数",属于痴人说明,做出来一定是自娱自乐。