如何修复MavenWrapperDownloader.java中的绝对路径遍历漏洞
Maven Wrapper 路径遍历问题修复指南
已修复版本说明
- 原由takari维护的maven-wrapper项目已正式归档,后续迭代维护由Apache Maven项目组承接,当前3.2.0及以上版本的官方wrapper组件,已经在代码层面修复了
MavenWrapperDownloader.java中的绝对路径遍历风险。 - 可以直接通过Maven官方提供的wrapper生成命令,重新生成项目内的全套wrapper相关文件,直接替换存在风险的旧版本下载器代码,无需手动逐行修改旧文件。
旧版本代码手动修复方案
现有问题的核心风险是第50行代码直接将命令行传入的第一个参数作为文件操作的根目录,没有做任何合法性校验,一旦参数被恶意构造,就会让程序读取、写入系统任意路径下的文件。
结合代码现有逻辑,可以按照以下步骤修复:
- 第一步:在初始化
baseDirectory时,增加规范路径校验
原问题代码:
修正后代码:File baseDirectory = new File(args[0]);// 定义程序运行时的预期合法基准目录(即当前工作目录) File expectedBaseDir = new File("").getAbsoluteFile(); File baseDirectory = new File(args[0]); // 校验传入的根目录必须落在预期基准目录范围内 if (!baseDirectory.getCanonicalPath().startsWith(expectedBaseDir.getCanonicalPath() + File.separator)) { throw new SecurityException("检测到非法工作目录参数,禁止路径遍历"); } - 第二步:在读取wrapper配置文件的逻辑中,二次校验最终文件路径的合法性
现有逻辑代码:
补充校验逻辑:File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); String url = DEFAULT_DOWNLOAD_URL; if(mavenWrapperPropertyFile.exists()) {File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); // 解析最终文件的规范路径,确认没有跳出合法根目录 String canonicalPropFilePath = mavenWrapperPropertyFile.getCanonicalPath(); if (!canonicalPropFilePath.startsWith(baseDirectory.getCanonicalPath() + File.separator)) { throw new SecurityException("检测到路径遍历风险,终止配置读取流程"); } String url = DEFAULT_DOWNLOAD_URL; if(mavenWrapperPropertyFile.exists()) {
- 校验路径时必须拼接系统路径分隔符
File.separator作为匹配后缀,避免出现前缀混淆的误判——比如合法目录是/work/project/maven,恶意构造的路径是/work/project/maven-evil,如果只做单纯的字符串前缀匹配,就会将恶意路径误判为合法。 - 选用
getCanonicalPath()做校验的核心原因是,该方法会自动解析路径中的.、..这类相对路径跳转符号,比单纯的字符串校验可靠性高很多。
轻量替代修复方案
如果需要最小化改动代码,也可以直接在解析args[0]参数时增加前置过滤:
- 检测传入参数中是否包含
..路径跳转符号、是否以系统路径分隔符开头,一旦命中就直接抛出安全异常终止程序 - 强制将传入的路径参数做归一化处理,限定所有文件操作都必须落在当前工作目录范围内,不允许直接指向系统其他位置的绝对路径
内容的提问来源于stack exchange,提问作者marhg
相关产品推荐
相关产品推荐

