SV.TAINT

被污染的数据

当来自用户输入的数据被跟踪发现用在可能存在危险的位置时,将检测到该错误。该错误针对从 Web 接口通过 HTTP 请求进行输入开始,到应用程序中的最终目标,对数据流全程进行分析。在查找其他未验证/受污染数据错误类型可能遗漏的漏洞时,该方法很有用。

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

漏洞与风险

使用未经验证的用户输入通常都存在安全漏洞。即使目前的应用程序迭代不会以危险的方式使用它,但未来的迭代可能会,并且通常将数据假设为未受污染。所有用户输入都应在进入应用程序时,针对长度和内容进行检查,以便在将来使用数据时不容易受到漏洞攻击。

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

缓解与预防

可以通过验证所有来自应用程序外部的输入(用户输入、文件输入、系统参数等等)实现对未经验证的用户输入、受污染数据和其他来自用户输入的相关漏洞的缓解。验证应包括长度和内容。通常仅需要字母数字字符(即 A-Z、a-z、0-9)。应对任何其他接受的字符进行转义。应该在每个数据源处进行该验证,例如从 HTTP 请求读取每个参数时。

漏洞代码示例 1

复制
import javax.servlet.http.*;
protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
         String act = req.getParameter("action");
         String value = req.getParameter("actionValue");
         System.setProperty(act, value);
 }

在第 5 行报告 SV.TAINT:可能存在受污染数据漏洞。未经检查的用户数据存储在 act 中,并进入对安全性很敏感的方法中。

漏洞代码示例 2

复制
import jakarta.servlet.http.*;
 protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
         String act = req.getParameter("action");
         String value = req.getParameter("actionValue");
         System.setProperty(act, value);
 }

在第 5 行报告 SV.TAINT:可能存在受污染数据漏洞。未经检查的用户数据存储在 act 中,并进入对安全性很敏感的方法中。

扩展

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