年纪一大了就爱谈方法论,其实也很简单,不是任何事我们都擅长,也不是任何是我们都可以借鉴前人的经验学习。
就拿web安全来说,当我们给web做渗透测试的时候,每家公司都有自己的测试用例,或者也可以说拿owasp top 10 相关的web用例来做参考。这些都是相对成熟的测试方法。那么如果是汽车渗透呢(好吧,其实国外也有相关书籍展示相关用例了),或者是某种新型的,使用的不是我们已知的协议来运作的系统呢。这个时候没有了已知的经验可学习,方法论就重要了,它可以帮助我们撰写用例。
最近我们公司在做动力机器人,其实我就在想机器人安全怎么做(当然公司层面并没关注到这一块)。我们不能每次谈到安全都是http协议的安全,这真的太有局限性了。我时长在想如何欺骗机器人的视觉装置,如果篡改机器人的驱动,如果让机器人陷入条件竞争,如何让机器人产生非预期的行为。当然这个也没法多说,因为根本没有实践的机会,还是说回来STRIDE模型。
STRIDE将威胁分为六类:Spoofing(欺骗)、Tampering(篡改)、Repudiation(抵赖)、Information disclosure(信息泄露)、Denial of service(拒绝服务)和Elevation of privilege(提权),并且提供了一套威胁建模工具,说实话没用过,但是按照这些 分类来撰写测试用例还是没问题。
首先还是要识别资产,即我要给什么样的东西(姑且是个东西吧)做安全渗透研究。要识别它的运作与通信原理,是电信号,还是以太网,还是类似汽车那种CAN数据总线(抱歉这部分我并不专业)。
其次要识别脆弱性,即基于对资产的理解而猜测(评估可能更合适)出来的那些脆弱项。这时方法论就来了。微软的STRIDE威胁模型提供了6个方向,我们可以基于这 6个方向来思考待评估的目标的脆弱点。目标在接受信号的时候是否可以进行欺骗?接受的信息是否可以被中间人篡改?攻击者是否无法被发现?攻击后是否可以获取信息?是否可以通过某种手段导致来导致目标拒绝服务?是否有办法获取系统更高的权限。
再次要评估各种脆弱性的受攻击便宜程度,通用程度,利用简易程度,甚至成本多少,这代表着这些威胁。威胁严格意义上应该和脆弱项做一一对应,这挺难,但是其实还是可以通过威胁频率来计算。只有足够高的威胁频率,配合具备实际操作意义的脆弱项,相关用例才有意义。比如你编写一个拒绝服务器攻击的测试用例,结果你用例写着开挖机挖断光缆,这显然是可行的,但是不具备意义。
当然其实我个人也认为微软这个STRIDE模型是具备局限性的,它的一切安全评估都是建立在可通信(或者叫数据接受与应答)的基础之上,但是这并不是安全的全部。还有物理安全,环境安全等,甚至有些东西在渗透测试之前都不具备可通信的情形(渗透员可能需要自行建立通信机制)。但是不可否认,让我研发一个新的测试用例,我依然会将STRIDE作为方法论来使用。也希望自己将来还有机会研发测试用例。那么研发一套渗透测试方法需要几步呢?
第一步:画出目标对象的数据流转逻辑图,这里包括以太网,CAN总线,其他电信号等。不同的数据流转方式建议使用画不同的逻辑图。
第二步:基于STRIDE分析这些数据流转图是否存在欺骗,篡改,抵赖,信息泄露,拒绝服务和提权的可能性。一般情况下一定存在上述其中几项。
第三步:为逻辑图的每一个数据流转过程编写测试工具,最终汇总成测试工具集
第四步:基于模型理论编写渗透测试用例,注意这和实际渗透不同,实际渗透以拿下目标控制权为目的,而写测试用例则要尽可能完成所有可能性的编写
第五步:通过实际渗透不断优化工具和渗透测试用例。
按照如上步骤,一套非通用的系统的渗透测试用例的开发需要3~6个月之久。但是我想说的是,这样的做法总比遇到安全问题,就想给上一套防火墙来的要好,哈哈(参考某车机安全防火墙产品)