吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2414|回复: 6
收起左侧

[漏洞分析] openssh CVE-2024-6387

  [复制链接]
faqiadegege 发表于 2024-8-21 15:45
前段时间的openssh漏洞,这里根据源码做下分析梳理,参考了发现该漏洞的大佬的blog:https://www.qualys.com/2024/07/01/cve-2024-6387/regresshion.txt

原blog细节分析
Wediscovered a vulnerability (a signal handler race condition) inOpenSSH'sserver (sshd): if a client does not authenticate withinLoginGraceTimeseconds (120 by default, 600 in old OpenSSH versions),thensshd's SIGALRM handler is called asynchronously, but this signalhandlercalls various functions that are not async-signal-safe (forexample,syslog()). This race condition affects sshd in its defaultconfiguration.
我们发现了一个漏洞(信号处理程序竞争条件)OpenSSH的服务器 (sshd):如果客户端未在LoginGraceTime秒(默认为 120 秒,旧版 OpenSSH 为600 秒)进行身份验证,那么 sshd 的 SIGALRM 处理程序被异步调用,但是这个信号处理程序调用各种非异步信号安全的函数(例如例如,syslog())。此竞争条件会影响 sshd 的默认配置。

Oninvestigation, we realized that this vulnerability is in fact aregressionof CVE-2006-5051 ("Signal handler race condition in OpenSSHbefore4.4 allows remote attackers to cause a denial of service (crash),andpossibly execute arbitrary code"), which was reported in 2006 byMarkDowd.
经过调查,我们发现该漏洞实际上是 CVE-2006-5051(“OpenSSH 4.4 之前的版本中的信号处理程序竞争条件允许远程攻击者造成拒绝服务(崩溃))的回归,该漏洞于 2006 年被报告  

Thisregression was introduced in October 2020 (OpenSSH 8.5p1) by commit752250c("revised log infrastructure for OpenSSH"), which accidentallyremovedan "#ifdef DO_LOG_SAFE_IN_SIGHAND" from sigdie(), a functionthatis directly called by sshd's SIGALRM handler.  
此回归是在 2020 年 10 月(OpenSSH8.5p1)通过提交 752250c(“修订的 OpenSSH 日志基础结构”)引入的,它意外地从 sigdie() 中删除了“#ifdefDO_LOG_SAFE_IN_SIGHAND”,该函数由 sshd 的 SIGALRM 处理程序直接调用。  

Inother words: -OpenSSH < 4.4p1 is vulnerable to this signal handler race condition,  if not backport-patched againstCVE-2006-5051, or not patched against  CVE-2008-4109, which was an incorrect fix forCVE-2006-5051;  
换句话说:- 如果没有针对 CVE-2006-5051 进行反向移植修补,或者没有针对CVE-2008-4109进行修补(这是对 CVE-2006-5051 的错误修复),OpenSSH < 4.4p1 容易受到此信号处理程序竞争条件的影响;

-4.4p1 <= OpenSSH < 8.5p1 is not vulnerable to this signal handler race  condition (because the "#ifdefDO_LOG_SAFE_IN_SIGHAND" that was added  to sigdie() by the patch for CVE-2006-5051transformed this unsafe  function into a safe _exit(1) call);  
-4.4p1 <= OpenSSH < 8.5p1 不易受此信号处理程序竞争条件的影响(因为 CVE-2006-5051补丁 “#ifdef DO_LOG_SAFE_IN_SIGHAND”添加到 sigdie() 将此不安全的函数转换为安全的_exit(1) 调用);  

-8.5p1 <= OpenSSH < 9.8p1 is vulnerable again to this signal handler  race condition (because the "#ifdefDO_LOG_SAFE_IN_SIGHAND" was  accidentally removed from sigdie()).
- 8.5p1 <= OpenSSH < 9.8p1 再次易受此信号处理程序竞争条件的影响(因为“#ifdef DO_LOG_SAFE_IN_SIGHAND”被意外从 sigdie()中删除)。

总结分析
这是一个 “信号处理程序竞争条件” 漏洞客户端在LoginGraceTime秒未完成进行身份验证,那么 sshd 的 SIGALRM 处理程序被异步调用,但是这个信号处理程序调用各种非异步信号安全的函数 (例如 ) 客户端在设定的时间内没能完成 身份验证 的话, sshd服务会调用异步处理程序SIGALRM , 该信号用于异步处理程序,但是里面会调用一些非异步信号安全的函数作者找到的时syslog 功能  4.4p1 <= OpenSSH < 8.5p1 不受影响,因为 CVE-2006-5051 补丁在sigdie()中添加了 #ifdef DO_LOG_SAFE_IN_SIGHAND 宏进行了修复 -8.5p1 <= OpenSSH < 9.8p1 受影响,因为在后来的2020年的补丁中,上面的补丁代码被删除了

源码佐证
V4.5P1

上图,4.5P1 sigdie
image.png

V8.6P1
image.png
image.png
上图,V8.6P1,sshsigdie(即,sigdie )
其中的 sshlogv
image.png
继续调用
image.png
image.png

反推信号处理程序的位置
前面源码作证部分,已经看到原blog中提到的版本补丁之后出问题的点:sigdie 函数向上寻找调用
image.png


上图中,sigdir被grace_alarm_handler 调用,很明显该函数参数为 sig,即传入信号再看函数中列出的三段描述

=>登录宽限期到期后警报的信号处理程序   

[C] 纯文本查看 复制代码
/*   
* Try to kill any processes that we have spawned, E.g. authorized   
* keys command helpers.   
*/

=>终止所有的生成的进程,例如,已授权的关键字命令助手  
  
/*XXX pre-format ipaddr/port so we don't need to access active_state */   
/*Log error and exit. */
=>XXX 预格式化ipaddr/port,这样我们就不需要访问 active_state
记录错误并退出
继续向上看调用关系
在文件sshd.c
image.png
image.png

在 main 中,SIGALRM信号触发 了上一张图的 prace_alarm_handler
该信号处理的描述:   
[C] 纯文本查看 复制代码
    /*
     * We don't want to listen forever unless the other side
     * successfully authenticates itself.  So we set up an alarm which is
     * cleared after successful authentication.  A limit of zero
     * indicates no limit. Note that we don't set the alarm in debugging
     * mode; it is just annoying to have the server exit just when you
     * are about to discover the bug.
     */

==>
/*
* 我们不想一直监听,除非另一方
* 成功验证自身身份。因此,我们设置了一个警报,在
* 成功验证身份后会清除该警报。限制为零
* 表示没有限制。请注意,我们不会在调试
* 模式下设置警报;当您
* 即将发现错误时,服务器退出会很烦人。
*/

这里结合grace_alarm_handler 的函数描述,均对应到了原来的 blog 的描述(红色加粗下划线部分内容)
“我们发现了一个漏洞(信号处理程序竞争条件)OpenSSH的服务器 (sshd):如果客户端未在LoginGraceTime 秒(默认为 120 秒,旧版 OpenSSH 为 600 秒)进行身份验证,那么 sshd 的SIGALRM 处理程序被异步调用,但是这个信号处理程序调用各种非异步信号安全的函数(例如例如,syslog())。此竞争条件会影响 sshd 的默认配置”   

[Asm] 纯文本查看 复制代码
max_startups_rate    最大启动速率
max_startups_begin    最大启动初始值
max_startups          最大启动次数
* returns1 if connection should be dropped, 0 otherwise.
* droppingstarts at connection #max_startups_begin with a probability
* of(max_startups_rate/100). the probability increases linearly until
* allconnections are dropped for startups > max_startups返回值1:连接应断开,0连接不断开

断开 从概率为max_startups_rate/100的连接max_startups_begin 开始
概率线性增加,直到启动次数 > max_startups时,所有连接都断开,
image.png

上图,openssh log.c中调用了 syslog.h 中函数 syslog
image.png

上图8.6P1 (宏替代 sigdie ===== sshsigdir(……,0,……)
image.png

上图中,glibc2.36中syslog ===== __syslog_chk()
image.png

上图中,glibc2.36中 __syslog_chk()
image.png

上图中,glibc2.36中 __vsyslog_internal(),其中调用 __logcaltime64_r
image.png
上图中,glibc2.36中 __logcaltime64_r(),调用 __tz_convert()
image.png


上图中,glibc2.36中 __tz_convert()调用 tzset_internal()
image.png

上图中,glibc2.36中 tzset_internal()调用 __tzfile_read()
image.png
image.png


利用可行性原bolg中分析 总结 条件1、 找到一个代码途径,可以在正确的时间节点 sshd 将调用 SIGALRM ,此时sshd会存在异步状态,不一致的状态,在此期间完成利用2、 想办法调用或者访问这个找到的代码途径3、 想办法确定这个中断的时间节点

目前已经有的poc,搭建漏洞版本在测试环境中没有成功,确实这个时间节点是不好卡准的一个因素
当时该漏洞也是引起轩然大波,毕竟一旦利用ssh成功,后果,,,

此笔记只做学习分析用

免费评分

参与人数 1吾爱币 +7 热心值 +1 收起 理由
willJ + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Hmily 发表于 2024-8-21 16:14
格式好乱,我给你清除一下特殊标签,你重新编辑一下,换换行什么的,代码用代码框处理一下吧。
 楼主| faqiadegege 发表于 2024-8-21 19:32
Hmily 发表于 2024-8-21 16:14
格式好乱,我给你清除一下特殊标签,你重新编辑一下,换换行什么的,代码用代码框处理一下吧。

处理完了,感谢
Xiaosesi 发表于 2024-8-22 10:23
msxiaobei 发表于 2024-8-22 15:59
本来以为是个水贴,结果看下来还不错!!
lcg2014 发表于 2024-8-23 10:16
本帖最后由 lcg2014 于 2024-8-23 10:19 编辑

贩卖焦虑,恐慌营销
自从有了杀毒软件公司。病毒越来越多
linuxdev 发表于 2024-8-24 09:49
删除删除#ifdef DO_LOG_SAFE_IN_SIGHAND 是故意的还是不小心的?

感觉不少开源都有意无意的出现,没曝光就是漏洞,曝光就是后门。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-15 07:32

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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