请选择 进入手机版 | 继续访问电脑版

专注代码检测 - 阅镜

 找回密码
 立即注册
热搜: 安装 代码
查看: 118|回复: 0

注意signal handler导致的条件竞争

[复制链接]

70

主题

70

帖子

232

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
232
发表于 2021-9-10 19:59:06 | 显示全部楼层 |阅读模式
竞争条件经常出现在信号处理程序中,因为信号处理程序支持异步操作。攻击者能够利用信号处理程序争用条件导致软件状态损坏,从而可能导致拒绝服务甚至代码执行。

当信号处理程序中发生不可重入函数或状态敏感操作时,就会出现这些问题。因为信号处理程序中随时可以被调用。比如,当在信号处理程序中调用 free 时,通常会出现另一个信号争用条件,从而导致双重释放。即使给定指针在释放后设置为 NULL ,在释放内存和将指针设置为 NULL 之间仍然存在竞争的可能。
为多个信号设置了相同的信号处理程序,这尤其有问题——因为这意味着信号处理程序本身可能会重新进入。例如,malloc()和free()是不可重入的,因为它们可能使用全局或静态数据结构来管理内存,并且它们被syslog()等看似无害的函数间接使用;这些函数可能会导致内存损坏和代码执行。
  1. // Bad
  2. char *log_message;

  3. void Handler(int signum) {
  4.   syslog(LOG_NOTICE, "%s\n", log_m_essage);
  5.   free(log_message);
  6.   sleep(10);
  7.   exit(0);
  8. }

  9. int main (int argc, char* argv[]) {
  10.   log_message = strdup(argv[1]);
  11.   signal(SIGHUP, Handler);
  12.   signal(SIGTERM, Handler);
  13.   sleep(10);
  14. }
复制代码

可以借由下列操作规避问题:

避免在多个处理函数中共享某些变量。
在信号处理程序中使用同步操作。
屏蔽不相关的信号,从而提供原子性。
避免在信号处理函数中调用不满足异步信号安全的函数。

关联漏洞:
  1.   高风险-内存破坏

  2.   中风险-逻辑问题
复制代码
回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies |上传

本版积分规则

QQ|Archiver|手机版|小黑屋| 阅镜 ( 京ICP备2020034574号 )|网站地图|网站地图点击这里给我发消息

GMT+8, 2022-1-17 09:38 , Processed in 0.069265 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表