如何修复SonarCloud检测到的归档文件路径构造安全漏洞?
修复SonarCloud「从归档文件条目文件名构造路径」安全漏洞
你的问题出在直接用entry.getName()构造目标文件路径时,没严格校验路径是否会跳出指定的targetFile目录,存在路径遍历攻击风险——比如恶意归档文件里包含../malicious/file.txt这类条目,会把文件写到目标目录之外的位置。你当前用parentDirectory.startsWith("Dubbo/test")的校验逻辑非常脆弱,覆盖不了所有路径逃逸场景,比如跨系统路径分隔符、嵌套的../等情况。
正确的修复思路是强制确保提取的文件始终位于目标目录的子路径下,具体实现步骤:
- 提前获取目标目录的规范化绝对路径
- 过滤掉带绝对路径、路径遍历符(
..//..\)的归档条目名称 - 构造目标文件路径后,校验其是否属于目标目录的子路径
- 仅对合法路径执行目录创建和文件写入操作
修复后的代码示例:
// 提前获取目标目录的规范化绝对路径 File targetDir = new File(targetFile).getCanonicalFile(); while ((entry = tarArchiveInputStream.getNextTarEntry()) != null) { if (entry.isDirectory()) { continue; } String entryName = entry.getName(); // 过滤明显非法的路径格式 if (entryName.startsWith("/") || entryName.startsWith("\\") || entryName.contains("../") || entryName.contains("..\\")) { continue; } // 构造目标文件并规范化路径 File curFile = new File(targetDir, entryName); try { curFile = curFile.getCanonicalFile(); } catch (IOException e) { continue; } // 校验路径是否在目标目录范围内 if (!curFile.getAbsolutePath().startsWith(targetDir.getAbsolutePath())) { continue; } // 创建父目录(已校验路径合法性,无需额外前缀判断) File parent = curFile.getParentFile(); if (parent != null && !parent.exists()) { parent.mkdirs(); } // 写入文件 try (FileOutputStream outputStream = new FileOutputStream(curFile)) { IOUtils.copy(tarArchiveInputStream, outputStream); } }
关键说明:
getCanonicalFile()会消除路径中的.、../等符号,确保路径是真实物理路径- 通过绝对路径前缀对比,彻底避免文件被写入目标目录之外
- 提前过滤非法路径格式,减少后续校验的风险
这样修改后,SonarCloud的路径构造安全漏洞会被修复,同时能有效防范路径遍历攻击。
内容的提问来源于stack exchange,提问作者letterspacing
相关产品推荐
相关产品推荐

