OWASP 类别: MASVS-STORAGE: 存储
概览
当攻击者可以控制路径的一部分,而该路径在未经验证的情况下被传递给文件系统 API 时,就会发生路径遍历漏洞。这可能导致未经授权的文件系统操作。例如,攻击者可能会使用特殊字符,例如 ../
,通过遍历到目标目录之外,意外地更改资源目标。
影响
影响因操作和文件内容而异,但通常会导致文件覆盖(写入文件时)、数据泄露(读取文件时)或权限更改(更改文件或目录权限时)。
缓解措施
使用 File.getCanonicalPath()
对路径进行规范化,并将其前缀与预期目录进行比较
Kotlin
@Throws(IllegalArgumentException::class)
fun saferOpenFile(path: String, expectedDir: String?): File {
val f = File(path)
val canonicalPath = f.canonicalPath
require(canonicalPath.startsWith(expectedDir!!))
return f
}
Java
public File saferOpenFile (String path, String expectedDir) throws IllegalArgumentException {
File f = new File(path);
String canonicalPath = f.getCanonicalPath();
if (!canonicalPath.startsWith(expectedDir)) {
throw new IllegalArgumentException();
}
return f;
}
一项额外的最佳实践是使用验证来确保只发生预期的结果。示例如下:
- 检查文件是否已存在,以防止意外覆盖。
- 检查目标文件是否为预期目标,以防止数据泄露或错误地更改权限。
- 检查操作的当前目录是否与从规范路径返回的值完全一致。
- 确保权限系统明确限定于操作,例如检查它是否未以 root 身份运行服务,并确保目录权限限定于指定的服务或命令。