 描述
基于堆栈的缓冲区溢出的条件是一个缓冲的条件在堆栈上分配(即覆盖。,很少是一个局部变量或参数的函数)。
 替代条款
堆栈溢出: |
“Stack Overflow”常被用来指的是基于堆栈的缓冲区溢出,但是有时它也指堆栈疲惫,通常是由于过分递归函数调用。由于这个词的歧义,使用堆栈溢出来描述情况气馁。 |
 的关系
此表显示了弱点和高水平类别相关的这一弱点。这些关系被定义为ChildOf、ParentOf MemberOf,并洞察类似项目可能存在的在较高和较低的抽象级别。此外,关系如PeerOf和CanAlsoBe定义显示类似的弱点,用户可能想要探索。
 背景细节
通常有几个强调安全的执行堆栈的数据会导致执行任意代码。最突出的是存储返回地址,应继续执行的内存地址一旦当前函数执行完成。攻击者可以覆盖这个值与一些内存地址的攻击者也有写访问,为它们的地方运行任意代码的全部特权脆弱的项目。交替,攻击者可以提供一个重要电话的地址,例如POSIX系统()调用,参数调用堆栈。这通常被称为一个返回到libc利用,因为攻击者通常迫使计划返回时间跳到一个有趣的程序C标准库(libc)。其他重要的数据通常在堆栈上包括堆栈指针和帧指针,两个值表明计算内存地址的偏移量。修改这些值通常可以利用“write-what-where”条件。
 模式的介绍
不同模式的引入提供了信息如何以及何时可以纳入这一弱点。生命周期的阶段识别点的介绍可能发生,而相关的报告提供了一个典型的场景介绍在给定的阶段。
 常见的后果
这个表指定不同的个人相关后果的弱点。标识应用程序范围的安全领域侵犯,而影响了负面的技术影响,如果敌人成功利用这个弱点。可能提供的信息如何可能的具体结果预计将看到列表中相对于其它后果。例如,可能会有高可能性,缺点将被利用来实现一定的影响,但较低的可能性,它将被利用来实现不同的影响。
范围 |
影响 |
可能性 |
可用性
|
技术的影响:修改内存;DoS:崩溃,退出或重新启动;DoS:资源消耗(CPU);DoS:资源消耗(内存)
缓冲区溢位通常导致崩溃。其他的攻击导致缺乏可用性是可能的,包括把程序进入一个无限循环。 |
|
完整性 保密 可用性 访问控制
|
技术的影响:修改内存;执行未经授权的代码或命令;旁路保护机制
缓冲区溢位常常可以用来执行任意代码,通常一个程序的范围之外的隐式安全政策。 |
|
完整性 保密 可用性 访问控制 其他
|
技术的影响:修改内存;执行未经授权的代码或命令;旁路保护机制;其他
后果是任意代码执行时,这往往是用来颠覆任何其他安全服务。 |
|
 利用的可能性
 示范例子
示例1
虽然缓冲区溢出的例子可能相当复杂,它可能很简单,但仍可采,基于堆栈缓冲区溢出:
#定义BUFSIZE 256 int主要(int命令行参数个数,char * * argv) {
字符缓冲区(BUFSIZE); strcpy (buf, argv [1]); }
缓冲区的大小是固定的,但没有保证字符串argv[1]不会超过这个大小和导致溢出。
示例2
这个例子将IP地址从一个用户,验证它是完整的,然后查找主机名和拷贝到缓冲区。
空白host_lookup (char * user_supplied_addr) {
struct hostent *惠普; in_addr_t * addr; char主机名[64]; in_addr_t inet_addr (const char * cp);
/ *程序确保user_supplied_addr是正确的格式转换* /
validate_addr_form (user_supplied_addr); addr = inet_addr (user_supplied_addr); 惠普= gethostbyaddr (addr, sizeof (struct in_addr) AF_INET); strcpy(主机名、hp - > h_name);
}
这个函数分配64字节的缓冲区存储主机名,但是没有保证主机名不能超过64字节。如果攻击者指定一个地址解析为一个非常大的主机名,那么该函数会覆盖敏感数据,甚至放弃攻击者的控制流。
注意,本例中还包含一个未检查返回值(cwe - 252)能导致一个空指针(cwe - 476)。
 观察到的例子
参考 |
描述 |
|
基于堆栈缓冲区溢出的SFK wifi芯片用于物联网/嵌入式设备,每中钢协KEV利用在野外。 |
 潜在的缓解措施
阶段:构建和编译
使用功能或运行或编译软件扩展自动提供一个保护机制,减轻或消除缓冲区溢出。
例如,某些编译器和扩展提供自动缓冲区溢出检测机制,构建到编译后的代码。例子包括Microsoft Visual Studio / GS标志,Fedora / Red Hat FORTIFY_SOURCE GCC国旗,StackGuard, ProPolice。
注意:这未必是一个完整的解决方案,因为这些机制只能检测某些类型的溢出。此外,仍有可能导致拒绝服务的攻击,因为典型的反应是退出应用程序。 |
阶段:体系结构和设计
使用一个抽象库抽象危险的api。不是一个完整的解决方案。 |
阶段:构建和编译
基于编译器的金丝雀StackGuard等机制,ProPolice和Microsoft Visual Studio / GS标志。除非这提供了自动范围检查,它不是一个完整的解决方案。 |
实施阶段:
实施和执行范围检查输入。 |
实施阶段:
不使用危险等功能。使用安全,等效函数检查边界错误。 |
阶段:操作
使用操作系统的预防功能,如本主题。这不是一个完整的解决方案。 |
 弱点Ordinalities
Ordinality |
描述 |
主 |
(其他弱点的弱点存在独立的) |
 会员资格
这MemberOf关系表显示额外CWE类别和视图引用这个弱点作为成员。这些信息通常是有用的在理解一个弱点符合外部信息源的上下文中。
 笔记
其他
基于堆栈缓冲区溢出可以实例化在返回地址覆盖,堆栈指针覆盖或帧指针覆盖。它们也可以被认为是函数指针覆盖,数组索引器覆盖或write-what-where条件等。
 分类法映射
映射分类名称 |
节点ID |
适合 |
映射节点名 |
扣 |
|
|
堆栈溢出 |
软件故障模式 |
SFP8 |
|
错误的缓冲区的访问 |
CERT C安全编码 |
ARR38-C |
不精确的 |
保证库函数并不会形成无效的指针 |
CERT C安全编码 |
STR31-C |
CWE更具体 |
保证存储字符串为字符数据有足够的空间和零终结者 |
 引用
|
|
迈克尔•霍华德(REF-44)大卫·勒布朗和Viega约翰。软件安全的“24宗罪”。“罪5:缓冲区溢出”。Page 89. McGraw-Hill. 2010. |
(ref - 62)马克·多德约翰麦克唐纳和贾斯汀Schuh。“软件安全评估的艺术”。第三章,“非执行堆栈”,76页。1版。艾迪生卫斯理》2006。 |
(ref - 62)马克·多德约翰麦克唐纳和贾斯汀Schuh。“软件安全评估的艺术”。第五章,“保护机制”,189页。1版。艾迪生卫斯理》2006。 |
|
|