
1.2.3 漏洞
并非所有的安全缺陷都会导致漏洞(vulnerability)。然而,如果一个安全缺陷会导致输入数据(例如,命令行参数)越过安全界限进入到程序中,那该安全缺陷就会导致软件漏洞。当包含安全缺陷的程序自身拥有比执行程序的用户更高的执行权限时,或者当程序被网络服务所使用(输入数据通过网络连接传入)时,这种情况就可能会发生。
漏洞(vulnerability)
指允许攻击者违反显式或隐式的安全策略的一组条件。
C安全编码规则技术规格说明(ISO/IEC TS 17961 C Secure Coding Rules technical specification)[Seacord 2012a]草案用到了这个定义。即便形成一个漏洞的所有前提条件都不具备,仍然可能存在安全缺陷。例如,一个程序可能包含一个缺陷,该缺陷允许用户以从程序本身继承而来的权限执行任意的代码。如果程序本身并没有特殊权限并且程序只能被本地用户所使用,那么该安全缺陷就并不构成漏洞,因为此时并没有违反安全策略的可能性。尽管如此,这个瑕疵也很可能会演变成一个安全缺陷,因为该程序可能会被重新部署或者是被一个拥有更高权限的系统所使用,那时攻击者就可以以更高的权限执行代码了。
在没有安全缺陷的情况下,同样可能存在漏洞。因为安全只是质量指标中的一个属性,它还需要与其他质量属性如性能和易用性等进行权衡[Bass 2013]。在这个权衡的过程中,软件设计者可能会故意选择将产品设计成附带漏洞的形式(可以某种形式利用)。故意忽略软件中的安全漏洞并不意味着软件就是安全的,只是说明软件的设计者代表软件的使用者接受了可能由安全问题所带来的风险而已。
图1.4揭示了程序可能会包含的实质上是由计算机系统和网络所引起的漏洞。也许看起来这一区别并没有那么清楚,可是如果程序未部署到计算机系统或者网络中,那么它也根本不可能有漏洞。如果程序未安装,或没有以某种可被攻击者利用来违反安全策略的方式进行安装,那么没有人可以用在你办公室硬盘上的程序来攻击你。进一步而言,实际的漏洞通常是在软件被配置成使其本身固有的漏洞可被利用的情况下而被发现的。因为这个区别有点难以表达清楚,所以在本书和CERT/CC的漏洞公告和咨询报告中,通常只是说程序包含漏洞或者程序是有漏洞的。