文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

紧急!Spring Boot安全漏洞

2024-12-13 15:01

关注

1. 简介

Spring Boot Actuator 模块提供了 Spring Boot 生产就绪的所有功能。Actuator提供的所有接口可让你监控应用程序各种信息并与之交互。Spring Boot 包含许多内置接口,你还可以添加自定义的接口。例如,health 接口提供基本的应用程序健康信息。有关Actuator的更多介绍可以查看官方文档,本篇文章主要讲解关于在生产环境中对Actuator的使用或控制不当,可能会引发安全隐患。为了避免这些问题,我们需要谨慎配置和使用Actuator。

2. 安全漏洞

当在项目中启用Actuator后,默认情况下我们是可以没有限制的访问任意一个接口的,如下配置:

management:
  endpoints:
    web:
      cors:
        allow-credentials: true
        allowed-headers: '*'
        allowed-origins: ''
      base-path: /ac
      exposure:
        include: '*'

以上配置,暴露了默认Actuator的所有接口。而这些接口中有些接口暴露的信息就非常的敏感,如:/env,/configprops,/threaddump等接口,这些接口直接会将所有信息展现出来。

/configprops接口

图片

/env接口

图片

/threaddump接口

图片

上面这些接口任其随意访问是有很大风险的(安全部门只要扫到你网站有这些问题都会通知你处理)尤其是上面的/configprops接口,很可能无意间就暴露了你的隐私信息。

3. 解决办法

3.1 配置属性

针对/configprops接口在上面的图中你会发现对于password这样的key系统默认会进行脱敏处理,在默认情况下springboot会对如下的key进行处理:以 "password"、"secret"、"key"、"token"、"vcap_services"、"sun.java.command "结尾的key都会被完全清除。

注意:只要是以这些key结尾的都会处理

自定义的属性配置bean是否会处理呢?验证如下:

@ConfigurationProperties(prefix = "pack.sys")
public class PackProperties {


  private String name ;
  private String password ;
  private String idNo ;
}
// 配置文件
pack:
  sys:
    name: pack
    password: 123123
    idNo: 11099111919919191

查看结果:

图片

password字段被自动的脱敏处理。但是对于这里的idNo我也希望能够脱敏处理又该如何处理呢?通过修改字段名以支持SpringBoot支持的默认命名规则,你应该不会去修改字段名称吧~!如下修改后的效果:

图片

其实完全没有必要这样做,SpringBoot提供了自定义key的方式

management:
  endpoint:
    configprops:
      additional-keys-to-sanitize:
      - idNo

通过上面的属性节点,可以添加你需要处理的key。

图片

当你的key是以这种模式命名时:.*credentials.* 包含credentials时系统也会自动的进行脱敏处理

图片

此外,Spring Boot 还会对带有以下结尾之一的key的 URI 类值的敏感部分进行脱敏:

URI 的敏感部分使用://:@:/格式标识。如下配置示例:

pack:
  sys:
    name: pack
    password: 123123
    idNo: 11099111919919191
    packCredentials: 66666666
    ftpUrl: ftp://pack:123456@xxxooo.pack.com/

展示结果:

图片

自动将密码部分脱敏处理。

3.2 环境信息

对于/env接口,也是有对应的配置属性进行配置

management:
  endpoint:
    env:
      additional-keys-to-sanitize:
      - port
      - ... 添加更多的自定义key

与配置属性一样通过通用的方式添加额外的key进行脱敏处理。

注意:对于env和configprops接口都有一个相同的属性keys-to-sanitize,该属性也可以定义你需要脱敏处理的key,该属性有相同的默认值:password,secret,key,token,.credentials.,vcap_services,sun.java.command

3.3 自定义脱敏规则

如果你希望更多的控制脱敏规则,那么你可以通过自定义SanitizingFunction Bean。

@Component
public class PackSanitizingFunction implements SanitizingFunction {


  @Override
  public SanitizableData apply(SanitizableData data) {
    if (data.getKey().endsWith("email")) {
      return data.withValue("###") ;
    }
    return data ;
  }
}

输出结果:

图片

3.4 其它接口安全配置

对于像/threaddump,/heapdump这样的接口,我们要么将其禁用,要么通过Spring Security进行安全控制,如下示例通过Spring Security进行安全控制。

@Bean
SecurityFilterChain actuatorSecurityFilterChain(HttpSecurity http) throws Exception {
  http.csrf(csrf -> csrf.disable());
  http.authorizeHttpRequests().antMatchers("/ac/env").hasRole("ADMIN") ;
  http.authorizeHttpRequests().antMatchers("/ac/**").hasRole("ACTUATOR") ;
  http.authorizeHttpRequests().anyRequest().permitAll() ;
  http.formLogin(customizer -> Customizer.withDefaults()) ;
  return http.build() ;
}

基于用到了Security,你完全可以对所有的接口进行拦截控制,也就没必要进行上面那些操作了。

来源:Spring全家桶实战案例源码内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯