Spring Boot Actuator 的未授问漏未授权访问漏洞,说白了就一句话:你项目里引了 spring-boot-starter-actuator,权访配置里没锁死端点,未授问漏结果 /actuator/env、权访/actuator/heapdump 这些路径被人直接扫出来,未授问漏数据库密码、权访Redis 连接串、未授问漏甚至 JWT 密钥全暴露在浏览器里。权访
我去年帮一个朋友看他的未授问漏小项目,部署在阿里云一台 2 核 4G 的权访机器上。他用的未授问漏是 Spring Boot 2.3,application.properties 里只写了 server.port=8080,权访其他啥也没动。未授问漏我随手访问了一下 http://他的权访IP:8080/actuator,返回了一长串 JSON,未授问漏里面 /actuator/env、/actuator/beans、/actuator/threaddump 全是
"status": "UP"那种可访问状态。再点进 /actuator/env,spring.datasource.password 明明白白躺在那儿,明文。他当时脸就绿了——那台机器上跑的可是一个接入了支付接口的订单系统。为什么默认会这样
Spring Boot 2.x 之后,Actuator 的端点默认只暴露 health 和 info。但很多开发者为了“方便调试”,在配置文件里加了这么一行:
management.endpoints.web.exposure.include=*或者更常见的,直接写
management.endpoints.web.exposure.include=env,beans,heapdump。加上之后,所有端点全部对外网开放。问题在于,这行配置经常被带到生产环境。我见过一个团队,测试环境的配置直接复制到生产,连注释都没删。结果 /actuator/heapdump 被人下载了,堆转储文件里翻出了数据库连接池的账号密码。攻击者甚至不需要什么高级工具,浏览器加一个 URL 就完事。实际被利用的场景
不是所有漏洞都需要复杂的利用链。Actuator 未授权访问的可怕之处在于它太直接了。/actuator/env 能读到所有环境变量和配置属性,包括 spring.datasource.url、spring.redis.password、甚至第三方 API 的 secretKey。/actuator/heapdump 更狠,下载下来用 MAT 或者 jhat 一分析,内存里的字符串常量、连接池对象、用户 session 全都能翻出来。
还有一个容易被忽略的端点:/actuator/jolokia。如果项目里引了 jolokia-core,这个端点可以执行 MBean 操作,配合 /actuator/env 里的配置,能直接 RCE。2020 年有个真实的挖矿事件,攻击者就是通过 Actuator 的 jolokia 端点加载了恶意 MBean,在服务器上跑了 XMRig。
怎么防
最省事的做法:生产环境只暴露 health 和 info。在 application-prod.properties 里写死:
management.endpoints.web.exposure.include=health,info management.endpoint.health.show-details=never如果确实需要某些端点,加 Spring Security。别用
permitAll()糊弄,至少配个 HTTP Basic。我一般会这么干:@Configuration public class ActuatorSecurity extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.requestMatcher(EndpointRequest.toAnyEndpoint()) .authorizeRequests() .anyRequest().hasRole("ADMIN") .and().httpBasic(); } }另外,改一下管理端点的端口,别跟业务端口混在一起:
management.server.port=9090 management.server.address=127.0.0.1这样即使配置漏了,外网也扫不到。最后,别偷懒。上线前用 curl 跑一遍:
curl http://your-host:port/actuator,看看返回了什么。我见过太多人觉得“内网没事”,结果一台机器被突破,整个内网横向移动,Actuator 就是第一块跳板。这个漏洞不复杂,但中招的人特别多。原因就一个:默认配置太“友好”,而开发者太“信任”默认值。花五分钟改一行配置,比事后删库跑路强。
顶: 673踩: 47






评论专区