SV.EXEC

进程注入

将未检查的用户输入用于全部或部分由应用程序执行的操作系统命令时,会检测到该错误。

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

漏洞与风险

通常,在应用程序之内进行外部命令的创建或执行进程时,需要考虑安全因素。如果在用于执行的命令字符串的任意部分中使用用户输入,则存在严重的漏洞。攻击者可以注入额外的命令,并且在应用程序服务器中执行这些命令,从而发动进程或命令注入攻击。如果攻击者能够运行任意命令,就可以导致拒绝服务 (DoS)、数据损坏、数据安全性违规以及其他风险。

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

缓解与预防

可以通过验证所有来自应用程序外部的输入(例如用户输入、文件输入、系统参数等)防止来自用户输入的进程或命令注入攻击。验证应包括长度和内容。理想情况是在进程创建命令中避免使用用户数据。应对任何其他接受的字符进行转义。在每个数据源处执行验证,例如从 HTTP 请求或用户界面(例如应用程序或控制台)读取每个参数时。

漏洞代码示例 1

复制
    import javax.servlet.*;
     public void checkHost(ServletRequest req) throws IOException {
         // Source of data from HTTP request in servlet
         String hostName = req.getParameter("userHostName");
         String command = "nslookup " + hostName;
         Process proc = Runtime.getRuntime().exec(command);
         // ...
     }

Klocwork 在第 6 行报告 SV.EXEC 缺陷,指出:hostName 包含来自 HTTP 请求参数的数据,因此可能已被污染(第 4 行)。此值与常数字符串连接,并且存储在第 5 行的 command 中。command 在第 6 行作为 shell 命令执行,因此主机系统容易受到由攻击者执行的危险命令的攻击。

漏洞代码示例 2

复制
    import jakarta.servlet.*;
     public void checkHost(ServletRequest req) throws IOException {
         // Source of data from HTTP request in servlet
         String hostName = req.getParameter("userHostName");
         String command = "nslookup " + hostName;
         Process proc = Runtime.getRuntime().exec(command);
         // ...
     }

Klocwork 在第 6 行报告 SV.EXEC 缺陷,指出:hostName 包含来自 HTTP 请求参数的数据,因此可能已被污染(第 4 行)。此值与常数字符串连接,并且存储在第 5 行的 command 中。command 在第 6 行作为 shell 命令执行,因此主机系统容易受到由攻击者执行的危险命令的攻击。

安全培训

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

扩展

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