测试方法中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
相关产品推荐
相关产品推荐

