SV.DOS.ARRINDEX

用于数组分配的受污染的 size

将未验证的用户输入用作数组索引时,或者使用将此输入用作数组索引的方法时,会出现该错误。

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

漏洞与风险

将未验证的用户输入用作数组索引时,或者使用将此输入用作数组索引的方法时,攻击可能导致这些方法引发 ArrayOutOfBounds 异常。然后可将其用于发动拒绝服务攻击,或者操纵声明的对象来创建备用控制流,这些控制流可被攻击者利用。例如,如果打印出错误,那么可能会向攻击者泄露某些信息。如果在身份验证期间出现错误,可能会产生“开启失败”条件,从而使攻击者获取未经授权的会话。

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

缓解与预防

可以通过验证所有来自应用程序外部的输入(例如用户输入、文件输入、系统参数等)防止来自用户输入的拒绝服务 (DoS) 攻击。验证应该包括使用来自适当的可访问容器的信息进行边界验证。

漏洞代码示例 1

复制
     import javax.servlet.http.*;
     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
                                                                                    IOException {
         String size = req.getParameter("size");
         final int value;
         try {
             value = Integer.parseInt(size);
         } catch (NumberFormatException e) {
             resp.sendError(505, "Internal Error");
             return;
         }
         String arr[] = new String[value];
         for (int i = 0; i < arr.length; i++) {
             arr[i] = req.getParameter("field" + i);
         }
         // ...
     }

在第 12 行报告 SV.DOS.ARRSIZE,指出:size 包含来自 HTTP 请求的字符串,因此可能已被污染(第 4 行)。第 7 行中分析了受污染的 size 字符串,并且将分析结果存储在 value 中,此结果在第 12 行中用于数组分配。这样可能导致 DoS 攻击,因为攻击者可以指定很大的数值,从而大量占用服务器上的资源。

漏洞代码示例 2

复制
     import jakarta.servlet.http.*;
     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
                                                                                    IOException {
         String size = req.getParameter("size");
         final int value;
         try {
             value = Integer.parseInt(size);
         } catch (NumberFormatException e) {
             resp.sendError(505, "Internal Error");
             return;
         }
         String arr[] = new String[value];
         for (int i = 0; i < arr.length; i++) {
             arr[i] = req.getParameter("field" + i);
         }
         // ...
     }

在第 12 行报告 SV.DOS.ARRSIZE,指出:size 包含来自 HTTP 请求的字符串,因此可能已被污染(第 4 行)。第 7 行中分析了受污染的 size 字符串,并且将分析结果存储在 value 中,此结果在第 12 行中用于数组分配。这样可能导致 DoS 攻击,因为攻击者可以指定很大的数值,从而大量占用服务器上的资源。

扩展

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