如何解决Spring Boot 3中Sonar检测到的Guava CVE-2020-8908漏洞问题?
Spring Boot 3中Guava间接依赖的CVE-2020-8908漏洞处理指南
一、Guava的用途
Guava是Google开发的一套Java工具库,提供了大量开箱即用的工具类,覆盖集合操作、缓存实现、并发控制、IO处理、字符串工具、反射工具等多个领域。它的核心作用是简化Java开发中的重复代码,提升代码效率和可读性,很多主流Java框架(包括Spring生态的部分组件)都会将其作为依赖引入,所以你的应用即使没显式声明,也可能被间接带入。
二、CVE-2020-8908漏洞原因
这个漏洞源于Guava的Files.createTempDir()方法:
- 该方法创建临时目录时,默认使用系统级临时目录(如Linux的
/tmp、Windows的%TEMP%) - 创建的目录权限设置为开放模式(比如Linux下的
777),意味着系统内其他用户或进程可以随意访问、修改甚至删除该目录下的文件 - 攻击者可通过篡改临时文件,实现本地权限提升或注入恶意代码,CVSS评分6.2正是对应这种本地未授权访问的风险
三、为什么未显式引入仍会被检测到?
Spring Boot 3的部分依赖(比如Spring Cloud组件、第三方业务SDK等)可能将Guava作为自身依赖,通过Maven/Gradle的依赖传递机制,自动将Guava 31.1-android引入到你的应用中。你可以通过以下命令定位依赖来源:
- Maven:
mvn dependency:tree | grep guava - Gradle:
./gradlew dependencies | grep guava
四、漏洞修复方案
1. 升级Guava到安全版本
该漏洞已在Guava 30.0及以上版本修复,你可以通过显式声明依赖的方式,强制将Guava升级到最新安全版本:
- Maven(pom.xml):
<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>32.1.3-android</version> <scope>compile</scope> </dependency> - Gradle(build.gradle):
implementation('com.google.guava:guava') { version { strictly '32.1.3-android' } }
2. 排除不必要的Guava依赖
如果确认你的应用及依赖组件不需要Guava功能,可以在引入问题依赖时排除Guava:
- Maven:
<dependency> <groupId>【问题依赖的groupId】</groupId> <artifactId>【问题依赖的artifactId】</artifactId> <exclusions> <exclusion> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> </exclusion> </exclusions> </dependency> - Gradle:
implementation('【问题依赖的groupId】:【问题依赖的artifactId】') { exclude group: 'com.google.guava', module: 'guava' }
注意:排除前务必进行完整测试,确保组件不会因缺少Guava而抛出NoClassDefFoundError等异常
3. 替换漏洞方法(若代码中直接使用)
如果你的业务代码或依赖组件代码中调用了Files.createTempDir(),可替换为JDK原生的安全方法Files.createTempDirectory(),手动指定严格的目录权限:
import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.attribute.PosixFilePermissions; // 创建仅当前用户可访问的临时目录 Path tempDir = Files.createTempDirectory( "app-temp-", PosixFilePermissions.asFileAttribute(PosixFilePermissions.fromString("rwx------")) );
内容的提问来源于stack exchange,提问作者franklin xavier
相关产品推荐
相关产品推荐

