SV.PATH.INJ

文件注入

当未经验证的用户数据用作所创建或写入的文件名的一部分时,便会出现此错误。

从 2023.2 版本开始,此检查器将支持 Jakarta EE。

漏洞与风险

连同数据注入,此情况可允许数据注入任意文件,例如 /etc/passwd。文件注入本身可用于创建文件和目录,在未来攻击中,攻击者选择的名称可用于这些文件和目录。例如,攻击者可强制应用程序在全局可读的位置创建一个包含敏感信息的文件。

Klocwork 安全漏洞 (SV) 检查器可识别可能创建危险数据的调用;这些调用被视为不安全的来源。用户所提供的任何数据都可能是不安全的来源,因为用户可能是攻击者,或者可能引入人为错误。

缓解与预防

针对允许的词汇值和大小验证所有用户数据。例如,如果用户名必须为目录结构的一部分,针对字母数字字符大小和内容检查这些用户名。

漏洞代码示例 1

复制
     import javax.servlet.http.*;
     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
         String name = req.getParameter("userName");
         File userDir = new File("userFiles", name);
         File profile = new File(userDir, "profile");
         FileOutputStream stream = new FileOutputStream(profile);
         try {
             createFileWithSensitiveInformation(stream);
         } finally {
             stream.close();
         }
     }

Klocwork 在第 6 行报告 SV.PATH.INJ 缺陷,指出:name 包含来自 HTTP 请求参数的数据,因此可能已被污染(第 3 行)。此值用于在第 5 行创建文件 profile,该文件在第 6 行用于创建 FileOutputStream。这可用于将信息注入服务器文件系统中的任意文件。

漏洞代码示例 2

复制
     import jakarta.servlet.http.*;
     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
         String name = req.getParameter("userName");
         File userDir = new File("userFiles", name);
         File profile = new File(userDir, "profile");
         FileOutputStream stream = new FileOutputStream(profile);
         try {
             createFileWithSensitiveInformation(stream);
         } finally {
             stream.close();
         }
     }

Klocwork 在第 6 行报告 SV.PATH.INJ 缺陷,指出:name 包含来自 HTTP 请求参数的数据,因此可能已被污染(第 3 行)。此值用于在第 5 行创建文件 profile,该文件在第 6 行用于创建 FileOutputStream。这可用于将信息注入服务器文件系统中的任意文件。

安全培训

应用程序安全培训材料由 Secure Code Warrior 提供。

扩展

此检查器可通过 Klocwork 知识库进行扩展。有关详情,请参阅调整 Java 分析。