文章目录
- 0.前言
- 1.参考文档
- 2.基础介绍
- 3.漏洞利用原理
- 3.解决方案
-
- [1. 升级Spring Boot版本](#1. 升级Spring Boot版本)
- [2. 限制端点的访问](#2. 限制端点的访问)
- [3. 禁用环境端点](#3. 禁用环境端点)
- [4. 不公开敏感的Actuator端点](#4. 不公开敏感的Actuator端点)
- [5. 开启安全审计](#5. 开启安全审计)
0.前言
背景: Spring Boot Actuator的Env端点存在本地文件包含(LFI)漏洞CVE-2020-5421。被扫描到需要解决。
Spring Boot Actuator是Spring Boot的一个子项目,主要用于监控和管理Spring Boot应用程序。在开发或测试环境中,开发者通常会开启所有Actuator的端点,包括/env
端点,以便于对应用程序进行诊断和调试。但在生产环境中,这种配置可能会导致安全问题。
1.参考文档
- Spring Boot官方网站: https://spring.io/projects/spring-boot
- Spring Boot GitHub仓库: https://github.com/spring-projects/spring-boot
- Spring官方博客: https://spring.io/blog
这个问题被记录在Spring
Boot的GitHub仓库中,具体的漏洞描述和解决办法可以在这个链接中找到:https://github.com/spring-projects/spring-boot/issues/。
另外,Pivotal也在他们的官方博客中发布了一个公告,解释了这个问题的严重性,以及他们如何处理这个问题:https://spring.io/blog/。
注意: 以上链接可能会随着时间推移而更新或改变 如果连接变了可以评论区留言谢谢。
2.基础介绍
CVE-2020-5421
就是一个影响Spring Boot Actuator
的安全漏洞。这个漏洞主要涉及到环境(Env)端点。这个端点本来是用来获取应用程序运行环境的详细信息的,但由于漏洞的存在,攻击者可以通过特制的请求,让/env端点返回服务器上任意文件的内容,这就是所谓的本地文件包含(LFI)漏洞。
这个LFI漏洞的存在,可能使的应用程序面临严重的安全风险。攻击者可以通过这个漏洞获取到服务器上的任何文件,包括应用程序的配置文件,数据库配置信息,甚至是系统的敏感文件如/etc/passwd
。这可能会导致的应用程序的信息泄露,甚至是被完全控制。
3.漏洞利用原理
在Spring Boot Actuator的/env
端点,开发者可以获取到应用程序运行环境的详细信息。然而,由于一项设计缺陷,攻击者可以通过发送特制的请求,让/env
端点返回服务器上任意文件的内容。这就是所谓的本地文件包含(LFI)漏洞。
具体的利用方法是,攻击者可以发送一个POST请求到/env端点,如POST /actuator/env
,然后在请求体中设置name
参数为[systemProperties][java.home]
,value
参数为任意文件的路径,如../../../etc/passwd
。
然后再发送一次GET请求到/env端点,读取这个文件的内容。由于/env端点会返回java.home
系统属性的值,而这个值已经被攻击者修改为任意文件的路径,所以,服务器会返回这个文件的内容。
所以,这个漏洞的原理就是,攻击者通过修改系统属性java.home
的值,来读取服务器上任意文件的内容。
这种攻击方法需要攻击者能够访问到的Actuator端点。在生产环境中,应该尽量限制Actuator端点的访问权限,或者完全禁用它。
3.解决方案
要解决这个本地文件包含(LFI)漏洞,可以采取以下的解决方案:
1. 升级Spring Boot版本
Pivotal(Spring Boot的开发商)已经在更高版本的Spring Boot中修复了这个漏洞。所以,可以通过升级的Spring Boot版本来解决这个问题。具体来说,应该至少升级到2.3.9.RELEASE、2.4.4或更高版本。官方地址https://spring.io/projects/spring-boot/
2. 限制端点的访问
在生产环境中,应该尽量限制Actuator端点的访问权限。可以通过Spring Security来实现这一点。只有经过身份验证的用户,才能访问Actuator端点。
要使用Spring Security来限制Actuator端点的访问,首先需要在的项目中引入Spring Security的依赖。如果使用的是Maven构建工具,可以在的pom.xml
文件中添加如下的依赖:
xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
然后,需要创建一个配置类,该类扩展了WebSecurityConfigurerAdapter
,并覆盖了configure(HttpSecurity http)
方法,如下:
java
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.requestMatcher(EndpointRequest.toAnyEndpoint()).authorizeRequests()
.anyRequest().authenticated()
.and().httpBasic();
}
}
在这个配置中,首先使用requestMatcher(EndpointRequest.toAnyEndpoint())
来指定这个安全配置只应用于Actuator端点的请求。然后,使用authorizeRequests().anyRequest().authenticated()
来要求所有的请求都必须经过身份验证。最后,使用httpBasic()
来启用HTTP基本认证。
然后,需要在的application.properties
或application.yml
中设置一个用户名和密码,这个用户名和密码将用于身份验证。例如:
properties
spring.security.user.name=admin
spring.security.user.password=secret
这样,只有知道用户名和密码的人,才能访问的Actuator端点。
3. 禁用环境端点
如果不需要环境端点,也可以选择禁用它。可以在的application.properties
或application.yml
中设置management.endpoint.env.enabled=false
来禁用环境端点。
4. 不公开敏感的Actuator端点
默认情况下,Spring Boot 只会暴露少数几个不敏感的Actuator端点,比如"health"和"info"。应该确保这个设置没有被修改,避免公开其他可能带来安全隐患的端点。
5. 开启安全审计
如果公司的devops 平台做的好的话,可以在发布扫描环节扫描这些。或者通过开启安全审计,可以记录谁访问了哪些端点,何时访问的,访问了哪些数据。这对于检测和防止潜在的攻击非常有用。