Share via


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

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

原因

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

規則の説明

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

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

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

違反の修正方法

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

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

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

疑似コードの例

違反

using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

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

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

CA2301:最初に BinaryFormatter.Binder を設定しないで BinaryFormatter.Deserialize を呼び出さないでください

CA2302:BinaryFormatter.Deserialize を呼び出す前に BinaryFormatter.Binder が設定されていることを確認します