游客发表
2023年12月,序列Nacos被曝出一个反序列化漏洞,化高编号CVE-2023-49145,危漏CVSS评分9.8。序列攻击者无需登录,化高构造一个特定请求就能在目标服务器上执行任意代码。危漏这不是序列Nacos第一次出这类问题,但这次的化高利用门槛低到离谱——只要你的Nacos暴露在公网,基本等于把服务器钥匙插在门上。危漏
Nacos是序列阿里开源的配置中心和注册中心,国内用它的化高公司多如牛毛。Spring Cloud Alibaba体系里它几乎是危漏默认选项。问题出在Nacos的序列Jraft模块,具体是化高com.alibaba.nacos.core.raft包下的请求处理逻辑。攻击者可以向/nacos/v1/core/raft/相关接口发送恶意序列化数据,危漏服务端反序列化时触发readObject方法,进而加载远程类或执行本地命令。
Nacos的Jraft通信层使用了Hessian序列化。Hessian本身不是原罪,问题在于Nacos没有对反序列化的类做白名单校验。攻击者可以构造一个恶意的Hessian序列化流,里面塞入类似TemplatesImpl或JdbcRowSetImpl这类利用链。服务端一执行readObject,代码就跑了。
我看了下GitHub上的补丁,官方在RaftCore里加了一个ClassFilter,限制反序列化的类必须来自com.alibaba.nacos包。这个修复方案不算优雅,但能挡住大部分利用。问题是,补丁只打在了2.3.0及以上版本。2.2.x和1.x系列的用户,得自己想办法。
我拿一个测试环境复现了一下。Nacos 2.2.3,默认端口8848,Jraft端口7848。用ysoserial生成一个Hessian payload,直接往/nacos/v1/core/raft/发POST请求。不到两秒,服务器上弹出一个计算器。整个过程不需要任何认证信息。
更麻烦的是,很多公司的Nacos是内网部署,但内网不等于安全。攻击者一旦通过钓鱼或弱口令进了内网,这个漏洞就是横向移动的跳板。Nacos通常连着数据库、配置中心、微服务注册表,拿下它等于拿下了整个微服务架构的控制权。
升级到2.3.0或更高版本。如果暂时升不了,把Nacos的Jraft端口从公网撤下来,加防火墙规则只允许特定IP访问。再不行,就在JVM启动参数里加-Dnacos.raft.serialization.whitelist=com.alibaba.nacos,手动限制反序列化类。这个参数在2.2.x上有效,但官方没怎么宣传。
另外,检查一下你的Nacos有没有开鉴权。默认情况下nacos.core.auth.enabled是false。开了鉴权虽然不能完全挡住这个漏洞,但至少能增加利用难度。很多团队部署完Nacos就直接用,鉴权、TLS、网络隔离一个都没配。这次漏洞算是给这些人提了个醒。
最后说个细节。Nacos的GitHub issue里,有人反馈说升级到2.3.0后Jraft集群不稳定,频繁选举。官方后来发了2.3.1修复。所以别急着升2.3.0,直接上2.3.1或2.3.2。这种边升级边踩坑的事,在开源中间件里太常见了。
友情链接