CWE

常见的弱点枚举

一个由社区开发的软件&硬件缺陷类型的列表

2021 CWE最重要的硬件的弱点
CWE最危险的弱点
>CWE列表> CWE -个人字典定义(4.10)
ID

cwe - 364:信号处理程序竞态条件

弱点ID: 364
抽象:基地
结构:简单的
视图定制的信息:
+描述
产品使用一个信号处理程序,引入了竞争条件。
+扩展描述

竞态条件经常发生在信号处理程序,因为信号处理程序支持异步操作。这些竞争条件不同的根本原因和症状。攻击者可能会利用一个信号处理程序竞态条件导致损坏,产品状态可能导致拒绝服务,甚至代码执行。

这些问题发生在不可重入函数,或者state-sensitive行动发生在信号处理器,他们可能在任何时间被称为。这些行为会违反假设由“普通”中断的代码,或由其他信号处理程序也可以被调用。如果这些函数被称为一个不合时宜的时刻,如不可重入函数已经运行时,可能会发生内存泄露有可能被利用的代码执行。另一个信号竞态条件常见发生在自由就是在一个信号处理程序,导致双重自由因此write-what-where条件。即使一个给定的指针设置为NULL后被释放,竞态条件仍然存在时间的内存被释放和指针设置为NULL。这尤其有问题如果同样的信号处理器已经超过一个信号,因为这意味着信号处理器本身可能进来。

有几个已知的行为相关的信号处理程序收到的标签“信号处理器竞争条件”:

  • 共享状态(如全局数据或静态变量)都可以访问一个信号处理程序和“普通”代码
  • 共享状态之间的信号处理器和其他信号处理程序
  • 使用不可重入的功能在一个信号处理程序,这通常意味着使用共享状态。例如,malloc()和free()是不可重入的,因为他们可能使用全局或静态数据结构来管理内存,他们看上去间接使用syslog()等功能;这些函数可以利用内存损坏,可能代码执行。
  • 协会相同的信号处理函数有多个信号——这可能意味着共享状态,因为访问相同的代码和资源。举例来说,这可能是一个双重释放和use-after-free弱点。
  • 使用setjmp和longjmp或其他机制,防止信号处理器返回回到最初的控制功能
  • 虽然不是技术竞争条件,一些信号处理程序的设计被称为最多一次,和被称为不止一次可以引入安全问题,即使没有任何并发调用信号处理程序。这可能是一个双重释放和use-after-free弱点。

信号处理程序的漏洞往往是分类的基础上,缺乏具体的保护机制,尽管这种风格的分类在CWE气馁,因为程序员通常可以选择几种不同的解决机制的弱点。这样的保护机制可能保留独家访问共享资源,为相关代码和行为原子性:

  • 避免共享状态
  • 使用同步的信号处理程序
  • 使用同步的代码
  • 禁用或掩蔽其他信号,它提供了原子性(有效地确保排他性)
+的关系
部分帮助此表显示了弱点和高水平类别相关的这一弱点。这些关系被定义为ChildOf、ParentOf MemberOf,并洞察类似项目可能存在的在较高和较低的抽象级别。此外,关系如PeerOf和CanAlsoBe定义显示类似的弱点,用户可能想要探索。
+相关的视图”研究概念”(cwe - 1000)
自然 类型 ID 的名字
ChildOf 类类——一个弱点,描述的是一个非常抽象的时尚,通常独立于任何特定的语言或技术。更具体的比一个支柱的弱点,但更普遍的基本的弱点。类级别的弱点通常描述问题的1或2以下维度:行为、财产和资源。 362年 使用共享资源与不当同步并发执行(“竞争条件”)
ParentOf 基地Base -一个弱点,仍主要是独立的资源或技术,但有足够的细节来提供特定的检测和预防方法。基础水平的弱点通常描述问题的2或3以下维度:行为、财产、技术、语言,和资源。 432年 危险信号处理器不敏感操作期间禁用
ParentOf 基地Base -一个弱点,仍主要是独立的资源或技术,但有足够的细节来提供特定的检测和预防方法。基础水平的弱点通常描述问题的2或3以下维度:行为、财产、技术、语言,和资源。 828年 这不是Asynchronous-Safe信号处理器与功能
ParentOf 基地Base -一个弱点,仍主要是独立的资源或技术,但有足够的细节来提供特定的检测和预防方法。基础水平的弱点通常描述问题的2或3以下维度:行为、财产、技术、语言,和资源。 831年 信号处理函数相关的多个信号
CanPrecede 基地Base -一个弱点,仍主要是独立的资源或技术,但有足够的细节来提供特定的检测和预防方法。基础水平的弱点通常描述问题的2或3以下维度:行为、财产、技术、语言,和资源。 123年 Write-what-where条件
CanPrecede 变体变体——一个弱点与某种类型的产品,通常涉及到一个特定的语言或技术。更具体的比基本的弱点。变异水平弱点通常描述问题的3到5以下维度:行为、财产、技术、语言,和资源。 415年 双自由
CanPrecede 变体变体——一个弱点与某种类型的产品,通常涉及到一个特定的语言或技术。更具体的比基本的弱点。变异水平弱点通常描述问题的3到5以下维度:行为、财产、技术、语言,和资源。 416年 使用后免费
部分帮助此表显示了弱点和高水平类别相关的这一弱点。这些关系被定义为ChildOf、ParentOf MemberOf,并洞察类似项目可能存在的在较高和较低的抽象级别。此外,关系如PeerOf和CanAlsoBe定义显示类似的弱点,用户可能想要探索。
+相关观点“软件开发”(cwe - 699)
自然 类型 ID 的名字
MemberOf 类别类别——CWE条目包含一组其他条目,共享一个共同的特点。 387年 信号错误
MemberOf 类别类别——CWE条目包含一组其他条目,共享一个共同的特点。 557年 并发问题
+模式的介绍
部分帮助不同模式的引入提供了信息如何以及何时可以纳入这一弱点。生命周期的阶段识别点的介绍可能发生,而相关的报告提供了一个典型的场景介绍在给定的阶段。
阶段 请注意
架构和设计
实现
+适用的平台
部分帮助该清单显示了给定的弱点可以可能的地区出现。这些可能是为特定命名的语言,操作系统,架构、模式、技术、或一个类这样的平台。列出的平台是随着频率的出现疲态实例。

语言

C(有时流行)

c++(有时流行)

+常见的后果
部分帮助这个表指定不同的个人相关后果的弱点。标识应用程序范围的安全领域侵犯,而影响了负面的技术影响,如果敌人成功利用这个弱点。可能提供的信息如何可能的具体结果预计将看到列表中相对于其它后果。例如,可能会有高可能性,缺点将被利用来实现一定的影响,但较低的可能性,它将被利用来实现不同的影响。
范围 影响 可能性
完整性
保密
可用性

技术的影响:修改应用程序数据;修改内存;DoS:崩溃,退出或重新启动;执行未经授权的代码或命令

它可能会造成数据损坏并可能执行任意代码,修改全局变量或数据结构意想不到的时候,违反代码使用这个全局数据的假设。
访问控制

技术的影响:获得特权或假设的身份

如果一个信号处理器中断正在执行的代码与特权,它可能信号处理器也将以更高权限执行,可能使后续利用更严重。
+利用的可能性
媒介
+示范例子

示例1

这段代码注册相同的信号处理函数有两个不同的信号(cwe - 831)。如果这些信号被发送到过程中,处理程序创建一个日志消息(在第一个参数中指定程序)并退出。

(坏的代码)
例如语言:C
char * logMessage;

空白处理程序(int sgn) {
syslog (LOG_NOTICE“% s \ n”, logMessage);
免费(logMessage);
/ *人为地增加时间窗口的大小简化演示的这个弱点。* /

睡眠(10);
退出(0);
}

int主要(int命令行参数个数,char * argv []) {
logMessage =第6行的(argv [1]);
/ *信号处理程序注册。* /

(SIGHUP信号处理程序);
信号(SIGTERM,处理程序);
/ *人为地增加时间窗口的大小简化演示的这个弱点。* /

睡眠(10);
}

处理程序函数使用全局状态(globalVar和logMessage),它可以被称为SIGHUP和SIGTERM信号。攻击场景可能遵循这些原则:

  • 程序开始执行,初始化logMessage和寄存器SIGHUP和SIGTERM信号处理程序。
  • 程序开始其“正常”的功能,简化为睡眠(),但可以是任何功能,消耗一些时间。
  • 攻击者发送SIGHUP,调用处理程序(称之为“SIGHUP-handler”)。
  • SIGHUP-handler开始执行时,调用syslog ()。
  • syslog()调用malloc(),它是不可重入的。malloc()开始修改元数据管理堆。
  • 攻击者发送SIGTERM。
  • SIGHUP-handler中断,但syslog的malloc调用仍执行及其元数据还没有完成修改。
  • SIGTERM处理程序被调用。
  • SIGTERM-handler记录日志消息使用syslog(),然后释放logMessage变量。

在这一点上,堆的状态是不确定的,因为malloc仍堆修改元数据;元数据可能处于不一致的状态。SIGTERM-handler调用free()是假设元数据不一致,可能导致它写数据到错误的位置,同时管理堆。结果是内存损坏,甚至可能导致崩溃或代码执行,取决于在何种情况下运行的代码。

注意,这是一个改编的一个典型的例子是最初提出的米甲Zalewski [ref - 360];最初的例子是可利用的代码执行。

还注意到第6行的(argv[1])调用包含潜在的缓冲区上(cwe - 126)如果程序没有任何参数,因为命令行参数个数是0,argv[1]将数组的边界之外。

示例2

下面的代码与多个信号来注册一个信号处理程序日志发生特定事件时在退出前和自由相关的记忆。

(坏的代码)
例如语言:C
# include < signal.h >
# include < syslog.h >
# include < string.h >
# include < stdlib.h >

void * global1 * global2;
char *什么;
空白sh (int假){
syslog (LOG_NOTICE,“% s \ n”);
免费(global2);
免费(global1);
/ *睡眠语句添加到扩大竞争条件* /的时间窗口

睡眠(10);
退出(0);
}

int主要(int命令行参数个数,char * argv []) {
什么= argv [1];
global1 =第6行的(argv [2]);
global2 = malloc (340);
信号(SIGHUP, sh);
信号(SIGTERM, sh);
/ *睡眠语句添加到扩大竞争条件* /的时间窗口

睡眠(10);
退出(0);
}

然而,下面的事件序列可能导致双重释放(cwe - 415):

  1. 一个SIGHUP是交付的过程
  2. sh()调用来处理SIGHUP
  3. sh()的第一个调用到达global1被释放
  4. 在这一点上,发送SIGTERM过程
  5. 第二个调用global1 sh()可能会做一个免费的
  6. 这导致一个双重释放(cwe - 415)

这只是一个可能的开发上面的代码。另外一个例子,syslog调用可以使用malloc调用不async-signal安全。这可能导致腐败堆的管理结构。更多细节,请参考这个例子在“传递信号为了好玩和利润”(ref - 360]。

+观察到的例子
参考 描述
信号处理器没有禁用其他信号处理程序,允许它被打断,导致其他功能访问文件/等。与提高特权
攻击者可以发出一个信号,而另一个信号处理程序已经运行,导致崩溃或执行使用root特权
不安全的库函数的调用信号处理程序
SIGURG可用于远程中断信号处理器;其他变体存在
SIGCHLD信号FTP服务器负载过大的情况下会导致崩溃而执行malloc / free等不可重入函数。
+潜在的缓解措施

阶段:需求

策略:语言选择

使用一种语言,不允许这个弱点或发生提供了结构,使这个弱点更容易避免的。

阶段:体系结构和设计

设计信号处理程序只设置标志,而不是执行复杂的功能。这些标志可以在主程序循环检查和采取行动。

实施阶段:

在信号处理程序只使用可重入函数。同时,使用验证确保状态是一致的,而执行异步操作影响执行的状态。
+功能区域
  • 信号
  • 进程间通信
+影响资源
  • 系统进程
+会员资格
部分帮助这MemberOf关系表显示额外CWE类别和视图引用这个弱点作为成员。这些信息通常是有用的在理解一个弱点符合外部信息源的上下文中。
自然 类型 ID 的名字
MemberOf 类别类别——CWE条目包含一组其他条目,共享一个共同的特点。 361年 7 pk -时间和状态
MemberOf 视图视图——CWE条目的一个子集,它提供了一种检查CWE的内容。两个主要视图结构片(列表)和图(包含条目之间的关系)。 884年 CWE横截面
MemberOf 类别类别——CWE条目包含一组其他条目,共享一个共同的特点。 986年 SFP二级集群:失踪的锁
+分类法映射
映射分类名称 节点ID 适合 映射节点名
千鸟 信号处理器竞态条件
7有害的王国 信号处理竞态条件
在信号处理器竞态条件
软件故障模式 SFP19 失踪的锁
+引用
[REF-18]安全软件公司. .“扣应用程序安全性的过程”。2005年。<https://cwe.mitre.org/documents/sources/TheCLASPApplicationSecurityProcess.pdf>。
米甲Zalewski (ref - 360)。“为了好玩和利润提供信号”。<http://lcamtuf.coredump.cx/signals.txt>。
迈克尔•霍华德(REF-44)大卫·勒布朗和Viega约翰。软件安全的“24宗罪”。“罪13:竞争条件”。Page 205. McGraw-Hill. 2010.
(ref - 62)马克·多德约翰麦克唐纳和贾斯汀Schuh。“软件安全评估的艺术”。13章,“漏洞”,791页。1版。艾迪生卫斯理》2006。
+内容的历史
+提交
提交日期 提交者 组织
2006-07-19 千鸟
+修改
修改日期 修饰符 组织
2008-07-01 Eric Dalci Cigital
更新Time_of_Introduction
2008-09-08 CWE内容团队 主教法冠
更新Applicable_Platforms Common_Consequences、关系、Other_Notes Taxonomy_Mappings
2010-09-27 CWE内容团队 主教法冠
更新Observed_Examples,引用
2010-12-13 CWE内容团队 主教法冠
更新Common_Consequences Demonstrative_Examples,描述、Observed_Examples Other_Notes Potential_Mitigations、人际关系
2011-06-01 CWE内容团队 主教法冠
更新Common_Consequences
2012-05-11 CWE内容团队 主教法冠
更新Demonstrative_Examples、引用关系
2014-06-23 CWE内容团队 主教法冠
更新Demonstrative_Examples,引用
2014-07-30 CWE内容团队 主教法冠
更新的关系,Taxonomy_Mappings
2017-11-08 CWE内容团队 主教法冠
更新Observed_Examples、人际关系
2020-02-24 CWE内容团队 主教法冠
更新引用关系
2021-03-15 CWE内容团队 主教法冠
更新Potential_Mitigations
2022-04-28 CWE内容团队 主教法冠
更新的关系,Research_Gaps
2023-01-31 CWE内容团队 主教法冠
更新描述
更多的信息是可用的,请选择一个不同的过滤器。
页面最后更新:2023年1月31日