安全测试系列一:用实例来解释安全威胁分类 (STRIDE)
安全测试跟通常的测试工作还是有很大不同的。我认为安全测试是在技术上超越开发人员的一个主要途径。一个合格的开发人员去做测试的工作,无论是黑盒,还是白盒,手工,还是自动化,都不需要他花很多的时间就可以进入工作状态。而对于安全测试,即使一个很有经验的开发人员不经过专门的学习也很难进行有效的工作。另外,一个安全测试人员的水平一般来说应该比开发人员高才对,如果低的话,很难想象你能够容易的发现什么安全漏洞(假设这个开发人员没有低级失误),更不要说什么更深层次的漏洞了。一个安全测试人员应该具备普通开发人员想不到的知识与经验,这样才能通过这些知识与经验去发现这些开发人员犯下的安全错误。我个人在通常的测试工作上已经找不到什么进步的感觉了,更多的是感到重复的劳动,因此我接下来会在安全测试的领域进行一些实践与探索,写一些文章。我不知道有多少人对安全测试感兴趣,不过至少我可以作为一个自我知识的总结与归纳。
黑客大多是凭借自己的兴趣来发现漏洞和实现攻击的,而对于安全测试人员来说是应该有一些系统的概念的,比如到底有什么样的安全威胁,怎么去分类,每类有什么特点,等等。今天我就用几年前我个人的一些经验来解释一些安全的分类。
大概6,7年前,我在一个论坛混,由于一些矛盾使我受到了不公正的对待,比如删贴,封ID等等。我并不是一个喜欢做坏事的人,因此对于黑客的技术从来没有感兴趣过,但是心中还是很不服气。我想作为一个计算机技术人员怎么能让别人这么欺负呢?因此实现了自己一系列的攻击。没想到的是,6,7年之后,在自己学习安全测试的时候,才意识到自己的那次攻击行为竟然几乎涉及了所有的安全威胁。起初的想法很简单,就是编一个程序自动发帖子。OK,这个很容易就实现了,论坛上滚滚都是我发的帖子,当然我用了不同的ID去发,论坛的排行榜经过了多年的积累,在几分钟之后排名靠前的全是我注册的新ID了。用户当然也就无法去正常的访问和使用这个论坛了。然后和他们开发人员的对抗就开始了,他们先是要求发帖的时候根据图片输入一串数字,可惜他们图片的文件名和数字是对应的,我可以轻易的先发一个请求包得到回应包,search里边的图片文件名,然后再发发帖请求。他们的这个办法失效了,并且由于他们自己有bug,使得正常的用户即使输入了正确的数字也常常发帖失败。他们则取消了这个验证系统,转而控制每个IP每个小时只能发帖5次了。虽然很多用户并不满意这个规则,但是还是有效地限制了我的自动程序。我的对应有三种办法,一是使用多台机器,可是我手中没有这么多资源。二是程序控制每小时只发5个帖子,这样一晚上下来也会让论坛看上去很难看。三是动态的去修改自己的IP。Search了一下,但是并没有找到修改IP的有效资料,因此停止了这个方案。当然还有另外一个原因让我停止就是,我发现了他们的一个bug,我可以用任何人的ID去发言。这个bug用起来就很有趣了,我可以以管理员的名字在论坛上发虚假信息,用一个人的ID去攻击其他人引起公愤等等。这个bug他们的开发人员没办法了,他们不知道怎么回事也没有应对的措施了,他们还以为我攻破他们的数据库了呢。后来网站的老总也出面讲话了,他们也没人敢惹我了,这事就算了。另外,我只能使用其他人的ID发言,我也尝试过找出他们的漏洞去使用管理员的权限去做些事情,比如删贴子,封ID,IP等等,不过没有成功。
话说回来,安全威胁分类的英文缩写是STRIDE, 代表了六种安全威胁,分别为Spoofing, Tampering, Repudiation, Information Disclosure, Denial of Services, and Elevation of Privileges.
1. Spoofing 就是伪装,比如我用别人的ID发言就是Identity Spoofing, 我想到用变化IP的办法就是IP Spoofing.
2. Tampering 就是篡改,比如我用别人ID发言的手段就是篡改了合法包,而他们的server端没有相应的检查措施。
3. Repudiation 就是拒绝承认,比如我进行了这些攻击,他们并不知道是我做的,也没有证据是我做的,我就可以不承认。
4. Information Disclosure 就是信息的泄漏,比如他们的那串数字图片就没有任何保护,图片上的信息轻易的就被别人得到了。
5. Denial of Services 就是拒绝服务,比如我的自动发帖使得正常用户无法使用就是这种攻击。
6. Elevation of Privileges 就是权限的提升,比如我尝试用管理员的权限去做事情,就是属于这种。
一般来说,EOP的威胁是最大的,这也是为什么Vista下要加入UAC的功能了,就是为了防御这种攻击。而Buffer Overflow则是可以被利用进行这种攻击的常见安全漏洞,这个问题可以以后再谈。DOS攻击可能是最容易发现的安全漏洞,比如一个AV就可以导致这种攻击。当然DOS攻击也分为两种,一种是导致服务突然崩溃,另一种则是使服务逐渐失去能力,比如在大客户量的时候。第二种就要比第一种更难测试一些了。这些威胁都不是独立存在的,很多时候是互相关联的,比如我是通过Tampering的手段,达到了Spoofing的目的。再比如,你如果成功进行了EOP的攻击,Spoofing, Tampering, Information Disclosure 这些问题也就自然出现了。对于我们安全测试来说,我们一般是对照一个软件模块,通过安全分析,列出各种可能的威胁,并且设计出各种安全的test case去进行测试.