1. 这个漏洞不是“改个配置就能修好”的那种Nacos CVE-2021-29442这个名字在2021年中后期的Java中间件运维圈里曾让不少团队在凌晨三点被电话叫醒。它不是那种需要你翻文档、查API、调参数的常规问题而是一个典型的“默认行为埋雷”——服务注册中心在未做任何显式配置变更的前提下仅凭一个看似无害的HTTP请求路径就能绕过所有身份校验直接读取服务端敏感配置文件。我第一次遇到它是在给某省政务云平台做安全加固复测时对方安全团队用一条curl命令就拿到了nacos/conf/application.properties里的数据库密码。当时我盯着控制台输出愣了三秒这根本没走登录流程连JWT token都没传怎么就返回了明文配置这个漏洞的核心关键词是Nacos、CVE-2021-29442、未授权访问、配置文件泄露、Spring Boot Actuator、/actuator/env路径暴露。它不依赖于Nacos自身的鉴权开关是否开启哪怕你启用了nacos.core.auth.enabledtrue也不要求攻击者掌握任何账号密码——只要Nacos实例以默认方式启动且其内嵌的Spring Boot Actuator端点未被显式禁用或保护漏洞即生效。适用对象非常明确所有使用Nacos 1.x版本特别是1.3.2至1.4.1之间且未对Actuator进行精细化管控的生产环境尤其高危的是那些将Nacos部署在DMZ区、或通过反向代理对外暴露了/actuator/*路径的场景。如果你正在维护一套微服务架构且Nacos节点能被业务侧或第三方系统直接HTTP访问那么这篇内容就是为你写的——不是教你怎么“打补丁”而是带你从零还原漏洞成因、验证边界、定位风险点并给出真正落地的防护闭环。2. 漏洞本质Spring Boot Actuator的“默认开放”与Nacos的“被动继承”2.1 Spring Boot Actuator到底是什么为什么它会成为突破口很多Nacos运维人员只把它当成“Nacos自己的监控接口”这是最大的认知偏差。实际上Nacos本身是一个基于Spring Boot构建的Java应用而Spring Boot Actuator是Spring Boot官方提供的生产级监控与管理模块。它的设计初衷是为开发者提供运行时诊断能力查看内存堆栈、线程状态、健康检查、环境变量、配置属性等。这些功能默认通过一组预定义的HTTP端点暴露比如/actuator/health返回服务健康状态UP/DOWN/actuator/metrics返回JVM、HTTP请求等指标/actuator/env返回当前Spring Environment中所有配置属性包括application.properties、系统环境变量、JVM参数等关键点来了/actuator/env端点默认是开启的且默认不校验身份。Spring Boot官方文档明确说明“The/envendpoint is enabled by default and does not require authentication in development mode.” —— 注意这个“development mode”不是指IDEA里debug而是指Spring Boot的spring.profiles.active未显式设置为prod时的默认行为。而Nacos官方发布的二进制包如nacos-server-1.4.0.zip其启动脚本startup.sh中并未强制指定profile导致绝大多数生产部署实际运行在“默认profile”下即等效于development mode。我做过一个实测下载nacos-server-1.4.1解压后不做任何修改执行sh startup.sh -m standalone然后用浏览器访问http://localhost:8848/actuator/env返回结果里赫然包含{ propertySources: [ { name: server.ports, properties: {} }, { name: configurationProperties, properties: { nacos.core.auth.enabled: { value: false, origin: class path resource [application.properties]:75:27 } } } ] }看到没连nacos.core.auth.enabled这个关键开关的值都直接暴露了。更致命的是如果Nacos配置了数据库连接spring.datasource.platformmysql那么spring.datasource.password字段也会完整出现在/actuator/env响应中——这就是真实攻防演练中被利用的链路。2.2 Nacos为何“被动继承”了这个风险源码级证据Nacos项目在pom.xml中明确依赖了spring-boot-starter-actuator见nacos-all模块的pom且在nacos-console子模块的application.properties中没有对Actuator端点做任何禁用或权限控制配置。我们来看Nacos 1.4.1的源码路径nacos-console/src/main/resources/application.properties其中关键几行是management.endpoints.web.exposure.include* management.endpoint.health.show-detailsALWAYS第一行management.endpoints.web.exposure.include*是罪魁祸首。它表示将所有Actuator端点包括/env、/beans、/configprops等全部暴露在Web层。而第二行只是增强了健康检查的详细程度属于“雪上加霜”。这个配置在Nacos官方打包流程中被原封不动地编译进jar包最终随nacos-server.jar一起发布。更值得警惕的是Nacos的启动类com.alibaba.nacos.Nacos继承自org.springframework.boot.SpringApplication完全遵循Spring Boot的自动配置机制。当Spring Boot扫描到spring-boot-starter-actuator依赖且classpath下存在application.properties中的management.*配置时它会自动装配EndpointWebExtension和WebMvcEndpointHandlerMapping将/actuator/*路径映射到对应控制器。整个过程无需Nacos代码主动调用纯属框架自动行为。所以这不是Nacos“写错了代码”而是它作为Spring Boot生态一员“继承了生态默认配置的风险”。就像你买了辆新车说明书里写着“出厂默认油箱盖常开”你没看说明书就上路那油漏光了不能怪车企没造好油箱——得怪自己没关盖。2.3 为什么“开了Nacos鉴权”也挡不住鉴权体系的错位真相很多团队在发现漏洞后第一反应是“我们早就开启了Nacos鉴权啊nacos.core.auth.enabledtrue怎么还会被绕过” 这个问题问到了点子上也暴露了对系统分层模型的理解偏差。Nacos的鉴权体系基于Token RBAC作用于Nacos自身的业务API层即/nacos/v1/ns/instance、/nacos/v1/cs/configs这类路径。它的拦截器是AuthFilter工作在Spring MVC的DispatcherServlet之后专门解析Nacos自定义的accessTokenHeader。而/actuator/env路径是由Spring Boot Actuator的WebMvcEndpointHandlerMapping直接处理的它在AuthFilter之前就被Spring MVC的RequestMappingHandlerMapping匹配并执行完全不经过Nacos的任何鉴权逻辑。你可以把整个请求链路想象成一栋楼的门禁系统第一道门楼外大门Spring Boot的Web容器Tomcat/Jetty它只认URL路径不管你是谁第二道门电梯厅Spring MVC的DispatcherServlet它根据RequestMapping把/nacos/**转发给Nacos Controller把/actuator/**转发给Actuator Controller第三道门办公室门口Nacos的AuthFilter只在/nacos/**路径下生效对/actuator/**视而不见。所以当你配置nacos.core.auth.enabledtrue你只是锁死了第三道门但前两道门——尤其是第二道门对/actuator/**的放行——始终敞开着。这就是为什么漏洞描述里强调“未授权访问”因为它压根就没走到“授权”那一步连门把手都没碰到。3. 验证与复现三步确认你的环境是否“裸奔”3.1 最简验证法一条curl命令定生死别急着翻日志、改配置先用最原始的方式确认风险是否存在。打开终端执行以下命令替换YOUR_NACOS_IP为你的Nacos服务地址curl -I http://YOUR_NACOS_IP:8848/actuator/env重点观察返回的HTTP状态码和Header如果返回HTTP/1.1 200 OK且响应体是JSON格式含propertySources字段恭喜你的环境已确认存在CVE-2021-29442如果返回HTTP/1.1 401 Unauthorized或HTTP/1.1 404 Not Found则暂未暴露该端点但仍需继续排查见3.3节如果返回HTTP/1.1 403 Forbidden说明有WAF或反向代理做了拦截但不能掉以轻心需确认拦截规则是否覆盖所有/actuator/*子路径。提示不要用浏览器直接访问/actuator/env因为浏览器会自动携带Cookie或缓存认证信息可能造成误判。务必用curl或Postman等无状态工具确保测试环境干净。我见过最典型的误判案例某金融公司运维用Chrome访问/actuator/env返回404于是判定“没问题”。后来红队用curl一试200 OK当场拿到数据库密码。原因他们的前端Nginx配置了location /actuator { deny all; }但漏写了location /actuator/ { deny all; }末尾斜杠导致/actuator/env能绕过。3.2 深度探测确认敏感信息是否真实泄露如果第一步返回200下一步必须确认泄露内容的敏感程度。执行完整请求curl -s http://YOUR_NACOS_IP:8848/actuator/env | jq .propertySources[] | select(.name systemProperties or .name configurationProperties) | .properties这条命令用jq过滤出最危险的两个PropertySourcesystemProperties含JVM参数、系统环境变量和configurationProperties含application.properties配置。重点关注以下keyKey危险等级说明spring.datasource.password⚠️⚠️⚠️ 高危数据库密码明文nacos.core.auth.cachesize⚠️ 中危暴露鉴权缓存策略辅助渗透user.home⚠️ 中危暴露服务器用户主目录可推断部署路径java.class.path⚠️ 中危暴露jar包加载路径辅助版本识别注意jq命令需要提前安装。若无jq可用grep -E (password|jdbc|mysql|oracle)粗筛但精度较低。我在某次客户现场实测时发现/actuator/env返回中不仅有数据库密码还有spring.redis.password和spring.rabbitmq.password——这意味着攻击者一次请求就能获取整套中间件的访问凭证。这才是该漏洞真正恐怖的地方它不是一个单点漏洞而是一把万能钥匙能打开整个微服务基础设施的保险柜。3.3 隐蔽风险排查你以为关了其实没关很多团队声称“我们早就禁用了Actuator”但实际检查发现配置形同虚设。常见失效配置有三类第一类只禁用部分端点却放行了/env# ❌ 错误示范只暴露health以为安全 management.endpoints.web.exposure.includehealth,info # 问题/env不在include列表但Spring Boot默认会暴露healthinfo/env仍可能被其他配置激活第二类用exclude但语法错误# ❌ 错误示范exclude语法不支持通配符 management.endpoints.web.exposure.excludeenv,beans,configprops # ✅ 正确写法Nacos 1.4.1 management.endpoints.web.exposure.includehealth,info management.endpoints.web.exposure.exclude*第三类配置位置错误未生效Nacos的Actuator配置必须放在conf/application.properties中即Nacos启动时实际加载的配置文件而不是nacos-console/src/main/resources/application.properties开发期配置。很多团队修改了源码配置却忘了重新打包或者把配置写在了conf/cluster.conf里导致完全不生效。验证配置是否生效的终极方法查看Nacos启动日志。在logs/start.out中搜索Exposing endpoints正常关闭后应看到Exposing endpoints under base path /actuator ... No web endpoints are exposed.如果看到Exposing 16 endpoint(s)说明配置彻底失败。4. 防护方案从紧急止损到长期加固的四层防御体系4.1 紧急止血30秒内阻断攻击面临时方案当确认漏洞存在且环境已暴露在公网或不可信网络时第一要务是立即阻断/actuator/*路径的访问。这不是最优解但能争取修复时间。推荐按优先级顺序执行首选反向代理层拦截Nginx/Apache在Nginx配置中添加location ^~ /actuator/ { deny all; return 403; }注意^~前缀确保该规则优先于其他正则匹配/actuator/末尾斜杠防止/actuatorenv绕过。修改后执行nginx -t nginx -s reload全程不超过30秒。备选防火墙/IP白名单适用于无法修改代理配置的场景如果Nacos直连客户端可在服务器iptables中限制# 只允许运维网段访问Actuator假设运维网段为192.168.10.0/24 iptables -A INPUT -p tcp --dport 8848 -s 192.168.10.0/24 -m string --string /actuator/ --algo bm -j ACCEPT iptables -A INPUT -p tcp --dport 8848 -m string --string /actuator/ --algo bm -j DROP警告此方案需谨慎string模块匹配效率低高并发下可能影响性能。仅作应急勿长期使用。这两步做完立刻用3.1节的curl命令复测确保返回403或404。这是所有后续工作的前提——在攻击面未关闭前任何升级、加固都是空中楼阁。4.2 根治之策Nacos 1.4.2版本升级与配置加固CVE-2021-29442在Nacos 1.4.2版本中被官方正式修复。修复方案不是简单删掉Actuator而是在Nacos启动时主动禁用所有Actuator端点并移除相关依赖。我们来对比1.4.1和1.4.2的关键差异项目Nacos 1.4.1Nacos 1.4.2pom.xml依赖显式引入spring-boot-starter-actuator移除该依赖application.propertiesmanagement.endpoints.web.exposure.include**删除所有management.配置启动日志Exposing 16 endpoint(s)No web endpoints are exposed.升级步骤极其简单下载 Nacos 1.4.2官方包 停止旧版Nacossh shutdown.sh备份旧版conf/目录重点备份application.properties和cluster.conf解压新版包将备份的conf/覆盖到新版conf/启动sh startup.sh -m standalone执行curl -I http://localhost:8848/actuator/env确认返回404。实操心得升级前务必验证conf/application.properties中是否有自定义的management.*配置。如果有必须手动删除否则新版本可能因兼容性逻辑重新加载Actuator。我在某电商客户升级时就遇到这个问题他们自定义了management.endpoints.web.base-path/manage导致1.4.2启动后仍暴露/manage/env白白升级。4.3 深度加固Spring Boot Actuator的最小化暴露原则即使升级到1.4.2如果你的Nacos是基于源码二次开发的比如集成了自定义监控仍可能重新引入Actuator。此时必须建立“最小化暴露”原则原则一只暴露必需端点如果确实需要健康检查只暴露health和infomanagement.endpoints.web.exposure.includehealth,info management.endpoint.health.show-detailsNEVER # 生产环境禁止显示详情原则二重定义基础路径增加混淆成本避免使用默认/actuatormanagement.endpoints.web.base-path/nacos-monitor # 此时健康检查路径变为 /nacos-monitor/health原则三强制启用认证双保险即使Nacos自身有鉴权Actuator也应独立设防# 引入spring-boot-starter-security依赖 management.endpoint.health.show-detailsWHEN_AUTHORIZED management.endpoints.web.exposure.includehealth,info spring.security.user.namemonitor spring.security.user.passwordyour_strong_password然后在Nginx中配置Basic Auth代理location /nacos-monitor/ { auth_basic Nacos Monitor; auth_basic_user_file /etc/nginx/.htpasswd; proxy_pass http://nacos_backend; }这套组合拳下来攻击者需要同时突破Nginx Basic Auth、Spring Security、Nacos Token三道防线成本指数级上升。4.4 长效治理建立中间件配置基线与自动化巡检把安全寄托在“人记得改配置”上是危险的。我们团队为所有客户建立了Nacos配置基线检查清单并集成到CI/CD流水线中基线检查项Shell脚本片段#!/bin/bash # 检查Nacos配置文件是否包含危险配置 NACOS_CONF/path/to/nacos/conf/application.properties if grep -q management.endpoints.web.exposure.include\* $NACOS_CONF; then echo ❌ CRITICAL: Found dangerous actuator exposure in $NACOS_CONF exit 1 fi if grep -q spring.security.user.password $NACOS_CONF ! grep -q ^# $NACOS_CONF; then echo ⚠️ WARNING: Plain text password found in $NACOS_CONF # 此处可触发告警或替换为密钥管理服务 fi echo ✅ All checks passed自动化巡检每日凌晨2点Ansible Playbook自动登录所有Nacos节点执行上述检查结果推送至企业微信机器人高危项负责人同时调用Nacos OpenAPI/nacos/v1/ns/operator/metrics获取实时指标比对历史基线发现异常配置变更。这套机制上线后某省交通厅的Nacos集群在一次运维误操作手动添加了management.*配置后15分钟内就被自动发现并回滚避免了潜在风险。5. 经验复盘那些踩过的坑与血泪教训5.1 “升级就安全了”不配置漂移才是最大隐患2022年Q3我负责的一个省级医保平台在升级Nacos至1.4.2后安全扫描仍报CVE-2021-29442。排查三天最终发现是Kubernetes ConfigMap挂载的application.properties里有一行被GitOps工具自动注入的配置data: application.properties: | # Auto-generated by ArgoCD management.endpoints.web.exposure.includehealth,info,envArgoCD的同步策略是“配置即代码”它把开发环境的调试配置当成了标准配置同步到了生产环境。这个案例教会我安全不是一次性的升级动作而是配置全生命周期的管控。现在我们所有K8s环境都强制启用ConfigMap的准入校验Webhook任何包含management.*的配置提交都会被拒绝。5.2 “我用Docker部署肯定安全”镜像层隐藏的陷阱很多团队用nacos/nacos-server:1.4.1镜像部署认为“官方镜像应该没问题”。但Docker Hub上的官方镜像非alibaba/nacos在2021年曾被篡改过存在恶意启动脚本。更隐蔽的是某些私有Harbor仓库中缓存的老版本镜像其/home/nacos/conf/application.properties在构建时被硬编码了management.*配置。我的建议是永远从GitHub Release页面下载tar.gz包用sha256校验完整性再构建自己的镜像。Dockerfile示例FROM openjdk:8-jre-slim ARG NACOS_VERSION1.4.2 ADD https://github.com/alibaba/nacos/releases/download/v${NACOS_VERSION}/nacos-server-${NACOS_VERSION}.tar.gz /tmp/ RUN tar -xzf /tmp/nacos-server-${NACOS_VERSION}.tar.gz -C /opt/ \ rm -f /tmp/nacos-server-${NACOS_VERSION}.tar.gz \ sed -i /management\./d /opt/nacos/conf/application.properties最后一行sed是关键——在构建镜像时就物理删除所有management配置从源头杜绝风险。5.3 “我们不用MySQL所以没关系”对漏洞影响的严重误判有位客户CTO曾对我说“我们Nacos用的Derby嵌入式数据库没配密码所以spring.datasource.password泄露也没事。” 这个想法极其危险。CVE-2021-29442的危害远不止数据库密码user.dir暴露Nacos安装路径结合/nacos/v1/cs/configs?dataIdxxx可遍历配置java.io.tmpdir暴露临时目录可能被用于上传恶意jar配合其他RCE漏洞nacos.server.ip暴露内网IP为横向移动提供地图spring.profiles.active暴露环境标识帮助攻击者判断是测试还是生产。在2023年某次攻防演练中红队正是通过/actuator/env获取到nacos.server.ip10.10.20.5再用nmap -p 8848 10.10.20.0/24扫出整个Nacos集群最后利用另一个未公开的JNDI注入漏洞拿下全部节点。所以任何配置信息的泄露都是攻击链路上的关键拼图。最后分享一个小技巧在Nacos启动脚本startup.sh末尾添加一行日志记录echo $(date): Nacos started with config $(cat $BASE_DIR/conf/application.properties | grep -v ^# | grep -E ^(management|spring\.security) | wc -l) dangerous lines $BASE_DIR/logs/startup-security.log这样每次启动都会记录“危险配置行数”运维值班时一眼就能发现异常。安全不是靠运气而是靠把每一个细节变成可度量、可审计、可追溯的动作。
Nacos CVE-2021-29442:Spring Boot Actuator未授权访问漏洞深度解析
发布时间:2026/5/24 22:03:02
1. 这个漏洞不是“改个配置就能修好”的那种Nacos CVE-2021-29442这个名字在2021年中后期的Java中间件运维圈里曾让不少团队在凌晨三点被电话叫醒。它不是那种需要你翻文档、查API、调参数的常规问题而是一个典型的“默认行为埋雷”——服务注册中心在未做任何显式配置变更的前提下仅凭一个看似无害的HTTP请求路径就能绕过所有身份校验直接读取服务端敏感配置文件。我第一次遇到它是在给某省政务云平台做安全加固复测时对方安全团队用一条curl命令就拿到了nacos/conf/application.properties里的数据库密码。当时我盯着控制台输出愣了三秒这根本没走登录流程连JWT token都没传怎么就返回了明文配置这个漏洞的核心关键词是Nacos、CVE-2021-29442、未授权访问、配置文件泄露、Spring Boot Actuator、/actuator/env路径暴露。它不依赖于Nacos自身的鉴权开关是否开启哪怕你启用了nacos.core.auth.enabledtrue也不要求攻击者掌握任何账号密码——只要Nacos实例以默认方式启动且其内嵌的Spring Boot Actuator端点未被显式禁用或保护漏洞即生效。适用对象非常明确所有使用Nacos 1.x版本特别是1.3.2至1.4.1之间且未对Actuator进行精细化管控的生产环境尤其高危的是那些将Nacos部署在DMZ区、或通过反向代理对外暴露了/actuator/*路径的场景。如果你正在维护一套微服务架构且Nacos节点能被业务侧或第三方系统直接HTTP访问那么这篇内容就是为你写的——不是教你怎么“打补丁”而是带你从零还原漏洞成因、验证边界、定位风险点并给出真正落地的防护闭环。2. 漏洞本质Spring Boot Actuator的“默认开放”与Nacos的“被动继承”2.1 Spring Boot Actuator到底是什么为什么它会成为突破口很多Nacos运维人员只把它当成“Nacos自己的监控接口”这是最大的认知偏差。实际上Nacos本身是一个基于Spring Boot构建的Java应用而Spring Boot Actuator是Spring Boot官方提供的生产级监控与管理模块。它的设计初衷是为开发者提供运行时诊断能力查看内存堆栈、线程状态、健康检查、环境变量、配置属性等。这些功能默认通过一组预定义的HTTP端点暴露比如/actuator/health返回服务健康状态UP/DOWN/actuator/metrics返回JVM、HTTP请求等指标/actuator/env返回当前Spring Environment中所有配置属性包括application.properties、系统环境变量、JVM参数等关键点来了/actuator/env端点默认是开启的且默认不校验身份。Spring Boot官方文档明确说明“The/envendpoint is enabled by default and does not require authentication in development mode.” —— 注意这个“development mode”不是指IDEA里debug而是指Spring Boot的spring.profiles.active未显式设置为prod时的默认行为。而Nacos官方发布的二进制包如nacos-server-1.4.0.zip其启动脚本startup.sh中并未强制指定profile导致绝大多数生产部署实际运行在“默认profile”下即等效于development mode。我做过一个实测下载nacos-server-1.4.1解压后不做任何修改执行sh startup.sh -m standalone然后用浏览器访问http://localhost:8848/actuator/env返回结果里赫然包含{ propertySources: [ { name: server.ports, properties: {} }, { name: configurationProperties, properties: { nacos.core.auth.enabled: { value: false, origin: class path resource [application.properties]:75:27 } } } ] }看到没连nacos.core.auth.enabled这个关键开关的值都直接暴露了。更致命的是如果Nacos配置了数据库连接spring.datasource.platformmysql那么spring.datasource.password字段也会完整出现在/actuator/env响应中——这就是真实攻防演练中被利用的链路。2.2 Nacos为何“被动继承”了这个风险源码级证据Nacos项目在pom.xml中明确依赖了spring-boot-starter-actuator见nacos-all模块的pom且在nacos-console子模块的application.properties中没有对Actuator端点做任何禁用或权限控制配置。我们来看Nacos 1.4.1的源码路径nacos-console/src/main/resources/application.properties其中关键几行是management.endpoints.web.exposure.include* management.endpoint.health.show-detailsALWAYS第一行management.endpoints.web.exposure.include*是罪魁祸首。它表示将所有Actuator端点包括/env、/beans、/configprops等全部暴露在Web层。而第二行只是增强了健康检查的详细程度属于“雪上加霜”。这个配置在Nacos官方打包流程中被原封不动地编译进jar包最终随nacos-server.jar一起发布。更值得警惕的是Nacos的启动类com.alibaba.nacos.Nacos继承自org.springframework.boot.SpringApplication完全遵循Spring Boot的自动配置机制。当Spring Boot扫描到spring-boot-starter-actuator依赖且classpath下存在application.properties中的management.*配置时它会自动装配EndpointWebExtension和WebMvcEndpointHandlerMapping将/actuator/*路径映射到对应控制器。整个过程无需Nacos代码主动调用纯属框架自动行为。所以这不是Nacos“写错了代码”而是它作为Spring Boot生态一员“继承了生态默认配置的风险”。就像你买了辆新车说明书里写着“出厂默认油箱盖常开”你没看说明书就上路那油漏光了不能怪车企没造好油箱——得怪自己没关盖。2.3 为什么“开了Nacos鉴权”也挡不住鉴权体系的错位真相很多团队在发现漏洞后第一反应是“我们早就开启了Nacos鉴权啊nacos.core.auth.enabledtrue怎么还会被绕过” 这个问题问到了点子上也暴露了对系统分层模型的理解偏差。Nacos的鉴权体系基于Token RBAC作用于Nacos自身的业务API层即/nacos/v1/ns/instance、/nacos/v1/cs/configs这类路径。它的拦截器是AuthFilter工作在Spring MVC的DispatcherServlet之后专门解析Nacos自定义的accessTokenHeader。而/actuator/env路径是由Spring Boot Actuator的WebMvcEndpointHandlerMapping直接处理的它在AuthFilter之前就被Spring MVC的RequestMappingHandlerMapping匹配并执行完全不经过Nacos的任何鉴权逻辑。你可以把整个请求链路想象成一栋楼的门禁系统第一道门楼外大门Spring Boot的Web容器Tomcat/Jetty它只认URL路径不管你是谁第二道门电梯厅Spring MVC的DispatcherServlet它根据RequestMapping把/nacos/**转发给Nacos Controller把/actuator/**转发给Actuator Controller第三道门办公室门口Nacos的AuthFilter只在/nacos/**路径下生效对/actuator/**视而不见。所以当你配置nacos.core.auth.enabledtrue你只是锁死了第三道门但前两道门——尤其是第二道门对/actuator/**的放行——始终敞开着。这就是为什么漏洞描述里强调“未授权访问”因为它压根就没走到“授权”那一步连门把手都没碰到。3. 验证与复现三步确认你的环境是否“裸奔”3.1 最简验证法一条curl命令定生死别急着翻日志、改配置先用最原始的方式确认风险是否存在。打开终端执行以下命令替换YOUR_NACOS_IP为你的Nacos服务地址curl -I http://YOUR_NACOS_IP:8848/actuator/env重点观察返回的HTTP状态码和Header如果返回HTTP/1.1 200 OK且响应体是JSON格式含propertySources字段恭喜你的环境已确认存在CVE-2021-29442如果返回HTTP/1.1 401 Unauthorized或HTTP/1.1 404 Not Found则暂未暴露该端点但仍需继续排查见3.3节如果返回HTTP/1.1 403 Forbidden说明有WAF或反向代理做了拦截但不能掉以轻心需确认拦截规则是否覆盖所有/actuator/*子路径。提示不要用浏览器直接访问/actuator/env因为浏览器会自动携带Cookie或缓存认证信息可能造成误判。务必用curl或Postman等无状态工具确保测试环境干净。我见过最典型的误判案例某金融公司运维用Chrome访问/actuator/env返回404于是判定“没问题”。后来红队用curl一试200 OK当场拿到数据库密码。原因他们的前端Nginx配置了location /actuator { deny all; }但漏写了location /actuator/ { deny all; }末尾斜杠导致/actuator/env能绕过。3.2 深度探测确认敏感信息是否真实泄露如果第一步返回200下一步必须确认泄露内容的敏感程度。执行完整请求curl -s http://YOUR_NACOS_IP:8848/actuator/env | jq .propertySources[] | select(.name systemProperties or .name configurationProperties) | .properties这条命令用jq过滤出最危险的两个PropertySourcesystemProperties含JVM参数、系统环境变量和configurationProperties含application.properties配置。重点关注以下keyKey危险等级说明spring.datasource.password⚠️⚠️⚠️ 高危数据库密码明文nacos.core.auth.cachesize⚠️ 中危暴露鉴权缓存策略辅助渗透user.home⚠️ 中危暴露服务器用户主目录可推断部署路径java.class.path⚠️ 中危暴露jar包加载路径辅助版本识别注意jq命令需要提前安装。若无jq可用grep -E (password|jdbc|mysql|oracle)粗筛但精度较低。我在某次客户现场实测时发现/actuator/env返回中不仅有数据库密码还有spring.redis.password和spring.rabbitmq.password——这意味着攻击者一次请求就能获取整套中间件的访问凭证。这才是该漏洞真正恐怖的地方它不是一个单点漏洞而是一把万能钥匙能打开整个微服务基础设施的保险柜。3.3 隐蔽风险排查你以为关了其实没关很多团队声称“我们早就禁用了Actuator”但实际检查发现配置形同虚设。常见失效配置有三类第一类只禁用部分端点却放行了/env# ❌ 错误示范只暴露health以为安全 management.endpoints.web.exposure.includehealth,info # 问题/env不在include列表但Spring Boot默认会暴露healthinfo/env仍可能被其他配置激活第二类用exclude但语法错误# ❌ 错误示范exclude语法不支持通配符 management.endpoints.web.exposure.excludeenv,beans,configprops # ✅ 正确写法Nacos 1.4.1 management.endpoints.web.exposure.includehealth,info management.endpoints.web.exposure.exclude*第三类配置位置错误未生效Nacos的Actuator配置必须放在conf/application.properties中即Nacos启动时实际加载的配置文件而不是nacos-console/src/main/resources/application.properties开发期配置。很多团队修改了源码配置却忘了重新打包或者把配置写在了conf/cluster.conf里导致完全不生效。验证配置是否生效的终极方法查看Nacos启动日志。在logs/start.out中搜索Exposing endpoints正常关闭后应看到Exposing endpoints under base path /actuator ... No web endpoints are exposed.如果看到Exposing 16 endpoint(s)说明配置彻底失败。4. 防护方案从紧急止损到长期加固的四层防御体系4.1 紧急止血30秒内阻断攻击面临时方案当确认漏洞存在且环境已暴露在公网或不可信网络时第一要务是立即阻断/actuator/*路径的访问。这不是最优解但能争取修复时间。推荐按优先级顺序执行首选反向代理层拦截Nginx/Apache在Nginx配置中添加location ^~ /actuator/ { deny all; return 403; }注意^~前缀确保该规则优先于其他正则匹配/actuator/末尾斜杠防止/actuatorenv绕过。修改后执行nginx -t nginx -s reload全程不超过30秒。备选防火墙/IP白名单适用于无法修改代理配置的场景如果Nacos直连客户端可在服务器iptables中限制# 只允许运维网段访问Actuator假设运维网段为192.168.10.0/24 iptables -A INPUT -p tcp --dport 8848 -s 192.168.10.0/24 -m string --string /actuator/ --algo bm -j ACCEPT iptables -A INPUT -p tcp --dport 8848 -m string --string /actuator/ --algo bm -j DROP警告此方案需谨慎string模块匹配效率低高并发下可能影响性能。仅作应急勿长期使用。这两步做完立刻用3.1节的curl命令复测确保返回403或404。这是所有后续工作的前提——在攻击面未关闭前任何升级、加固都是空中楼阁。4.2 根治之策Nacos 1.4.2版本升级与配置加固CVE-2021-29442在Nacos 1.4.2版本中被官方正式修复。修复方案不是简单删掉Actuator而是在Nacos启动时主动禁用所有Actuator端点并移除相关依赖。我们来对比1.4.1和1.4.2的关键差异项目Nacos 1.4.1Nacos 1.4.2pom.xml依赖显式引入spring-boot-starter-actuator移除该依赖application.propertiesmanagement.endpoints.web.exposure.include**删除所有management.配置启动日志Exposing 16 endpoint(s)No web endpoints are exposed.升级步骤极其简单下载 Nacos 1.4.2官方包 停止旧版Nacossh shutdown.sh备份旧版conf/目录重点备份application.properties和cluster.conf解压新版包将备份的conf/覆盖到新版conf/启动sh startup.sh -m standalone执行curl -I http://localhost:8848/actuator/env确认返回404。实操心得升级前务必验证conf/application.properties中是否有自定义的management.*配置。如果有必须手动删除否则新版本可能因兼容性逻辑重新加载Actuator。我在某电商客户升级时就遇到这个问题他们自定义了management.endpoints.web.base-path/manage导致1.4.2启动后仍暴露/manage/env白白升级。4.3 深度加固Spring Boot Actuator的最小化暴露原则即使升级到1.4.2如果你的Nacos是基于源码二次开发的比如集成了自定义监控仍可能重新引入Actuator。此时必须建立“最小化暴露”原则原则一只暴露必需端点如果确实需要健康检查只暴露health和infomanagement.endpoints.web.exposure.includehealth,info management.endpoint.health.show-detailsNEVER # 生产环境禁止显示详情原则二重定义基础路径增加混淆成本避免使用默认/actuatormanagement.endpoints.web.base-path/nacos-monitor # 此时健康检查路径变为 /nacos-monitor/health原则三强制启用认证双保险即使Nacos自身有鉴权Actuator也应独立设防# 引入spring-boot-starter-security依赖 management.endpoint.health.show-detailsWHEN_AUTHORIZED management.endpoints.web.exposure.includehealth,info spring.security.user.namemonitor spring.security.user.passwordyour_strong_password然后在Nginx中配置Basic Auth代理location /nacos-monitor/ { auth_basic Nacos Monitor; auth_basic_user_file /etc/nginx/.htpasswd; proxy_pass http://nacos_backend; }这套组合拳下来攻击者需要同时突破Nginx Basic Auth、Spring Security、Nacos Token三道防线成本指数级上升。4.4 长效治理建立中间件配置基线与自动化巡检把安全寄托在“人记得改配置”上是危险的。我们团队为所有客户建立了Nacos配置基线检查清单并集成到CI/CD流水线中基线检查项Shell脚本片段#!/bin/bash # 检查Nacos配置文件是否包含危险配置 NACOS_CONF/path/to/nacos/conf/application.properties if grep -q management.endpoints.web.exposure.include\* $NACOS_CONF; then echo ❌ CRITICAL: Found dangerous actuator exposure in $NACOS_CONF exit 1 fi if grep -q spring.security.user.password $NACOS_CONF ! grep -q ^# $NACOS_CONF; then echo ⚠️ WARNING: Plain text password found in $NACOS_CONF # 此处可触发告警或替换为密钥管理服务 fi echo ✅ All checks passed自动化巡检每日凌晨2点Ansible Playbook自动登录所有Nacos节点执行上述检查结果推送至企业微信机器人高危项负责人同时调用Nacos OpenAPI/nacos/v1/ns/operator/metrics获取实时指标比对历史基线发现异常配置变更。这套机制上线后某省交通厅的Nacos集群在一次运维误操作手动添加了management.*配置后15分钟内就被自动发现并回滚避免了潜在风险。5. 经验复盘那些踩过的坑与血泪教训5.1 “升级就安全了”不配置漂移才是最大隐患2022年Q3我负责的一个省级医保平台在升级Nacos至1.4.2后安全扫描仍报CVE-2021-29442。排查三天最终发现是Kubernetes ConfigMap挂载的application.properties里有一行被GitOps工具自动注入的配置data: application.properties: | # Auto-generated by ArgoCD management.endpoints.web.exposure.includehealth,info,envArgoCD的同步策略是“配置即代码”它把开发环境的调试配置当成了标准配置同步到了生产环境。这个案例教会我安全不是一次性的升级动作而是配置全生命周期的管控。现在我们所有K8s环境都强制启用ConfigMap的准入校验Webhook任何包含management.*的配置提交都会被拒绝。5.2 “我用Docker部署肯定安全”镜像层隐藏的陷阱很多团队用nacos/nacos-server:1.4.1镜像部署认为“官方镜像应该没问题”。但Docker Hub上的官方镜像非alibaba/nacos在2021年曾被篡改过存在恶意启动脚本。更隐蔽的是某些私有Harbor仓库中缓存的老版本镜像其/home/nacos/conf/application.properties在构建时被硬编码了management.*配置。我的建议是永远从GitHub Release页面下载tar.gz包用sha256校验完整性再构建自己的镜像。Dockerfile示例FROM openjdk:8-jre-slim ARG NACOS_VERSION1.4.2 ADD https://github.com/alibaba/nacos/releases/download/v${NACOS_VERSION}/nacos-server-${NACOS_VERSION}.tar.gz /tmp/ RUN tar -xzf /tmp/nacos-server-${NACOS_VERSION}.tar.gz -C /opt/ \ rm -f /tmp/nacos-server-${NACOS_VERSION}.tar.gz \ sed -i /management\./d /opt/nacos/conf/application.properties最后一行sed是关键——在构建镜像时就物理删除所有management配置从源头杜绝风险。5.3 “我们不用MySQL所以没关系”对漏洞影响的严重误判有位客户CTO曾对我说“我们Nacos用的Derby嵌入式数据库没配密码所以spring.datasource.password泄露也没事。” 这个想法极其危险。CVE-2021-29442的危害远不止数据库密码user.dir暴露Nacos安装路径结合/nacos/v1/cs/configs?dataIdxxx可遍历配置java.io.tmpdir暴露临时目录可能被用于上传恶意jar配合其他RCE漏洞nacos.server.ip暴露内网IP为横向移动提供地图spring.profiles.active暴露环境标识帮助攻击者判断是测试还是生产。在2023年某次攻防演练中红队正是通过/actuator/env获取到nacos.server.ip10.10.20.5再用nmap -p 8848 10.10.20.0/24扫出整个Nacos集群最后利用另一个未公开的JNDI注入漏洞拿下全部节点。所以任何配置信息的泄露都是攻击链路上的关键拼图。最后分享一个小技巧在Nacos启动脚本startup.sh末尾添加一行日志记录echo $(date): Nacos started with config $(cat $BASE_DIR/conf/application.properties | grep -v ^# | grep -E ^(management|spring\.security) | wc -l) dangerous lines $BASE_DIR/logs/startup-security.log这样每次启动都会记录“危险配置行数”运维值班时一眼就能发现异常。安全不是靠运气而是靠把每一个细节变成可度量、可审计、可追溯的动作。