SV.SHARED.VAR

如果某个值从静态字段获取,而未在特定方法中进行序列化,且此方法以可传递的方式从 servlet 的 doPost 或 doGet 方法调用,则将出现此错误。这是一个线程安全性问题,因为 servlet 类的一个实例由多个线程共享。

漏洞与风险

存在漏洞是因为 servlet 为多线程,且共享的静态变量未受保护以免受到并发访问的影响。这在 J2EE 应用程序中是典型的编程错误,因为多线程由框架处理。攻击者可利用共享变量获取信息或造成拒绝服务 (DoS) 状况。如果此共享数据包含敏感信息,其可能被操纵或显示在其他用户会话中。如果此数据用于控制应用程序,其值可能被操纵,导致应用程序崩溃或表现不佳。

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

缓解与预防

通过删除两个 servlet 之间使用的静态变量或用于在绝对需要共享访问时提供保护的静态变量,可以防止共享变量漏洞。在这种情况下,应同步访问。

示例 1

复制
    public static class Counter extends HttpServlet {
      static int count = 0;
      protected void doGet(HttpServletRequest in,
          HttpServletResponse out) throws ServletException,
          IOException {
        out.setContentType("text/plain");
        PrintWriter p = out.getWriter();
        count++;
        p.println(count + " hits so far!");
      }
    }

针对第 24 和 25 报告 SV.SHARED.VAR:可从 servlet 代码访问的静态变量“count”未同步访问。

安全培训

应用程序安全培训材料由 Secure Code Warrior 提供。