SV.DOS。ARRSIZE:Klocwork 中未经验证的用户输入'sigFileInputStream.available()',用于以下行



我正在使用klocwok来审查我的代码。对于给定的代码行:

byte sigToVerify = new byte[sigFileInputStream.available()];

我收到以下错误报告:

SV.DOS。ARRSIZE:未经验证的用户输入 sigFileInputStream.available()用于数组大小 - 攻击者可以 指定导致服务器上资源使用率较高的大量数字 和 DOS 攻击

请帮我解决这个问题。

如果没有更多的代码片段可以继续,我认为 Klocwork 在这里报告了一个有效的问题。您应该查看为 SV 提供的文档。DOS。ARRSIZE 检查器,它解释了为什么会报告这种情况。关于漏洞和风险

在验证应用程序外部数据的使用之前 由应用程序使用。如果此数据用于分配数组 对象在应用程序中,数据的内容必须紧密 检查。攻击者可以利用此漏洞强制 应用程序分配非常大量的对象,导致高 应用程序服务器上的资源使用情况以及 拒绝服务 (DoS( 条件。

关于缓解和预防

防止来自用户输入的 DoS 攻击可以通过以下方法实现 验证来自应用程序外部的任何和所有输入(用户输入、 文件输入、系统参数等(。验证应包括长度 和内容。...还应检查用于分配的数据 合理的值,假设用户输入可能包含非常小的值 或非常大的值

甚至 Java InputStream API 文档(FileInputStream 是其中的子类(也警告说,使用 available() 方法的返回值是一个坏主意:

请注意,虽然 InputStream 的某些实现将返回 流中的总字节数,许多不会。它永远不会 更正后使用此方法的返回值分配缓冲区 旨在保存此流中的所有数据。

如何修复代码以避免这种情况的一个示例是,如上所述,在使用 available() 分配数组之前验证 返回的值:

int buffSize = sigFileInputStream.available();
if (buffSize > 0 && buffSize < 100000000) { // 100MB
  byte sigToVerify = new byte[buffSize];
  // do something with sigToVerify ...
} else {
  // error
}
请注意,100000000

或 100MB sigToVerify对于您的目的来说可能仍然太大,或者可能太小。 您应该根据代码尝试完成的内容确定要在此处使用的最合理的值。

相关内容

最新更新