Бөлісу құралы:


CA5360: не вызывайте опасные методы при десериализации

Свойство Значение
Идентификатор правила CA5360
Заголовок не вызывайте опасные методы при десериализации
Категория Безопасность
Исправление является критическим или не критическим неразрывный
Включен по умолчанию в .NET 10 Нет
Применимые языки C# и Visual Basic

Причина

Вызов одного из опасных методов, перечисленных ниже, в процессе десериализации:

Все методы, которые соответствуют одному из следующих требований, могут быть обратными вызовами десериализации.

Описание правила

Небезопасная десериализация — это уязвимость, которая возникает, когда недоверенные данные используются для нарушения логики приложения, проведения атаки типа "отказ в обслуживании" или даже для выполнения произвольного кода после десериализации. Злоумышленники часто могут злоупотреблять этими функциями десериализации, когда приложение десериализует недоверенные данные, которые находятся под контролем злоумышленников. В частности, они могут вызывать опасные методы в процессе десериализации. Успешные атаки небезопасной десериализации могут позволить злоумышленнику выполнять атаки, такие как отказ в обслуживании (DoS), обход проверки подлинности и удаленное выполнение кода.

Устранение нарушений

Удалите эти опасные методы из автоматически запускаемых обратных вызовов десериализации. Вызывайте опасные методы только после проверки входных данных.

Когда лучше отключить предупреждения

Это правило можно безопасно отключить в следующих случаях.

  • Вам известно, что входные данные являются доверенными. Учитывайте, что со временем могут измениться как границы доверия, так и потоки данных приложения.
  • Сериализованные данные защищены от незаконного изменения. После сериализации криптографически подпишите сериализованные данные. Перед десериализацией проверьте криптографическую подпись. Защитите криптографический ключ от раскрытия и реализуйте регулярную смену ключей.
  • Данные проверяются на безопасность для приложения.

Отключение предупреждений

Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.

#pragma warning disable CA5360
// The code that's violating the rule is on this line.
#pragma warning restore CA5360

Чтобы отключить правило для файла, папки или проекта, задайте его серьезность none в файле конфигурации.

[*.{cs,vb}]
dotnet_diagnostic.CA5360.severity = none

Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.

Примеры псевдокода

Нарушение

using System;
using System.IO;
using System.Runtime.Serialization;

[Serializable()]
public class ExampleClass : IDeserializationCallback
{
    private string member;

    void IDeserializationCallback.OnDeserialization(Object sender)
    {
        var sourceFileName = "malicious file";
        var destFileName = "sensitive file";
        File.Copy(sourceFileName, destFileName);
    }
}

Решение

using System;
using System.IO;
using System.Runtime.Serialization;

[Serializable()]
public class ExampleClass : IDeserializationCallback
{
    private string member;

    void IDeserializationCallback.OnDeserialization(Object sender)
    {
        var sourceFileName = "malicious file";
        var destFileName = "sensitive file";
        // Remove the potential dangerous operation.
        // File.Copy(sourceFileName, destFileName);
    }
}