背景
2024年7月1日,OpenSSH 官方发布安全通告,披露CVE-2024-6387 OpenSSH Server 远程代码执行漏洞,该漏洞为高危漏洞
在OpenSSH服务器中发现的严重安全漏洞,具体来说,它是一个远程代码执行(Remote Code Execution, RCE)漏洞,且这个漏洞主要影响基于glibc的Linux系统
漏洞细节:
描述了一个在OpenSSH服务器中与信号处理器(SIGALRM)相关的竞态条件。如果客户端在LoginGraceTime(默认120秒,旧版本中为600秒)内未完成认证,sshd的信号处理器会被异步调用,而这个处理器调用了非异步信号安全的函数(如syslog()),导致了问题
历史关联:
提及这个漏洞实际上是CVE-2006-5051的一个回归,该漏洞最早在2006年由Mark Dowd报告。CVE-2006-5051描述的是OpenSSH在4.4版本前存在的信号处理器竞态条件,可能允许远程攻击者造成拒绝服务(崩溃),甚至执行任意代码
漏洞演变:
•介绍漏洞如何随OpenSSH版本变化:
•OpenSSH < 4.4p1版本:如果未打补丁修复CVE-2006-5051或CVE-2008-4109(后者的修复不正确),则存在信号处理器竞态条件的漏洞
•4.4p1 <= OpenSSH < 8.5p1版本:由于CVE-2006-5051补丁中添加了预处理指令#ifdef DO_LOG_SAFE_IN_SIGHAND到sigdie()函数,使得它在信号处理器中成为安全的调用,所以这个时期版本的OpenSSH不受此竞态条件影响
•8.5p1 <= OpenSSH < 9.8p1版本:2020年10月在OpenSSH 8.5p1版本中,由于提交752250c(“修订OpenSSH的日志架构”)意外地去掉了sigdie()函数中的#ifdef DO_LOG_SAFE_IN_SIGHAND预处理指令,导致了信号处理器竞态条件的漏洞再次出现
简而言之,这揭示了一个在OpenSSH服务器端的信号处理器竞态条件漏洞,它在特定版本间存在或消失,与代码变更紧密相关。该漏洞最早在2006年被发现,后被修复,但在后续版本中由于代码改动不当又重新暴露出来。这体现了在复杂软件维护和版本迭代中,对历史安全补丁的持续关注和代码审查的重要性
影响范围
8.5p1 <= OpenSSH < 9.8p1
各系统测试
我们收集了各个操作系统的版本(仅供参考,各自项目需要逐个排查)
目前看下来Ubuntu的问题比较大,我没有Debian系统,Debian应该也有问题
解决方案
1、升级OpenSSH至安全版本9.8及其以上,或者各发行版本的安全修复版本。(建议考虑后者,不要尝试自己去编译新版本部署,会为后续升级及兼容性埋下很大问题)
2、若暂无法升级,建议使用安全组设置OpenSSH端口仅对可信地址开放。
升级脚本
1、检查当前SSH版本信息
ssh -V
2、APT升级到发行版本的安全修复版本
#升级到以下版本9.6p1-3ubuntu13.3,官方已经修复了 -> https://bugs.launchpad.net/ubuntu/+source/openssh/+bug/2070497
#针对Noble Numbat版本:1:9.6p1-3ubuntu13.3
#针对Jammy Jellyfish版本:1:8.9p1-3ubuntu0.10
#检查最新支持版本命令
root@ip-172-31-31-64:/home/ubuntu# apt list --installed | grep ssh
WARNING: apt does not have a stable CLI interface. Use with caution in scripts.
libssh-4/noble,now 0.10.6-2build2 amd64 [installed,automatic]
openssh-client/noble-updates,noble-security,now 1:9.6p1-3ubuntu13.3 amd64 [installed,automatic]
openssh-server/noble-updates,noble-security,now 1:9.6p1-3ubuntu13.3 amd64 [installed]
openssh-sftp-server/noble-updates,noble-security,now 1:9.6p1-3ubuntu13.3 amd64 [installed]
ssh-import-id/noble,now 5.11-0ubuntu2 all [installed]
3、APT升级
#使用apt包管理器来安装或升级openssh-server和相关依赖包。如果你的系统中已经安装了OpenSSH,这一步会将其升级到最新版本
sudo apt install openssh-server
4、检查版本
升级完成后,检查OpenSSH的版本以确认升级成功。
5、验证服务状态
确保OpenSSH服务正在运行。
sudo systemctl status sshd
#EXAMPLE FOR ANSBILE,
- name: Check OpenSSH version dynamically based on available package manager
hosts: all
tasks:
- name: Detect package manager and check OpenSSH version
block:
- name: Check if rpm command exists
command: which rpm
register: rpm_check
ignore_errors: yes
changed_when: false
- name: Check if apt-cache command exists
command: which apt-cache
register: apt_cache_check
ignore_errors: yes
changed_when: false
when: rpm_check.rc != 0
- name: Check OpenSSH version using rpm
shell: "rpm -q openssh-server"
register: ssh_version
when: rpm_check.rc == 0
- name: Check OpenSSH version using apt-cache
shell: "apt-cache policy openssh-server | grep Installed"
register: ssh_version
when: apt_cache_check.rc == 0
changed_when: false
failed_when: "'Installed:' not in ssh_version.stdout"
always:
- name: Output OpenSSH version
debug:
msg: "OpenSSH version is {{ ssh_version.stdout | regex_replace('.*:', '').strip() }}"
when: ssh_version is defined and ssh_version.stdout