STRIDE威胁建模漫谈

https://www.secrss.com/articles/3298

安全属性

说到安全属性首先想到的就是CIA,这里的CIA不是美国中央情报局的缩写,而是Confidentiality (机密性), Integrity (完整性), 和 Availability (可用性)三个英文单词的首字母。

  • 机密性:保证机密信息不被窃取,窃听者不能了解信息的真实含义。
  • 完整性:保证数据的一致性,防止数据被非法用户窜改。
  • 可用性:保证合法用户对信息资源的使用不会被不正当的拒绝,如DOS攻击。

除了CIA三个最常见的安全属性外,这里再补充三个:

  • 鉴权:身份验证,建立用户身份。
  • 授权:明确允许或拒绝用户是否能访问资源,访问哪些资源。
  • 认可(不可抵赖):用户无法在执行某操作后否认执行了此操作。

鉴权和授权比较容易混淆,从名字上看很相似,但是它们是不同的两个安全属性。鉴权是指是否需要验证身份,而授权是指验证身份的等级。

打个比方,现在很多公园都是免费对外开放,而以前是收费凭门票进入。这里的是否需要门票就是鉴权问题。

而还有些公园,不仅需要门票进入,进入以后根据门票的不同,可以游玩的区域和设施是不一样的,只有购买了通票才可以游玩所有区域。这个通票就是我们这里说的超级管理员或者root账户。不同的角色分配不同的权限等级,即为授权。

安全设计原则

下面列出了十个安全设计原则:

  • 原则1 最小攻击面
  • 原则2 默认安全
  • 原则3 权限最小化
  • 原则4 纵深防御
  • 原则5 失败安全
  • 原则6 不信任第三方系统
  • 原则7 业务隔离
  • 原则8 公开设计
  • 原则9 简化系统设计
  • 原则10 使用白名单

每个原则在一些SDL相关的书籍中都有定义,这里说下我个人的理解:

  • 最小攻击面

我们在一些web安全防护建议中经常会提到“关闭不必要对外开放的端口”,这就是最小攻击面的一项措施。在网络攻击的生命周期中一个重要环节就是信息收集,这个环节往往也是黑客耗费时间精力最大的一个环节,对最终黑客的攻击成果起了至关重要的影响,越是有经验的黑客,会花更多的时间和精力在信息收集上面,这步做的好,后面就能一击命中。

当我们最小化攻击面这个安全原则做的好,就会大大影响黑客信息收集的成果,最终挫败黑客的攻击。

  • 默认安全

系统的默认配置带来的安全问题,比如早期一些路由器出厂默认的帐号是admin密码也是admin,使用默认帐号密码扫描类似的这些系统,当你扫描的基数逐渐增多时,一定会有意想不到的收获。

  • 权限最小化

这也是很多人常犯的错误,一个root账号搞定所有系统,虽然维护方便了,但是当黑客攻破任意一个系统就直接拿到了最高权限。

  • 纵深防御

不要把所有的精力只用在一点的防御上,一点防御的再强,也可能会出现0day漏洞,无法保证100%的安全。 层层设防,多样化,多层次、纵深的防御措施。攻破一层或一类防护后,无法破坏整个信息基础设施或应用系统。

比如:SQL注入攻击的直接原因是拼接SQL参数导致的,因此防止SQL注入攻击我们首先想到的就是SQL语句预编译的方法,除此之外部署WAF系统在外围首先进行拦截,数据库的敏感数据加密保存使得即便被黑客攻入,窃取出去的数据也无法还原出原始信息等多重防御方法结合使用,就是纵深防御。

  • 失败安全

当异常发生时,异常处理代码处理不当,可以导致意想不到的问题,比如权限提升、信息泄露等。这也是不懂安全的开发人员经常忽视的,而在黑客攻击kill chain的信息收集阶段,又是被黑客经常利用的,黑客对攻击目标故意输错url参数或者路径、构造异常post数据,导致服务器出错,如果开发人员对这里的错误处理不当,就会导致敏感甚至重要的信息被泄露,为黑客的下一步攻击提供重要的线索和思路。这些都是在真实案例中见到过的。

另外,漏洞挖掘中的fuzz模糊测试,其实也是通过各种非常规数据的输入设法把程序给搞崩溃,进而发现可能存在的漏洞。

  • 不信任第三方系统

现在的系统越来越复杂,很多都是模块化、组件化的,需要引入第三方的模块或者和第三方的业务系统对接并使用其提供的数据,我们无法掌控第三方系统的安全性,如果其存在漏洞被攻击,需要保证我们自己的系统不会因此而受到影响。这个威胁也排进了OWASP Top 10:“使用含有已知漏洞的组件”。

  • 业务隔离

简单一句话就是不要把所有鸡蛋都放在一个篮子里,不至于一个系统被攻破就让黑客拿到了一把“万能钥匙”,可以操作所有的业务功能。

  • 公开设计

如果是初次接触这个安全原则,可能会很难理解。通常会认为不要让我们的源代码泄露,更不能让加解密相关的重要源码泄露。但依据“公开设计”的安全原则,我们可以开放源代码后、我们的系统依然是安全的。一个典型相悖于“公开设计”原则的例子就是私有加密算法,误以为使用自己设计的加密算法更加安全。正确的做法是使用标准的RSA、AES等对称或非对称加密算法,我们数据的安全性不应该依赖于算法的保密性,而是确保加密密钥的安全,只要我们的密钥位数足够长,密钥不被泄露,那我们加密的数据就是安全的。 而在我接触到的真实黑客渗透中,黑客收集目标系统的信息,首先使用常规手段无法攻破系统后,如果这个系统因为是开源或者通过其他手段能拿到全部或者部分源码,经常黑客就会深入去研究系统的源代码,而常常能找到系统的漏洞或者突破口,进而发起进一步的攻击。这也是违反了“开放原则”。完全做到“开放设计”在实际中还不太多,也比较困难。但我们应该逐渐形成这样的意识,尽可能从保护源代码的思维转化为开放设计的思维 ,理想的目标就是做到把所有源代码开放给黑客,黑客也无法攻破系统。

  • 简化系统设计

做安全不久后,以前一直有个疑问困扰着我,就是安全防御技术越来越强,防御手段越来越多,漏洞被不断发现和修补,是不是以后安全问题就越来越少,最终就能几乎消灭所有安全问题? “简化系统设计”原则从侧面一定程度解答了这个疑问,随着信息技术、互联网技术的高速发展,系统功能变得强大的同时,系统也变得越来越复杂。越复杂的系统就越容易出现漏洞,特别像是逻辑漏洞这种,漏洞没有固定的模式、固定的特征,很难通过安全设备来防御。复杂度的提高通常也会导致攻击面变大。所以我们尽量简化系统设计,当有多种系统设计方案时,应该尽量选择最简单的那种方案。

  • 使用白名单

与白名单相对的就是黑名单,白名单机制可能导致“误杀”,而黑名单机制可能导致“误放”。在平衡“误杀”与“误放”时,通常更倾向于“误杀”,因为一旦“误放”我们系统就被黑客攻破,而“误杀”带来的其他问题可以设计诸如手动添加白名单等机制来解决,同时白名单机制还有可能能够防御各种未发现的安全隐患。

关于安全的思考

如果没有网络攻击,是没有必要搞网络安全的,网络安全的本质是攻防对抗,安全即是攻防双方一个博弈对抗的过程。
  • 防守比攻击更难

这是一个业界普遍认可的观点,当然前提是攻击者水平和防御者水平势均力敌。防御是木桶效应,整个系统的安全性不是取决于防御最强的地方,也不是系统的平均防御能力,而是取决于系统当中最薄弱的环节。 在一些安全攻防技术分析文章中,经常听到一个词语“绕过”,在web安全、终端安全、二进制安全等方向都经常听到,比如通过各种编码机制“绕过”WAF的检测、通过白加黑技术“绕过”杀毒软件的查杀、通过ROP技术“绕过”DEP的保护。花费大量精力精心设计的防御措施,黑客往往并不和你正面冲突的强攻对抗,而是以四两拨千斤的巧妙方式“绕过”了我们精心设计的防御系统。这些都说明了攻防对抗上的不平衡,防守比攻击更难。

  • 攻击者的脑洞比理论、学识更关键

虽然攻击方也有类似kill chain这样的理论方法、但在我实际接触到的一些案例中攻击者是不太讲究理论方法的,特别是在一些关键点攻击的突破上更是这样,更多的是攻击者的一些“奇思妙想”、脑洞大开。

这里举几个我以前接触过真实的例子,杀毒软件对自身进程的保护是相当严密的,杀软自身进程如果都被病毒木马给杀掉了,那对系统的保护就无从谈起。以前就发现过某知名杀软某个dll提供了一个强制结束进程的接口,木马通过调用这个接口可以关闭杀软自己的进程,攻击者想到的这种“杀软自杀”的方式真是非常的巧妙。这个案例已经是很多年前的事情了,现在想直接通过技术手段关闭杀软的可能性微乎其微,但去年我做过一个实验,通过“非技术”手段成功关闭杀软,所谓非技术手段就是通过模拟点击的方式,完全模拟人正常关闭杀软的流程和步骤,攻击方式真的是防不胜防。

又比如在钓鱼攻击中,攻击者是通过相似英文字母的混淆,或者是子域名的错位方式来构造虚假的钓鱼网址。但是这样的钓鱼网址仔细看肯定是能够发现其中的差异的。但是同形异义字钓鱼攻击,真的是肉眼无法识别,不信我们看下面这个网址: http://www.јԁ.com

这个是京东的网址,没有错吧?但是这次眼睛被欺骗了,这个不是京东的网址,不信可以将这个网址复制到浏览器试一下。

这就是所谓的同形异义字钓鱼攻击,这样的钓鱼攻击即使是有经验的人也很难发现(关于同形异义字钓鱼攻击这里就不详细介绍了,可以见我以前写的这篇文章:http://www.freebuf.com/articles/web/136729.html)。

上面介绍的几个案例是想说明攻击者的攻击方式真的是奇思妙想、五花八门,相比理论、学识,黑客的脑洞、天赋、兴趣显得更加关键,这也是为什么会出现少年黑客。周鸿祎最近的一次访谈里也说过黑客很难批量培养。 那安全防御能像攻击这样,也靠奇思妙想而不讲究理论方法吗?

  • 需要安全理论、方法论的支撑,才能做好防御

如果防御不讲究方法、没有方法论的指导,也像攻击者一样只靠脑洞,必然百密一疏,总有疏漏。攻击者往往攻击目标都是多个,这个攻不破还可以换下一个,主站无法攻破还可以从周边副站突破,而防守必须防住来自各个方位,不同时间的攻击,所以必须要有行之有效的方法论来指导我们能够按部就班的做好防御。威胁建模就是这样一种理论。