先别急着把这则预警转给同事就完事。如果你所在的企业有工控网段、有Moxa的网管型以太网交换机,那这条“OpenSSH严重漏洞可导致Moxa以太网交换机易受RCE攻击”的消息,就是一次需要立刻动手排查的开工信号。我在接到这类预警时,习惯先把三件事搞清楚:漏洞到底出在哪一环、自己手头哪些设备可能中招、以及就算暂时修不了,怎么把风险按住。这篇文章就按这个顺序来写,把原理、自查、修复和我在实际处置中踩过的坑一并说清楚。
不管你是工厂里的OT运维、负责网络割接的工程师,还是刚接手工控安全的新人,看完这篇至少能知道明天上班该点什么菜单。先说结论:这个漏洞的核心是OpenSSH的一个信号处理竞争条件,可以被远程未认证触发,理论上能走到远程代码执行(RCE);Moxa部分以太网交换机因为内嵌了受影响版本的OpenSSH服务,所以被卷进了这次事件。
1. 事件背景与漏洞核心
1.1 OpenSSH漏洞的来龙去脉
这个漏洞的编号是CVE-2024-6387,还有个广为人知的名字叫regreSSHion。它影响的是OpenSSH 8.5p1到9.7p1这个区间内的版本,官方在9.8p1版本里完成修复。注意“regreSSHion”这个词,它的意思是“回归”——也就是说,这个安全问题不是全新的,而是曾经被修好过,后来在一次版本迭代中不小心又被带了回来。
时间线大概是这样的:2006年,OpenSSH修复了一个类似的信号处理竞争条件漏洞,编号CVE-2006-5051。当时的修复手段是在sshd的信号处理逻辑里加了保护。结果到了2020年,OpenSSH 8.5p1发布时,某次代码重构把旧的脆弱逻辑重新引入,导致这个老问题在2024年被安全研究机构Qualys再次发现并公开。所以你看,安全修复最怕的不是漏洞有多深,而是版本迭代时无意识地把历史问题“复活”。
这类漏洞之所以严重,是因为sshd是OpenSSH的核心服务进程,负责处理所有远程SSH连接。它默认监听在22端口,攻击者不需要任何账号密码,只要网络能访问到这个端口,就能尝试触发漏洞。
1.2 Moxa交换机为何中招
Moxa做的是工业级网络设备,主打以太网交换机、串口服务器、工业无线设备这些。它们的网管型交换机为了满足远程运维需求,出厂通常启用SSH服务,底层跑的是嵌入式Linux系统。问题在于,工业设备的软件栈往往跟随厂商固件一起发布,固件里OpenSSH的版本不会像IT服务器那样频繁更新,所以很容易停留在某个“带病”的版本上。
拿常见的EDS-516A这类网管型交换机来说,它既支持通过Web管理,也支持SSH/CLI管理。一旦固件集成的OpenSSH落在8.5p1到9.7p1的区间内,就等同于把漏洞服务直接暴露给了网络里能触达它的任何主机。更麻烦的是,很多Moxa交换机在项目上线后就不再做例行固件升级,设备一跑就是五六年甚至更久,中间积累的漏洞可不止这一个。
有一点必须强调:并不是所有Moxa交换机都中招。只有那些固件里确实集成了受影响OpenSSH版本的型号才需要紧张,具体型号和对应固件版本要以Moxa官方安全公告为准。排查时别凭感觉猜,一定去查型号和版本号的对应关系。
1.3 攻击路径与影响范围
攻击者的视角很简单粗暴:先扫描到设备IP,发现22端口开着,并且SSH服务返回的版本号落在漏洞区间内,接下来就可以尝试触发漏洞。整个过程不需要认证、不需要会话密钥、不需要任何业务侧的先决条件。
一旦利用成功,后果分两个层级。最低限度是拒绝服务:攻击者反复触发信号竞争导致sshd崩溃,设备会暂时无法进行SSH远程管理。别小看这一点,在工业生产环境里,远程管理通道中断本身就是事故。更高层级是远程代码执行:攻击者在目标设备的上下文里执行任意命令,考虑到Moxa交换机通常运行在整个工控网络的核心位置,这一步就等于拿下了通往生产网段的跳板。
影响范围要从网络边界来理解。Moxa交换机通常部署在控制层网络,一边连着PLC、RTU,另一边连着工程师站、操作员站。如果攻击者控制了交换机,后续横向移动几乎是畅通的。这也是为什么这类OT设备漏洞的评级往往比同级别IT漏洞更让人头疼——因为它处在工业生产的咽喉位置。
2. 漏洞原理深入拆解
2.1 信号处理与异步不安全函数
很多人看到“竞争条件”四个字就犯晕,我用个生活例子拆一下。想象你正坐在工位上处理报表,突然闹钟响了(SIGALRM信号),你一边伸手去按闹钟,一边还在敲键盘保存文件。如果这两个动作同时操作了同一个文件,就可能把文件搞坏。sshd里的情况类似:当客户端连接超时、登录超时或者用户取消认证时,sshd会触发SIGALRM信号;信号处理函数里如果刚好执行了某个“异步信号不安全”的函数,比如syslog日志记录、部分PAM认证逻辑,它就会和主程序正在执行的相同函数发生竞争。
关键在于“异步不安全”这个概念。简单说,有些函数在正常流程里随便调,但在信号处理这种打断式执行的环境里调用,就可能打断主程序正在进行的同类操作,造成数据不一致。OpenSSH这次的问题,就是信号处理函数里调用了这类函数,并且没有做足够的内存保护。
2.2 从崩溃到远程代码执行的关键环节
竞争条件命中之后,直接表现是内存被破坏,可能导致sshd进程崩溃。要把“崩溃”升级成“远程代码执行”,攻击者还需要精心构造触发时序和内存布局,让被破坏的内存区域最终覆盖到指令指针或者关键数据,从而跳转到攻击者指定的代码。
这个过程在技术上有一定门槛,因为要精确命中竞争窗口并在正确的时间点注入数据,需要对目标系统架构、内存分配行为有深入理解。Qualys团队在特定版本的Linux环境下证明了利用是可行的,但对于Moxa这类嵌入式设备,情况会复杂不少——ARM架构、不同的glibc版本、厂商定制化的编译选项都会影响利用成功率。
我在这里故意不展开利用细节,理由很简单:对于绝大多数运维人员来说,知道“这个漏洞可以被利用到RCE”和“利用条件比较苛刻,但绝不能赌它利用不了”就足够了。真正要做的不是研究怎么利用,而是第一时间确认自己设备是否在风险区间里。
2.3 利用难度与真实风险评估
安全圈里有个很不好的倾向:拿到高危漏洞通告先问“好不好用”。在工控场景里,这问题问反了。哪怕这个RCE利用难度再高,单是拒绝服务这一点就足够造成生产事故。我见过不止一次设备sshd崩溃后,现场工程师只能顶着寒风跑去机柜房接串口线重启。
所以我的风险评估建议是三层:第一,如果设备版本在受影响区间,先按最坏情况做应急响应;第二,看网络可达性,如果SSH端口只对管理网段开放,风险相对可控,但要注意管理网段里被攻陷的主机也能成为跳板;第三,看业务容忍度,哪怕设备只用来查看状态,断网几分钟可能都是不可接受的。
这部分的判断不要自己做,参考厂商公告和工控安全评估方法。没有十足把握就一律先按最严重情况处理,OT安全里最忌讳侥幸。
3. 自查与确认流程
3.1 版本判断:登录设备看OpenSSH版本
第一步永远是确认设备固件版本和OpenSSH版本。Moxa不同型号的访问方式有差异,但大体路径是这样的:通过串口或SSH登录到设备CLI后,输入类似show version的命令查看固件版本;部分型号进入系统Shell后,可以直接执行ssh -V查看OpenSSH版本。如果你登录后能拿到命令行Shell,这是最准确的判断方式。
这里有个容易踩的坑:有些设备默认是Web管理界面优先,SSH服务虽然开着,但CLI功能受限。这时候你需要先确认SSH服务确实在监听端口。如果设备连SSH服务都没开,那这个漏洞对你目前不构成直接威胁,但后续启用时要先确保固件已修复。
拿到版本号后,对照OpenSSH官方公告和Moxa安全公告。一方面看固件版本本身有没有修复记录,另一方面看OpenSSH版本是否落在8.5p1到9.7p1之间。两边都要看,因为设备厂商可能在未升级OpenSSH主版本的情况下做了安全补丁回移。
3.2 网络层检测:SSH Banner与指纹识别
如果设备数量多、不方便逐台登录,可以先用网络层的方式快速摸底。最基础的办法是用nc抓取SSH Banner,判断返回的版本信息:
echo "" | nc -w 3 192.168.x.x 22返回内容类似SSH-2.0-OpenSSH_8.9p1这样的字符串。需要提醒的是,banner里的版本号不一定等于真实版本,有些系统会隐藏或伪装版本信息。更可靠的辅助办法是用nmap的脚本做服务指纹收集,比如ssh2-enum-algos可以列出服务端支持的密钥交换算法,再结合算法特征和banner综合判断:
nmap -p22 --script ssh2-enum-algos 192.168.x.x但这种网络层扫描在工控环境里要格外小心。扫描行为本身可能触发工业防火墙的告警,甚至某些老旧的嵌入式设备在端口扫描的高并发连接下会出现CPU飙升。我建议先选定业务低峰期,从管理网段跳板机执行,而不是直接对着所有生产IP段乱扫。还有,利用工具绝对不要在未授权的设备上跑——一方面这是安全红线,另一方面某些验证性利用代码本身就会把sshd打崩,生产设备可经不起这么折腾。
3.3 日志检查与入侵痕迹排查
做完版本和指纹确认后,还要顺手做一次日志排查。重点看两类痕迹:一是异常的海量SSH连接尝试,尤其是短时间内大量连接后立即断开的行为;二是sshd服务反复崩溃重启的记录。在Moxa设备上,可以通过CLI的日志查看命令或者系统日志服务器集中查看。
如果发现上述痕迹,不要只盯着交换机本身,还要延伸到与它互联的PLC、上位机、工程师站。攻击者一旦拿下交换机,下一步通常是扫描同一网段内其他设备。我在之前一次应急处置里就遇到过,交换机被搞崩了,日志里显示尝试从它跳到隔壁的HMI工程师站,幸好HMI设了强密码和访问控制,不然损失就大了。
日志排查的目的不是追责,而是确认是否已经被突破。如果存在可疑痕迹,该断网断网、该取证取证,同时联系设备厂商和应急响应团队。这个动作要快,OT环境里给攻击者的时间窗口越小,后面收拾残局的成本越低。
4. 修复与缓解操作
4.1 设备固件升级路径
修复这件事,厂商的最优解永远是升级固件。先去Moxa官网找到对应产品型号的安全公告页,下载修复后的固件版本。升级前务必备份当前配置,Moxa设备通常支持通过Web界面导出配置文件,或者通过CLI的备份命令完成。
升级过程中有几个细节值得注意:第一,不要在业务高峰时段升级,哪怕设备支持热升级,也要预留故障回退时间;第二,确认设备的双映像功能是否可用,如果支持双固件映像,升级失败后能快速回切;第三,升级完成后立即确认SSH版本和重新配置管理地址——我的经验是,固件升级后部分配置项可能恢复到默认值,最常见的就是管理VLAN和IP地址变回出厂设置,如果现场没人盯着,设备可能直接失联。
升级完成后别急着收工,跑一遍关键功能验证:SSH登录是否正常、Web管理是否可访问、交换机的端口转发和VLAN配置是否还在。很多时候漏的不是漏洞本身,而是升级后没做回归验证,导致业务隔天才发现异常。
4.2 无法立即升级时的缓解措施
现实情况往往是“厂商固件还没出”或者“生产线不能停”,这时候只能做缓解。我的优先级排序是这样的:
第一,用网络ACL或防火墙把SSH访问源限制到管理网段的具体IP。这是见效最快的手段,直接掐断攻击者的网络路径。注意别只限制源网段,要把端口也一并限制,只允许运维跳板机访问。第二,如果管理需求不迫切,可以临时关闭SSH服务,改用串口管理或Web管理(Web管理同时要限制访问源)。第三,调整SSH服务的会话参数,比如缩短LoginGraceTime超时时间,可以降低竞争窗口被命中的概率,但这只是权宜之计,而且参数设置不当会误伤正常登录。
还要补充一点:改SSH端口这类做法,挡得住批量扫描,但挡不住针对性攻击,所以只作为辅助手段,不要当作主要缓解措施来依赖。真正的缓解思路是网络层收敛暴露面,而不是和应用层参数较劲。
我在这个环节踩过一个坑:为了做临时缓解,在交换机上改了ACL,结果忘了加自己的管理IP,导致远程配置保存的时候直接把自己锁在外面,最后只能跑现场串口救回来。所以任何ACL变更都先评估好自己的管理通道会不会受影响,最好保留一条串口或者带外管理路径作为逃生通道。
4.3 同类Linux主机升级OpenSSH参考
这次事件里还有一个常被忽略的群体:运行着CentOS、Alibaba Cloud Linux、openEuler等发行版的Linux主机。它们同样可能运行在受影响的OpenSSH版本上。Moxa设备固件升级属于封闭系统操作,但Linux主机是开放的,可以参考通用升级流程。
最简单的做法是通过系统包管理器升级OpenSSH包:yum update openssh或者dnf update openssh,升级后重启sshd服务即可。如果系统仓库里的版本不足以修复该漏洞,可能需要编译安装新版本。源码编译时需要注意几个点:安装编译依赖、配置编译参数时保留原有PAM和ECDSA支持、编译前备份原有配置和二进制、编译完成后用ssh -V验证版本。源码编译升级最怕的是“升级一时爽,重启两行泪”——老配置文件里某些参数在新版本里已经被废弃,ssh服务会直接起不来。我建议升级前先在新版本环境里做一次配置兼容性检查,用sshd -t命令校验配置。
需要注意,补丁修复要尽量走官方源,不要随便从第三方网站下载编译好的二进制。另外运维LInux服务器时顺带想一下:你手上有没有因为SSH客户端版本过老导致升级后连不上的终端?这个问题在跨版本升级时很常见,治本的办法是让终端也保持更新,或者临时用Web控制台完成迁移。
5. 常见问题与踩坑实录
5.1 扫描器误报与人工复核
很多扫描器是通过抓取SSH Banner判断漏洞的。但banner里的版本号并不等于实际代码版本,可能遇到两种情况:一是设备厂商虽然没改OpenSSH版本号,但通过补丁修复了漏洞;二是某些系统在编译时自定义了版本字符串,把真实版本藏起来了。所以扫描器报“存在CVE-2024-6387”之后,别急着推修复工单,一定要人工复核。
复核的思路是:查设备型号和固件版本的官方公告,确认该版本是否在受影响列表;再结合厂商补丁发布日期判断当前设备是否已经包括修复。如果公告含糊其辞,直接发工单问厂商技术支持,要求给出明确的“是/否受影响”结论。宁可被厂商的技术支持嫌弃,也不要带着误判去动生产设备。
5.2 升级后SSH连不上、配置丢失
升级固件后最常见的反馈是“SSH连不上了”。出现这个问题,先检查三件事:第一,设备管理IP是否因恢复默认配置而变化,这是升级后失联的头号原因;第二,SSH服务是否因新固件默认设置被关闭;第三,客户端known_hosts里的主机密钥是否变化,导致SSH客户端拒绝连接。第三点最容易排查,删除known_hosts里对应的旧条目重新连接即可。
配置丢失是另一个高频问题。有些设备在固件升级时会保留配置,有些则会在某些条件下重置。我的习惯是升级前把配置导出存档,同时截图关键页面。真遇到配置丢失,也不至于靠记忆一点点重新敲。注意恢复配置后要逐项核对SSH、SNMP、VLAN和端口镜像设置,尤其是安全相关配置,别恢复一个旧配置又把漏洞带回来了。
5.3 缓解措施影响正常运维
设置ACL白名单时,总会遇到“限制太死导致出差同事连不上”的问题。这个矛盾无解,只有流程补位:建立临时的审批通道,远程运维必须通过跳板机,跳板机本身做好多因素认证。如果连跳板机都来不及搭,那就退回到串口管理加现场人员的组合,虽然效率低,但至少保证管理行为可控。
另一个被提得很多的缓解手段是把LoginGraceTime改成0。这个参数意思是登录超时时间设为零,看起来可以避免竞争条件触发,但实际也可能导致合法用户的SSH登录直接异常。官方对它的定位只是临时缓解,并不推荐长期启用。我也建议不要在生产环境里擅自调这个参数,如果确实需要调整,先在测试设备上验证对正常登录没有影响。
5.4 其他SSH相关漏洞速查
处理CVE-2024-6387的过程中,顺手把设备上其他SSH相关风险也过一遍是很好的习惯。比如CVE-2002-20001,这是Diffie-Hellman密钥交换协议的资源管理错误漏洞,可能导致SSH服务资源耗尽;再比如CVE-2023-38408,涉及ssh-agent转发过程中的远程代码执行风险。这些漏洞的修复方式和影响面各不相同,但都有一个共同特点:只有在SSH服务暴露给不受信任网络时风险才真正放大。
排查思路是一样的:确认版本、确认厂商补丁、收敛暴露面。如果一次性能把SSH相关的历史欠账清掉,后续再遇到类似漏洞就不会手忙脚乱。工业设备的管理服务本来就是“能不暴露就不暴露”,你每多关一个服务,下一次安全事件里就少一个入口。
至少在这次Moxa交换机的事件里,我个人最大的感受是:设备厂商的固件更新节奏跟安全漏洞的披露速度永远存在时间差,这个时间差里真正保护设备的不是某个神奇配置,而是你早就做好的资产清单和网络分段。平时花半天把设备型号、固件版本、管理端口、访问来源梳理清楚,比漏洞来了再满世界翻文档管用得多。如果你手头连一张像样的OT资产清单都没有,这次事件就是补课的最好时机,别等下一次漏洞公告再被动。