CA2310:安全ではないデシリアライザー NetDataContractSerializer を使用しないでください

プロパティ
ルール ID CA2310
Title 安全ではないデシリアライザー NetDataContractSerializer を使用しないでください
[カテゴリ] Security
修正が中断か中断なしであるか なし
.NET 8 では既定で有効 いいえ

原因

System.Runtime.Serialization.NetDataContractSerializer 逆シリアル化メソッドが呼び出されたか、参照されました。

規則の説明

安全でない逆シリアライザーは、信頼されていないデータを逆シリアル化するときに脆弱です。 攻撃者がシリアル化されたデータを変更して予期されない型を追加し、悪意のある副作用を持つオブジェクトを挿入する可能性があります。 たとえば、安全でない逆シリアライザーに対する攻撃では、基になるオペレーティング システムでコマンドが実行されたり、ネットワークを介して通信されたり、ファイルを削除されたりする可能性があります。

この規則は、System.Runtime.Serialization.NetDataContractSerializer 逆シリアル化メソッド呼び出しまたは参照を検索します。 Binder プロパティが型を制限するように設定されている場合にのみ逆シリアル化を行うには、この規則を無効にし、代わりに規則 CA2311CA2312 を有効にします。 逆シリアル化できる型を制限することで、既知のリモート コード実行攻撃の緩和に役立つことがありますが、逆シリアル化はサービス拒否攻撃に対して依然として脆弱です。

NetDataContractSerializer は安全ではなく、セキュリティで保護することはできません。 詳細については、「BinaryFormatter セキュリティ ガイド」を参照してください。

違反の修正方法

  • 代わりに安全なシリアライザーを使用し、攻撃者が任意の型を指定して逆シリアル化することを許可しないでください。 詳細については、推奨される代替手段を参照してください。
  • シリアル化されたデータを改ざん防止にします。 シリアル化後に、シリアル化されたデータに暗号化署名します。 逆シリアル化する前に、暗号化署名を検証します。 暗号化キーの開示を防止し、キーのローテーションを設計します。
  • このオプションを使用すると、サービス拒否攻撃やリモート コード実行攻撃に対してコードが脆弱になります。 詳細については、「BinaryFormatter セキュリティ ガイド」をご覧ください。 逆シリアル化された型を制限します。 カスタムの System.Runtime.Serialization.SerializationBinder を実装します。 逆シリアル化する前に、すべてのコード パスで、Binder プロパティをカスタムの SerializationBinder インスタンスに設定します。 オーバーライドした BindToType メソッドで、予期しない型の場合は例外をスローして、逆シリアル化を停止します。

どのようなときに警告を抑制するか

NetDataContractSerializer は安全ではなく、セキュリティで保護することはできません。

疑似コードの例

違反

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

public class ExampleClass
{
    public object MyDeserialize(byte[] bytes)
    {
        NetDataContractSerializer serializer = new NetDataContractSerializer();
        return serializer.Deserialize(new MemoryStream(bytes));
    }
}
Imports System.IO
Imports System.Runtime.Serialization

Public Class ExampleClass
    Public Function MyDeserialize(bytes As Byte()) As Object
        Dim serializer As NetDataContractSerializer = New NetDataContractSerializer()
        Return serializer.Deserialize(New MemoryStream(bytes))
    End Function
End Class

CA2311:最初に NetDataContractSerializer.Binder を設定しないで逆シリアル化しないでください

CA2312:NetDataContractSerializer.Binder を設定してから逆シリアル化してください