CS.SV.TAINTED.ALLOC_SIZE

内存分配中使用了未经验证的输入

每当从用户或外部环境接受输入的时候,都应该在使用前验证类型、长度、格式和范围。在得到妥善验证之前,数据将被视为已被污染。CS.SV.TAINTED 系列检查器会查找代码中使用已污染数据的情况。

CS.SV.TAINTED.ALLOC_SIZE 检查器会标记出那些使用被污染的数据来确定内存分配大小的代码。

漏洞与风险

当代码输入未经妥善验证时,攻击者可以精心地将输入编制为并非应用程序所预期的格式。接收意外的输入可能导致控制流被改变、任意的资源控制以及任意的代码执行。通过此类机会,攻击者可以

  • 提供无法预料的值并导致程序崩溃
  • 导致过度的资源消耗
  • 读取机密数据
  • 使用恶意输入来修改数据或改变控制流
  • 执行任意命令

使用用户提供的整型值来分配内存可能导致过度的资源消耗。如果用户传递了极大的整型值,应用程序将分配极大的内存数量。这将导致应用程序大量消耗系统内存并可能致使系统停机并触发拒绝服务 (DoS) 攻击。

缓解与预防

要避免受污染输入错误:

  • 了解所有可能导致不受信任的输入进入软件的区域:参数或自变量、Cookie、读取自网络的输入、环境变量、反向 DNS 查找、查询结果、文件名、数据库以及任何外部系统
  • 使用白名单或“已知正确”策略进行输入,而不是仅依赖于黑名单或“已知错误”策略
  • 确保对输入的所有相关属性进行验证,包括长度、输入类型、范围、缺失或额外输入、语法以及一致性
  • 如果在应用程序的客户端一侧有安全性检查,请确保也在服务器端重复一遍
  • 如果应用程序组合来自多个来源的输入,请在组合来源之后再执行验证

漏洞代码示例

复制
   namespace myNamespace
   {    
       class AllocateBuffer
       {
           public static void TryAllocateBuffer()
           {            
               int input_value = Console.Read();
               int[] integerArray = new int[input_value]; 
    }
      }
  }

在此代码中,input_value 通过调用 Console.Read() 从用户输入得到复制,并用作运算符 new 的操作数,无需经过验证。这可能会因为任意大的内存分配,造成过度的内存消耗。Klocwork 将此漏洞报告为 CS.SV.TAINTED.ALLOC_SIZE 缺陷。

修正代码示例

复制
   namespace myNamespace
   {    
       class AllocateBuffer
       {
           public static void TryAllocateBuffer()
           {            
               int input_value = Console.Read();
   
            // Validate input before using it in a memory allocation 
           if (input_value > 0 && input_value <= MAX_BUFFER_SIZE)
           {
                  int[] integerArray = new int[input_value]; 
           }
          }
      }
  }

在此示例中,第 10 行受外部控制的数据仅在经过验证后才能使用,因此代码不易再遭到任意内存分配攻击。