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 | ||
属于 | 1001 | ||
属于 | 1166 |