与整体安全目标的更好连接需要更复杂的规范
我们已将实施漏洞归类为违反软件组件的特定部分规范。但是,与整个软件系统的安全目标的连接很弱。软件系统完全有可能存在实现漏洞,但无法利用该漏洞来破坏系统的安全目标,例如,因为系统中的其他地方有多余的对策。更重要的是,如果一个软件系统没有任何我们讨论的实现漏洞,它仍然可能无法实现其安全目标。
为了更好地保证软件系统满足安全目标,可以将安全目标正式化为规范。在设计阶段,在子组件中分解系统时,应指定子组件的行为
这样它们共同暗示了整个系统的规范。通过这样的设计,一方面是违反规范的实现漏洞与系统的整体安全目标之间的联系另一方面,要强大得多。
但是,重要的是要注意,在这种情况下,规范将变得更加复杂和特定于域。我们讨论一个额外复杂性的例证。对于我们讨论的漏洞类别(内存管理、结构化输出生成、竞争条件和API漏洞),相应的规范表达了软件单次执行的属性:给定的执行满足或违反规范,一旦存在违反规范的执行,软件就会出现漏洞。规范。
但是,有些软件安全目标不能表示为单个执行跟踪的属性。这种安全目标的一个广泛研究的例子是信息流安全。确定性顺序程序的此安全目标的基线规范如下:将程序的输入和输出标记为公共或机密,然后要求软件没有两次执行相同的公共输入(但不同的机密输入)具有不同的公共输出。查看执行对的直觉如下:程序可能不会直接泄露机密数据,而是泄露有关此数据的一些部分信息。如果通过多次运行收集,攻击者可以收集如此多的信息,以至于最终机密原始数据的相关部分实际上被泄露。上述规范有效地要求机密输入永远不会以任何方式影响公共输出,因此不能泄露甚至部分信息。以双重方式,可以通过要求低完整性输入不会影响高完整性输出来表达完整性目标。
但是,信息流规范比我们在前面部分中讨论的规范更复杂,因为需要两次执行才能显示违反规范的情况。信息泄露漏洞违反了(面向机密性的)信息流策略。它们也可以理解为违反规范,但现在这是一个谈论软件系统多次执行的规范。这对制定解决这些漏洞的对策产生了深远的影响[12]。
侧信道漏洞不同
根据定义,侧信道漏洞并不违反软件源代码抽象级别的规范:它们本质上使用源代码抽象的效果。但是,如果开发的软件执行基础结构模型足够详细,可以模拟侧信道攻击,那么侧信道漏洞可以再次被理解为违反部分规范。可以通过为执行基础结构提供规范来选择在执行基础结构中定位漏洞,该规范指出它不应引入其他通信机制。这基本上是完全抽象理论[13]所要求的。或者,可以改进源代码语言的模型,以暴露特定侧信道攻击中使用的效果,从而可以在源代码级别表达侧信道漏洞。处理一般软件侧信道漏洞尚未得到很好的理解,也没有普遍适用的现实对策。当然,可以隔离执行,即防止在同一硬件上并发执行,但这与其他目标(例如优化硬件利用率)相矛盾。
漏洞作为故障
通过漏洞违反的规范对漏洞进行分类对于理解相关的漏洞类别很有用,但并不是一个完整的分类法:有大量的软件部分规范有助于实现某些安全目标的系统。然而,漏洞可以被视为故障概念的一个实例,在可靠计算领域进行了研究,并且在该领域已经开发了良好的故障分类法[14]。