软件安全知识之漏洞类别
漏洞类别
如简介中所述 ,软件我们使用术语实现漏洞(有时也称为安全漏洞)来表示使攻击者可能违反安全目标的安全错误 ,以及支持特定攻击技术的知识之漏bug类 。
实施漏洞在网络安全中发挥着重要作用,洞类并且有多种形式。软件常见漏洞和披露(CVE)是安全一个公开的条目列表,采用标准化形式,知识之漏描述广泛使用的洞类软件组件中的漏洞 ,以及在撰写本文时,软件它列出了近十万个此类漏洞 。安全实现漏洞通常是模板下载知识之漏由不安全的编程实践引起的,并受开发人员使用的洞类编程语言或API的影响。第一个主题涵盖了可归因于此类不安全编程实践的软件重要实现漏洞类别 。
现有的安全脆弱性分类,如共同弱点枚举(CWE) ,知识之漏一个社区制定的脆弱性类别列表,可作为脆弱性识别 、缓解和预防的基线,云计算但没有一个现有的分类已经成功地提出了一个完整的分类法。因此,第一个主题中讨论的类别应被视为重要类别的脆弱性示例 ,而不是详尽无遗的清单。选择它们的目的是涵盖最常见的实现漏洞 ,但这种选择至少在某种程度上是亿华云主观的。
特定类别的实现漏洞通常可以描述为违反软件系统某些子组件的(正式或非正式)规范 。这样的规范采用合同的形式,明确子组件的期望 ,并提供给其客户。在违反此类合同时,软件系统进入错误状态,软件系统的进一步行为通常是系统开发人员未考虑的源码下载行为 ,并且依赖于系统实现详细信息。系统的攻击者可以研究实现细节并利用它们使系统以攻击者所需的方式运行 。
内存管理漏洞
命令式编程语言支持可变状态 ,即这些语言具有用于分配存储单元的构造,这些存储单元随后可以分配给程序或由程序读取 ,然后再次释放。编程语言定义指定如何正确使用这些构造 :例如,分配n存储单元将返回对单元数组的引用,然后可以使用索引0到访问该数组n1直到再次释放(释放)引用。此规范可以看作是内存管理子组件的建站模板协定 。某些编程语言实现此协定防守和将扔一例外如果a客户程序访问记忆错误。其他编程语言(最特别是C和C++)离开这责任为正确分配 ,访问和解除分配记忆在这手之这程序员和说错误地访问或管理内存的程序的行为是定义.这种语言有时被称为内存不安全与内存管理相关的语言和错误(内存管理漏洞)是这些安全漏洞的臭名昭著的来源语言 。
• 空间漏洞是指程序索引到有效的连续存储单元范围 ,但索引超出范围的免费模板错误 。典型的示例是缓冲区溢出漏洞,程序访问具有越界索引的数组(缓冲区) 。
• 临时漏洞是程序访问曾经分配给程序但后来已解除分配的内存的错误 。一个典型的例子是取消引用悬空指针。
C和C++语言规范未定义具有内存管理漏洞的程序的行为。因此 ,观察到的具有漏洞的程序的行为将取决于语言的实际实现 。从安全的角度来看,内存管理漏洞尤其危险 ,因为在许多实现中 ,分配给程序的可变内存单元是存储已编译程序代码和运行时元数据(如调用堆栈)的相同内存地址空间 。在此类实现中,违反内存管理协定的程序访问可能会导致对已编译的程序代码或运行时元数据的访问,并且因此可能导致程序代码 、程序控制流和程序数据损坏。存在各种强大的攻击技术来利用内存管理漏洞[3]。
攻击包括向程序提供输入以触发漏洞,从而使程序违反内存管理协定。攻击者选择输入,以便程序访问攻击者感兴趣的存储单元:
• 在代码损坏攻击中,无效的内存访问将编译的程序代码修改为攻击者指定的代码。
• 在控制流劫持攻击中,无效内存访问修改代码指针(例如,堆栈上的返回地址或函数指针),以使处理器执行攻击者提供的代码(直接代码注入攻击),或使处理器重用程序的现有代码以意外的方式(代码重用攻击 ,也称为间接代码注入攻击,例如返回libc攻击或面向返回的编程攻击)。
• 在仅数据攻击中,无效的内存访问会修改程序的其他数据变量,从而可能导致攻击者的权限增加 。
• 在信息泄漏攻击中 ,无效内存访问是读取访问 ,可能导致信息泄露,无论是应用程序机密(如加密密钥)还是运行时元数据(如有助于预测的地址)的确切内存布局,因此可能会启用其他攻击。
由于这些类别的攻击具有实际重要性,因此已经开发了应对特定攻击技术的缓解技术,我们将在主题4中讨论这些技术 。