漏洞与利用
漏洞是软件中违反其安全假设的缺陷;利用是将此类缺陷转化为攻击者可控行为的技术,从数据泄露到完整的代码执行。
Definition
漏洞是系统中攻击者可利用来违反其安全策略的弱点;利用是一种利用特定漏洞实现未经授权效果的技术或程序。
Scope
本主题涵盖主要的漏洞类别——内存损坏错误(缓冲区溢出、释放后使用)、注入、整数错误和逻辑缺陷——以及利用它们的技术,包括控制流劫持和面向返回编程。它还涵盖了提高利用成本的缓解措施(ASLR、DEP/NX、栈保护字、控制流完整性)。它不包括安全开发实践和特定于网络的漏洞,这些内容在相关主题中讨论。
Core questions
- 哪些类别的软件缺陷会产生可利用的漏洞?
- 内存损坏错误如何转化为对程序的控制?
- 什么是面向返回编程,为什么它能击败简单的防御?
- ASLR、DEP和栈保护字等缓解措施如何提高利用的门槛?
- 为什么利用和缓解之间的“军备竞赛”会持续存在?
Key concepts
- 缓冲区溢出
- 释放后使用
- 整数溢出
- 注入
- 控制流劫持
- 面向返回编程
- shellcode
- ASLR、DEP/NX、栈保护字
- 控制流完整性
Key theories
- 控制流劫持
- 许多漏洞利用会破坏代码指针(例如返回地址或函数指针),以将执行重定向到攻击者选择的代码,典型的例子是覆盖保存的返回地址的栈缓冲区溢出。
- 缓解措施与利用军备竞赛
- 不可执行内存、地址空间布局随机化、栈保护字和控制流完整性等防御措施各自阻止了一类技术,从而在持续升级中引发了新的攻击(面向返回编程、信息泄露)。
Mechanisms
经典的栈溢出写入超出缓冲区边界,覆盖保存的返回地址,以便当函数返回时,执行跳转到攻击者提供的shellcode。缓解措施打破了这一点:不可执行内存(DEP/NX)阻止了注入代码的运行,从而促使了链式现有代码片段的面向返回编程;地址空间布局随机化隐藏了目标地址,从而促使了信息泄露原语来对抗它。控制流完整性和内存安全语言旨在完全消除这些类别。
Clinical relevance
可利用的漏洞是真实攻击的原材料:内存安全错误在主要浏览器和操作系统中占大多数关键漏洞,零日漏洞在间谍活动和犯罪中被购买、出售和使用,并且该领域推动了防御工程、负责任的披露、漏洞赏金以及向Rust等内存安全语言的推进。
Evidence & guidelines
漏洞类别在MITRE的CWE中进行编目,并作为CVE单独跟踪,附带CVSS严重性评分。主要供应商(微软、谷歌)的研究报告称,大约70%的严重漏洞源于内存不安全,这促使了对内存安全语言的指导以及在现代平台中默认部署缓解措施(ASLR、CFI)。
History
利用在1988年莫里斯蠕虫的缓冲区溢出事件中进入公众视野,并由Aleph One在1996年的《Smashing the Stack for Fun and Profit》中系统化。每一次防御都引发了反击:DEP导致了返回到libc和Shacham的面向返回编程(2007年);ASLR导致了基于泄露的绕过。2013年的《内存中的永恒战争》调查框定了持续的军备竞赛,这场竞赛继续推动新的缓解措施和内存安全语言的采用。
Key figures
- Elias Levy (Aleph One)
- Hovav Shacham
- Dawn Song
- Ross Anderson
- Halvar Flake
Related topics
Seminal works
- aleph1996
- szekeres2013
- anderson2020
Frequently asked questions
- 什么是零日漏洞?
- 零日漏洞是指在被利用时,软件防御者未知(且未打补丁)的漏洞,这使得他们没有时间准备。此类缺陷对攻击者来说特别有价值,因为目前还没有修复或签名。
- 为什么内存安全语言被推广为一种解决方案?
- 内存安全语言(如Rust)在编译或运行时防止了整类错误——缓冲区溢出、释放后使用——从而消除了严重漏洞最常见的来源,而不仅仅是使每个漏洞更难利用。