1.3 威胁模型和攻击向量

这一节我们来讨论一些安全的基础概念:安全意味着什么?什么是威胁模型和攻击向量?安全方向需要做哪些权衡?

威胁模型

这一小节的内容对于计算机安全非常关键,不仅仅是CPU安全,但是却在很多场合是缺失的。虽然我想吐槽的是安全从业者和相关的人员,但是其实这种缺失是非常符合直觉的。比如,我们如果有一个议题叫做:提高本小区的安全性,那么很自然地,我们认为这些问题是可以讨论的:

  • 小区的门禁是否需要加强管理。
  • 小区的机动车出入是否需要登记。
  • 增加小区保安巡逻的频次
  • ……

但是,以下议题就显得不那么靠谱了:

  • 在小区内部署导弹防御系统。
  • 对小区出入的行李检查,防止物种入侵/生物武器。
  • ……

很明显,这里隐含了一个逻辑:"本小区的安全性"是仅仅假设一些治安问题,而并非是一些涉及到战争问题。这个潜意识中的划分,就是威胁模型,即在某个讨论的场景中,所面对的攻击的可能性有哪些。这其实在日常语境中作为"常识"的一部分出现,但是对于讨论安全技术时,经常大家的"常识"是不一致的。(在安全方向的论文中,如果是防御相关的内容,一般都会专门有一个小节来定义所防御的威胁模型,其实就是讨论一个防御方法是否完备的推演基础。)因此,我们需要首先定义好各种安全问题下的威胁模型,然后再来讨论安全问题本身。否则经常会出现一些似乎抬杠的问题:

  • 对于内存安全的某些机制,有人会问,如果你的内核态被人攻击了怎么办?
  • 用前文的比喻来说就是:如果你有人想攻击你的饭店,让你不能提供服务。如果你仅仅检查了每个顾客的菜单都是正常的,(没有一个人自己点了一万份),那如果后厨混进了奸细怎么办?
  • 回答就是:我们目前讨论的威胁模型是仅在用户态权限的攻击,而没有提权的攻击前提下(即攻击者只能伪装成顾客进来点菜,我的后厨都是自己人)。

Note

在面对攻击超出威胁模型范围时(比如"如果攻击者xxx你的防御就不work了啊?"),能否直接意识到这是不包含在威胁模型中的问题,是判断一个安全从业者是否对安全逻辑清晰的小tip。因为一个逻辑链清晰的安全从业者在讨论问题时,威胁模型应该时刻保持在头脑中。反之,如果他没有想清楚,一个经常可以用来搪塞的理由就是"安全是要顾及成本的,你说的xxx问题防御的成本太高了,因此没有纳入到我们的考虑"。某些场景下这个答案或许make sence,但是有时候其实也并不能说服多对方。关于安全机制的"成本vs安全性"的tradoff当然也是正确的考量问题之一,但是其实这和一种攻击在不在威胁模型中是两码事。

作为对前一小节的补充,我们简要地定义一下不同安全方向的大致的威胁模型:

  • 计算域内安全:在代码工作时,处理工作负载的输入时,攻击者可以构造恶意的输入。(一个饭店的顾客可能是来砸场子的,非要点油炸冰溜子。)
  • 计算域间安全:攻击者在其他计算环境可以执行代码,对当前计算环境对攻击,这两个计算环境本身是被隔离开的。(有恶意的客人想偷偷溜进后厨,或者其他饭店的后厨想溜进我们家后厨投毒。但是后厨本来是"闲人免进"的。)
  • 可信安全:攻击者可能对拥有对整个计算环境的资源管辖权,并且想攻击当前计算环境,窃取信息。(想搞你们家店铺的人其实就是你们的房东,拿着钥匙就进了后厨,偷看你们的祖传秘方。这回你再怎么检查客户订单也没辙了吧?)
  • 侧信道安全:攻击者不能和被攻击计算环境交互(或只有正常的交互),但是可以对计算环境进行测量。(想偷祖传秘方的人天天蹲在你家进货口和泔水桶,琢磨你的配方到底是个什么组成。)
  • 故障注入安全:攻击者可以构造一些恶意的输入,同时对计算环境进行测量。(想偷祖传秘方的人蹲在你家进货口,把小苏打偷偷换成盐,再去尝尝你做的菜咸不咸,猜你到底放了多少小苏打。)

理解了这一点,就能够很轻松的回答这些似乎是"抬杠"的问题了。比如一个常见的讨论可信安全的问题:

  • 既然你假设攻击者可以物理接触到芯片,那如果他直接磨开芯片,硬连线到你的信号上,是不是你的防御也失效了?
  • 这就好比:如果你的房东开着挖掘机就把你的厨房天花板给掀开了,你的配方不是一样被发现了?
  • 回答就是:我们的威胁模型不包括侵入式物理攻击。(房东只有房间钥匙,我们并不考虑他开挖掘机的场景。)

攻击向量

聊完了威胁模型,一个相关的概念就是威胁向量了。 威胁模型是对攻击者的能力做一个集合,而这个集合的每个元素,就是攻击向量,即攻击者可以使用的每种攻击方式/能力。