SpringBootActuator端点泄露-安全团队给我发了高危工单

admin 2026-08-27 06:45:00 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文记录了一起SpringBootActuator端点因配置include:*导致生产环境敏感信息泄露的高危安全事件。作者详细描述了从收到安全工单、确认泄露范围(包括数据库密码、Redis密码、API密钥及1.8GB堆内存dump)到紧急修复的全过程。核心修复措施包括限制暴露端点、添加认证、禁用heapdump、Nginx层面拦截以及全团队推广安全配置模板。文章提供了可操作的安全加固Checklist和风险评估报告,强调了生产环境禁用高风险端点的重要性。 综合评分: 90 文章分类: 应急响应,安全建设,解决方案,安全工具,漏洞分析


Spring Boot Actuator端点泄露-安全团队给我发了高危工单

原创

希成男孩 希成男孩

JAVA小师傅

2026年8月20日 09:03 上海

在小说阅读器读本章

去阅读

安全团队的工单邮件发到我邮箱时,我以为是钓鱼邮件。

标题写着:【高危】生产环境敏感信息泄露 — 涉及数据库密码、Redis密码、API密钥

打开一看,我们的订单服务Actuator端点暴露在公网,任何人都可以访问。里面不仅有健康检查,还有环境变量、配置属性、线程dump——数据库密码就在环境变量里明文展示。

我花了半天时间修复和排查,发现泄露的数据比我想象的还多。


问题发现

安全团队的工单内容:

【高危安全工单 #SEC-2025-1847】

发现时间:2025-11-20 14:30
风险等级:P0-高危
影响范围:订单服务(order-service-prod)

问题描述:
外部安全扫描发现 order-api.xxx.com/actuator 端点可公开访问,
未配置任何身份认证。

泄露信息:
1. /actuator/env → 包含数据库密码、Redis密码、第三方API Key
2. /actuator/heapdump → 可下载完整堆内存(含用户Session信息)
3. /actuator/threaddump → 暴露内部线程结构和调用栈
4. /actuator/configprops → 完整配置属性
5. /actuator/mappings → 全部URL映射

请24小时内修复并提供影响评估报告。

我当时就慌了。


第一步:确认泄露范围

先确认这些端点是否真的对外开放:

# 从外部测试
$ curl-s http://order-api.xxx.com/actuator | head -20
{
  "_links": {
    "self": {
      "href": "http://order-api.xxx.com/actuator",
      "templated": false
    },
    "health": {
      "href": "http://order-api.xxx.com/actuator/health",
      "templated": false
    },
    "info": {
      "href": "http://order-api.xxx.com/actuator/info",
      "templated": false
    },
    "env": {
      "href": "http://order-api.xxx.com/actuator/env",
      "templated": false
    }
  }
}

确实是开放的。再看env端点:

$ curl-s http://order-api.xxx.com/actuator/env | python3 -m json.tool | grep-i"pass\|key\|secret" | head -20
"db.password": "****",
"redis.password": "******",
"oss.access-key-id": "LTAI5tXXXXXXXX",
"oss.access-key-secret": "XXXXXXXXXXXX",
"wechat.pay.mch-key": "XXXXXXXX",
"spring.datasource.password": "Xk8#mN2$pQ9!rT5&"

部分密码被Spring Boot的sanitization功能掩盖了(显示为 ****),但 spring.datasource.password 因为配置方式的原因没有被掩盖。

再看heapdump:

$ curl-s-o heapdump.hprof http://order-api.xxx.com/actuator/heapdump
$ ls-lh heapdump.hprof
-rw-r--r--1 root root 1.8G heapdump.hprof

1.8GB的堆内存dump文件,包含了所有运行时的内存数据——用户信息、订单数据、Session、缓存里的密码……全部都在里面。


第二步:分析Actuator配置

找到问题配置:

# application.yml
management:
  endpoints:
    web:
      exposure:
        include: "*"   # ❌ 暴露所有端点!
      base-path: /actuator

  endpoint:
    health:
      show-details: always
    env:
      enabled: true    # 默认开启
    heapdump:
      enabled: true    # 默认开启

include: "*" 暴露了所有Actuator端点。而Spring Boot默认的Actuator端点权限是——没有任何权限控制。谁都可以访问。


第三步:紧急修复

1. 只暴露必要的端点

management:
  endpoints:
    web:
      exposure:
        include: health,info,prometheus  # ✅ 只暴露必要的端点
        # exclude: env,heapdump,threaddump,configprops,mappings,beans,conditions,flyway,scheduledtasks,httptrace

2. 敏感端点加认证

对于仍然需要使用的管理端点(如env用于运维排查),加上认证:

@Configuration
publicclassActuatorSecurityConfigextendsWebSecurityConfigurerAdapter {

    @Override
    protectedvoidconfigure(HttpSecurityhttp) throwsException {
        http
            .requestMatchers()
                .antMatchers("/actuator/**")
                .and()
            .authorizeRequests()
                .antMatchers("/actuator/health", "/actuator/info", "/actuator/prometheus")
                    .permitAll()   // 健康检查和监控指标不需要认证(供K8s和Prometheus使用)
                .antMatchers("/actuator/**")
                    .hasRole("ADMIN")  // 其他端点需要ADMIN角色
                .and()
            .httpBasic();  // 使用HTTP Basic认证
    }
}

#

3. 密码自动掩盖

Spring Boot 2.0+ 默认会掩盖env端点中包含”password”、”secret”、”key”等关键词的属性值。但需要确认自定义的配置前缀是否被包含:

management:
  endpoint:
    env:
      show-values: WHEN_AUTHORIZED  # 认证后才显示明文
      keys-to-sanitize:             # 需要掩盖的关键词
        - password
        - secret
        - key
        - token
        - .*credentials.*
        - .*api-key.*
        - .*access-key.*
        - spring.datasource.password
        - redis.password
        - oss.access-key-secret

4. 禁用heapdump端点

heapdump是最高风险的端点。在任何环境都不应该暴露:

management:
  endpoint:
    heapdump:
      enabled: false   # 直接禁用
    threaddump:
      enabled: false   # 也建议禁用,除非运维需要

如果需要heapdump排查线上问题,通过内网SSH到服务器本地执行,不要通过网络暴露。


第四步:全面排查和加固

1. Nginx层面拦截

即使Spring Boot层面修了,也要在Nginx层面加一道防线:

# nginx.conf
server {
    listen 80;
    server_name order-api.xxx.com;

    # 禁止访问actuator端点(除了health)
    location /actuator/ {
        # 只允许健康检查和监控指标
        if ($uri !~ ^/actuator/(health|info|prometheus)$) {
            return 403;
        }

        # 健康检查允许所有来源
        proxy_pass http://order-service-upstream;
    }

    # 其他路径正常代理
    location / {
        proxy_pass http://order-service-upstream;
    }
}

2. 检查所有服务

# 批量检查所有服务的Actuator端点
for service in order-service payment-service inventory-service user-service product-service; do
    echo "=== $service ==="
    curl -s -o /dev/null -w "%{http_code}" "http://${service}-api.xxx.com/actuator"
    echo ""
done

# 结果:
# === order-service === 200(❌ 暴露了)
# === payment-service === 200(❌ 暴露了)
# === inventory-service === 404(✅ 没暴露)
# === user-service === 200(❌ 暴露了)
# === product-service === 404(✅ 没暴露)

5个服务中有3个暴露了Actuator端点。全部修复。

3. 检查是否有历史泄露

# 检查Nginx访问日志,看有没有外部IP访问过这些端点
$ grep "/actuator/env\|/actuator/heapdump" /data/logs/nginx/access.log | awk '{print $1}' | sort -u
47.96.xxx.xxx
120.55.xxx.xxx
203.0.xxx.xxx     # ← 这些是外部IP
101.132.xxx.xxx

有4个外部IP访问过这些敏感端点。需要评估是否被恶意利用。


第五步:安全加固Checklist

修复完成后,我整理了一份Actuator安全配置模板,推广到全团队:

# actuator-security.yml —— 团队统一模板
management:
  endpoints:
    web:
      exposure:
        include: health,info,prometheus  # 只暴露必要的
      base-path: /internal/actuator      # 改个不容易猜到的路径

    health:
      show-details: when-authorized      # 只有认证后才显示详情

    env:
      enabled: false                     # 生产环境禁用env端点
      show-values: WHEN_AUTHORIZED

    heapdump:
      enabled: false                     # 生产环境必须禁用

    threaddump:
      enabled: false

    configprops:
      enabled: false

    beans:
      enabled: false

    mappings:
      enabled: false

    conditions:
      enabled: false

  # Prometheus指标仍然需要(用于监控系统采集)
  metrics:
    export:
      prometheus:
        enabled: true

风险评估报告

给安全团队的回复:

【修复报告 #SEC-2025-1847】

修复时间:2025-11-20 18:00(发现后3.5小时)

泄露数据评估:
1. 数据库密码:spring.datasource.password 明文泄露(1个)
   → 已修改密码
2. Redis密码:被sanitization掩盖(显示为****)
   → 未实际泄露,但建议修改
3. OSS密钥:access-key-id泄露,access-key-secret被掩盖
   → 已轮换OSS密钥
4. 微信支付密钥:被掩盖
   → 未泄露,已确认
5. heapdump:可被下载(1.8GB)
   → 已无法访问。需要排查dump中是否包含用户敏感数据

影响用户数:heapdump中包含约2000条活跃Session,
涉及约500个用户的运行时数据(购物车、订单草稿等)。
无支付信息泄露(支付信息在独立服务中,未受影响)。

修复措施:
1. 所有服务Actuator端点限制暴露范围
2. 敏感端点加认证
3. Nginx层面拦截非授权访问
4. 轮换所有可能泄露的密钥和密码
5. 全团队推广Actuator安全配置模板

经验沉淀

Actuator安全配置Checklist:

  • include 配成 * 了吗?生产环境绝对不能
  • heapdump端点禁用了吗?这是最高风险的端点
  • env端点禁用了吗?或至少限制了认证访问
  • 密码自动掩盖规则覆盖全了吗?自定义前缀的密钥有没有被掩盖
  • Nginx层有没有拦截非授权Actuator请求?
  • 所有服务都检查了吗?不能只改一个服务
  • 有没有定期扫描?加到安全巡检流程中

Actuator端点风险等级:

| 端点 | 风险等级 | 生产环境建议 | | — | — | — | | /health | 低 | 可开放(K8s探针需要) | | /prometheus | 低 | 可开放(监控采集需要) | | /info | 低 | 可开放 | | /metrics | 中 | 认证后开放 | | /env | | 禁用或严格认证 | | /heapdump | 极高 | 必须禁用 | | /threaddump | | 禁用或认证后开放 | | /configprops | | 禁用 | | /mappings | 中 | 禁用 | | /beans | 低 | 禁用 |

一句话总结: Actuator是给开发者用的诊断工具,不是给用户用的接口。生产环境一定要最小化暴露,最好只留health和prometheus。


👇 如果这篇文章对你有帮助,点个关注不迷路 👇


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:JAVA小师傅 希成男孩 希成男孩《Spring Boot Actuator端点泄露-安全团队给我发了高危工单》

评论:0   参与:  0