SV.TAINT_NATIVE

被污染的数据进入了本机代码

当将未检查的用户输入传递到本机方法调用时,将发生该错误。

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

漏洞与风险

本机代码通常是 C/C++ 代码。该语言具有固有的安全性风险。如果用户输入引入了本机代码,可能造成比任何 Java 代码都危险得多的问题,比如缓冲区溢出和由 JVM 崩溃导致的拒绝服务攻击 (DoS)。

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

缓解与预防

在将用户数据传递给本机方法之前,对所有数据消毒。至少也要检查用户数据的大小和危险符号,比如“\0”。此外,强烈推荐在对字符串进行危险符号检查之前,对字符串进行规范化

漏洞代码示例 1

复制
     import javax.servlet.http.*;
     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
         String name = req.getParameter("userName");
         processNatively(name);
     }
 
     private native void processNatively(String name);

Klocwork 在第 4 行报告 SV.TAINT_NATIVE 缺陷,指出:来自 name 的受污染数据进入了本机代码调用中,这可能导致缓冲区溢出和其他严重错误。

漏洞代码示例 2

复制
     import jakarta.servlet.http.*;
     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
         String name = req.getParameter("userName");
         processNatively(name);
     }
 
     private native void processNatively(String name);

Klocwork 在第 4 行报告 SV.TAINT_NATIVE 缺陷,指出:来自 name 的受污染数据进入了本机代码调用中,这可能导致缓冲区溢出和其他严重错误。

扩展

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