CodeQL 文档

序列化检查绕过

ID: cs/serialization-check-bypass
Kind: problem
Security severity: 7.8
Severity: warning
Precision: medium
Tags:
   - security
   - external/cwe/cwe-20
Query suites:
   - csharp-security-extended.qls
   - csharp-security-and-quality.qls

点击查看 CodeQL 代码库中的查询

应该验证反序列化的字段,否则反序列化的对象可能包含无效数据。

此查询查找在构造函数中验证但未在反序列化方法中验证的字段的情况。这表明反序列化方法缺少验证步骤。

建议

如果需要验证字段,请确保在反序列化期间也执行验证。

示例

以下示例在构造函数中验证了 Age 字段,但在反序列化方法中未验证

using System;
using System.Runtime.Serialization;

[Serializable]
public class PersonBad : ISerializable
{
    public int Age;

    public PersonBad(int age)
    {
        if (age < 0)
            throw new ArgumentException(nameof(age));
        Age = age;
    }

    [OnDeserializing]
    void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
    {
        Age = info.GetInt32("age");  // BAD - write is unsafe
    }
}

通过将验证添加到反序列化方法来解决此问题,如下所示

using System;
using System.Runtime.Serialization;

[Serializable]
public class PersonGood : ISerializable
{
    public int Age;

    public PersonGood(int age)
    {
        if (age < 0)
            throw new ArgumentException(nameof(age));
        Age = age;
    }

    [OnDeserializing]
    void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
    {
        int age = info.GetInt32("age");
        if (age < 0)
            throw new SerializationException(nameof(Age));
        Age = age;  // GOOD - write is safe
    }
}

参考

  • ©GitHub, Inc.
  • 条款
  • 隐私