SV.DOS.ARRSIZE

将未验证的用户输入用作数组大小时,或者使用将此输入用作数组大小的方法时,会检测到该错误。

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

漏洞与风险

对于来自应用程序外部的数据,必须进行验证之后才能供应用程序使用。如果该数据用于在应用程序中分配对象数组,则务必仔细检查数据的内容。攻击者可利用此漏洞强制应用程序分配数量很多的对象,从而大量占用应用程序服务器上的资源,并且可能导致拒绝服务 (DoS) 攻击。

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

缓解与预防

可以通过验证所有来自应用程序外部的输入(例如用户输入、文件输入、系统参数等)防止来自用户输入的 DoS 攻击。验证应包括长度和内容。在理想的情况下,对象的大小不应该取自不受信任的用户来源,例如参数。应该在每个数据源处进行该验证,例如从 HTTP 请求读取每个参数时。而且,用户输入可能包含非常小的值或非常大的值时,也应该检查用于分配的数据是否具有合理的值。

示例 1

复制
     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);
         }
         // ...
     }

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

扩展

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