CWE-479: Signal Handler Use of a Non-reentrant Function(信号处理程序使用不可重入函数)

 ID: 479

类型:变量
结构:简单

状态:草稿

描述

程序定义了一个调用不可重入函数的信号处理程序。

扩展描述

不可重入函数是指在第一次调用完成之前不能安全地调用、中断和调用,而不会导致内存损坏的函数。这可能导致意外的系统状态、不可预测的结果,并根据上下文产生各种潜在后果,包括拒绝服务和代码执行。

许多函数是不可重入的,但是如果在信号处理程序中使用它们,其中一些函数可能会导致内存损坏。函数call syslog()就是一个例子。为了执行其功能,它将少量内存分配为“临时空间”。如果Syslog()被信号调用挂起,而信号处理程序调用Syslog(),则这两个函数使用的内存将进入未定义的(可能是可利用的)状态。实现malloc()和free()管理全局结构中的元数据,以便跟踪分配的内存与可用的内存,但它们是不可重入的。同时调用这些函数会导致元数据损坏。

相关视图

与“研究层面”视图(CWE-1000)相关

与“开发层面”视图(CWE-699)相关

引入模式

阶段

说明

架构与设计

 

实现

 

应用平台

语言

C (出现的可能性不确定)

C++ (出现的可能性不确定)

后果

范围

冲击

可能性

完整性
保密性
可利用性

技术冲击: 执行未获授权的代码或命令

通过使用任意写入可能会使执行任意代码成为可能。

 

完整性

技术冲击: 修改应用数据

信后竞争通常会导致数据损坏。

 

被利用的可能性:

示例

例1

在本例中,信号处理程序使用syslog()记录消息:

(问题代码)

 

char *message;
void sh(int dummy) {

syslog(LOG_NOTICE,"%s\n",message);
sleep(10);
exit(0);

}
int main(int argc,char* argv[]) {

...
signal(SIGHUP,sh);
signal(SIGTERM,sh);
sleep(10);
exit(0);

}

如果在调用syslog()后暂停对信号处理程序的第一个调用的执行,并且第二次调用信号处理程序,则syslog()分配的内存将进入未定义的、可能是可利用的状态。

应对措施

阶段: 需求

需要提供可重入功能的语言或库,否则更容易避免这种弱点。

阶段: 架构与设计

设计信号处理程序,只设置标志,而不执行复杂的功能。

阶段: 实现

确保在信号处理程序中找不到不可重入函数。

阶段: 实现

使用健全性检查来减少利用比赛条件的时间窗口。这只是部分解决方案,因为许多攻击可能会失败,但其他攻击仍可能在更窄的窗口内工作,甚至是意外。

有效性: 深度防御

种属

关系

类型

ID

名称

属于

745

CERT C Secure Coding Standard (2008) Chapter 12 - Signals (SIG)

属于

847

The CERT Oracle Secure Coding Standard for Java (2011) Chapter 4 - Expressions (EXP)

属于

879

CERT C++ Secure Coding Section 11 - Signals (SIG)

属于

1001

SFP Secondary Cluster: Use of an Improper API

属于

1166

SEI CERT C Coding Standard - Guidelines 11. Signals (SIG)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值