CS.SV.TAINTED.DESERIALIZATION
在对象创建的反序列化期间使用未验证的整数
每当从用户或外部环境接受输入的时候,都应该在使用前验证类型、长度、格式和范围。在得到妥善验证之前,数据将被视为已被污染。CS.SV.TAINTED 系列检查器会查找代码中使用已污染数据的情况。
CS.SV.TAINTED.DESERIALIZATION 检查器会标记代码,其中将未验证的数据作为参数传递给对象构造函数调用,而且在该调用内将该数据用于任何内部成员分配。此类使用会构成被污染的数据反序列化,因此检查器会将其报告为潜在危险。
漏洞与风险
当代码输入未经妥善验证时,攻击者可以精心地将输入编制为并非应用程序所预期的格式。接收意外的输入可能导致控制流被改变、任意的资源控制以及任意的代码执行。通过此类机会,攻击者可以
- 提供无法预料的值并导致程序崩溃
- 导致过度的资源消耗
- 读取机密数据
- 使用恶意输入来修改数据或改变控制流
- 执行任意命令
使用被污染的数据构造而成的对象可能会表现出预期以外的行为,这一点对于第三方代码中定义的类的实例化尤为危险。构造此类对象可能会造成弱点遭到利用。即使在源代码可用的情况下,使用不受信任的数据构造对象也很危险,因为开发人员可能会假定任何此类对象都是有效的,而且可以安全地用到可能有危险的上下文中。
漏洞代码示例
复制
using System;
using System.IO;
namespace TaintedResource {
class TestTaintedResource {
const string fileName = "File.dat";
public static void TaintedResourceExample1() {
int taintedIntValue = Console.Read();
SimpleVariableTest test1 = new SimpleVariableTest(taintedIntValue); // CS.SV.TAINTED.DESERIALIZATION
}
}
class SimpleVariableTest
{
public SimpleVariableTest(int value) {
setIntValue = value;
}
private int setIntValue;
}
}
Klocwork 针对第 9 行生成问题报告,这表示“在第 9 行通过调用 constructor 进行数据的反序列化期间,使用了从第 8 行的 Read 接收的未验证整数值 taintedIntValue”。在此情况下,在调用构造函数以创建对象时,可能已污染的数据会被作为参数发送,实际上会将参数的值分配给构造函数类的字段成员,因此可能遭到恶意用户利用。
修正代码示例
复制
using System;
using System.IO;
namespace TaintedResource {
class TestTaintedResource {
const string fileName = "File.dat";
public static void TaintedResourceExample1() {
int taintedIntValue = Console.Read();
if (taintedIntValue > MAX_VALUE || taintedIntValue < MIN_VALUE)
{
return;
}
SimpleVariableTest test1 = new SimpleVariableTest(taintedIntValue);
}
}
class SimpleVariableTest
{
public SimpleVariableTest(int value) {
setIntValue = value;
}
private int setIntValue;
}
}
在此示例中,Klocwork 不再报告缺陷,因为整数 num 在用到构造函数调用中之前,已在第 9 行进行了检查。
相关检查器
- CS.RESOURCE.LOOP
- CS.SV.TAINTED.ALLOC_SIZE
- CS.SV.TAINTED.BINOP
- CS.SV.TAINTED.CALL.BINOP
- CS.SV.TAINTED.CALL.GLOBAL
- CS.SV.TAINTED.CALL.INDEX_ACCESS
- CS.SV.TAINTED.CALL.LOOP_BOUND
- CS.SV.TAINTED.CALL.LOOP_BOUND.RESOURCE
- CS.SV.TAINTED.GLOBAL
- CS.SV.TAINTED.INDEX_ACCESS
- CS.SV.TAINTED.LOOP_BOUND
- CS.SV.TAINTED.LOOP_BOUND.RESOURCE