3.9 STRIDE变种
在发现威胁中,STRIDE是非常有用的助记符,不过它也不是完美无缺的。在这一部分内容中,你会学到STRIDE的一些变种,以期能帮助弥补其部分弱点。
3.9.1 STRIDE-per-Element
对图表中的某些元素来说,所对应的威胁很普遍,而STRIDE-per-Element方法就是使得STRIDE方法更加规范。例如,一个数据存储区不太可能去假冒别的数据存储区(尽管运行代码可能对它正在访问哪个数据库而感到迷惑)。通过关注对每个元素的一系列威胁,该方法就能更容易地找到威胁。例如,微软利用表3-9作为其安全开发生命周期(SDL)威胁建模培训的核心部分。
利用这个表格,你可以分析攻击者是如何篡改、如何读取数据或阻止访问数据流。例如,如果数据在以太网上传输,很常见的是,在同一个网络的人可以读取、修改所有数据内容或是发送大量数据包导致TCP超时。你可能会说网络分段可以减缓这些威胁。上面表格中“否认”栏中有一个标记,它的意思是解决这个问题涉及日志数据存储,并且有时日志记录会受到特殊攻击而允许否认攻击。
这里讨论的威胁是针对表3-9中元素的。每个元素都是受害主体,不是攻击主体。如果你篡改了一个数据存储,威胁是针对数据存储及其本身数据的。如果你对一个进程实施假冒,那么这个进程就是受害主体。在不讨论技术细节的情况下,通过篡改网络来假冒实际上是对终端的假冒,也就是说,其他终端会对另一端连接的是什么而感到困惑。上述表格关注对一个进程的假冒,而不是对数据流的假冒。当然,你若在检查数据流时发现了假冒威胁,你一定要记录下来以便后续解决,不要太担心它属于哪种威胁。STRIDE-per-Element方法在规范性方面很有优势,它能帮助你确定该寻找什么威胁,而不是检查表的形式:“网络组件:跨站脚本攻击(XSS)、伪造请求攻击(XSRF)……”对于使用该方法有经验的人,可利用这些元素寻找组件中的脆弱点。对于不太熟悉方法的人来说,仍然可以用来寻找很多通用的问题。
STRIDE-per-Element确实有两个弱点:首先,在一个给定的威胁模型中,类似的问题会反复出现多次;其次,这个表格可能并不能描述你的问题。事实上,从某种程度上说,表3-9是特别针对微软公司的。最容易看出该弱点的是“由外部实体造成的信息泄露”,这是对一些隐私问题的描述。(但这绝非对隐私问题的完整描述。)然而,表中并没有暗示这可能是个问题,原因在于,微软有一套单独的隐私分析过程,而这是在安全威胁建模范畴之外的。因此,如果你打算采用这种方法,要分析该表格是否包含了你所关心的问题,如果不包含,重新构建一个适合你的分析场景的版本。另外很多人想要讨论数据流假冒威胁,这该是STRIDE-per-Element的内容吗?假冒行为是对终端的假冒,但是这样的描述可能会帮助寻找那些威胁。另外还要注意,你添加的“x”越多,你就离“针对图表中每个元素思考STRIDE”越近。有人会问这是好事还是坏事,这个问题提得很好。如果你希望更加全面,这是有帮助的,而如果你希望只关注最有可能出现的问题时,这就可能是个分心的事了。
那么什么时候代表完成了STRIDE-per-Element分析工作?在STRIDE-per-Element中,当每个检查框中都有一个威胁时,说明你正做得相当好;如果你思虑再三,还在考虑针对减缓措施的威胁时(或者寻找绕过他们的方法),你将能做得相当好。
3.9.2 STRIDE-per-Interaction
STRIDE-per-Interaction是识别威胁的最简化方法,初学者很容易理解。威胁不会凭空出现,它们是在与系统交互的过程中出现的。STRIDE-per-Interaction方法可以通过考虑数据元组(源、目的、交互)枚举威胁,以及枚举与其对抗的威胁。起初,这个方法的另一个目的是减少一个建模者需要思考的事情,但是没能按照计划实现。STRIDE-per-Interaction方法和STRIDE-per-Element方法会引出一样多的威胁,但是用这种方法可以更好地理解威胁。此方法是由Larry Osterman和Douglas MacIver研发出来的,他们二人都供职于微软公司。表3-10和表3-11展示了STRIDE-per-Interaction方法,都引用了两个过程Contoso.exe及Fabrikam.dll。表3-10展示了哪些威胁适用于每个交互过程,表3-11展示了STRIDE-per-Interaction方法应用于图3-1的例子。图3-1展示了两个表格中提到的命名实体和信任边界。
表3-10中列的内容如下:
- 数字,代表某一行(例如,“请看第2行,让我们看看假冒和信息泄露威胁”)
- 你要查看的主要元素
- 元素与其他元素之间的交互
- 适用于该次交互的STRIDE威胁
当STRIDE-per-Interaction中有每个威胁对应的检查表时,你可以完成得很好。假如你思虑再三,还在考虑针对减缓措施的威胁时(或者寻找绕过它们的方法),你将能做得相当好。
STRIDE-per-Interaction方法太复杂了,如果手边没有参照的图表,就很难使用该方法。(相比之下,STRIDE是个比较容易的助记符,而STRIDE-per-Element也足够简单,表格可以存储或者将表格打印在易于携带的卡片上。)
3.9.3 DESIST方法
DESIST是STRIDE方法的一个变种,由Gunnar Peterson创建。DESIST表示争论(Dispute)、权限提升(Elevation of privilege)、假冒(Spoofing)、信息泄露(Information disclosure)、拒绝服务(Service denial)及篡改(Tampering)。(用一个没那么华丽的词“争论”代替了否认,之所以拒绝服务的两个英文词的顺序进行调换,是为了能让首字母缩写呈现现在的样子。)如果从零开始做威胁建模,或许可以用DESIST方法而不是STRIDE方法,但是STRIDE方法已经存在了数十年,对微软来说,换一种方法的代价很高。(Scorpion软件公司的首席执行官Dana Epp表示,DESIST首字母缩写中有两个重复一样的首字母会比较具有挑战性,STRIDE就不存在这个问题。)因此,使用STRIDE-per-element就是常态,而不是使用DESIST-per-element。不管怎样,用助记符总是有助于人们寻找威胁的。