You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

测试方法中Deserialization of Untrusted Data漏洞:是否抑制及修复方案

问题分析与解决方案

是否应该抑制警告?

  • 如果你的appSettings.json仅由可信人员维护,部署后不会被不可信用户修改或替换,可以考虑临时抑制,但更推荐做安全加固;
  • 如果该文件可能被外部人员篡改、或来自不可信来源(比如用户上传、网络获取),绝对不能抑制,必须修复漏洞。

Checkmarx标记这个问题,是因为反序列化不可信数据可能被利用来执行恶意代码、篡改程序状态——哪怕是配置文件,一旦被篡改后反序列化,也可能导致意料之外的风险。


修复方案(按推荐优先级排序)

1. 使用.NET官方配置系统替代手动反序列化

.NET原生的IConfiguration系统是处理配置文件的标准方式,内部做了安全约束,能避免Checkmarx的扫描警告,同时更符合.NET最佳实践:

// ASP.NET Core场景(Program.cs中配置)
var builder = WebApplication.CreateBuilder(args);
// 自动加载appSettings.json
builder.Configuration.AddJsonFile("appSettings.json", optional: false, reloadOnChange: true);

// 绑定到TestData类
var testData = builder.Configuration.Get<TestData>();

// 非ASP.NET Core场景(比如控制台程序)
var configuration = new ConfigurationBuilder()
    .AddJsonFile("appSettings.json", optional: false)
    .Build();

var testData = configuration.Get<TestData>();

这个方式的优势:官方实现了安全的类型绑定,不会触发不可信数据反序列化的风险,同时支持配置重载、环境区分等高级功能。

2. 严格限制反序列化允许的类型

如果必须手动读取文件反序列化,要通过JsonSerializerOptions严格限定只能反序列化TestData类型,防止攻击者注入恶意类型:

var options = new JsonSerializerOptions
{
    TypeInfoResolver = new DefaultJsonTypeInfoResolver
    {
        Modifiers =
        {
            typeInfo =>
            {
                // 只允许TestData类型被反序列化
                if (typeInfo.Type != typeof(TestData))
                {
                    typeInfo.Ignore = true;
                }
            }
        }
    }
};

var jsonContent = File.ReadAllText("appSettings.json");
var testData = JsonSerializer.Deserialize<TestData>(jsonContent, options);

3. 验证配置文件的完整性

添加哈希校验,确保appSettings.json没有被篡改后再反序列化:

// 预先计算好的可信哈希值(部署时生成并存储在安全位置)
var trustedHash = "预先计算的SHA256哈希字符串";

// 读取文件并计算哈希
using var sha256 = SHA256.Create();
using var fileStream = File.OpenRead("appSettings.json");
var fileHash = Convert.ToBase64String(sha256.ComputeHash(fileStream));

// 校验哈希
if (fileHash != trustedHash)
{
    throw new InvalidOperationException("配置文件已被篡改");
}

// 校验通过后再反序列化
var jsonContent = File.ReadAllText("appSettings.json");
var testData = JsonSerializer.Deserialize<TestData>(jsonContent);

内容的提问来源于stack exchange,提问作者MAK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 10:42:21