セキュリティとシリアル化Security and Serialization

シリアル化によって、他の方法ではアクセスできないオブジェクト インスタンス データを他のコードから参照または変更できるようになるため、シリアル化を実行するコードには、特殊なアクセス許可として、 SecurityPermission フラグが指定された SerializationFormatter が必要です。Because serialization can allow other code to see or modify object instance data that would otherwise be inaccessible, a special permission is required of code performing serialization: SecurityPermission with the SerializationFormatter flag specified. 既定のポリシーでは、インターネットからダウンロードしたコードまたはイントラネット コードにはこのアクセス許可は与えられず、ローカル コンピューター上のコードにだけ付与されます。Under default policy, this permission is not given to Internet-downloaded or intranet code; only code on the local computer is granted this permission.

通常、オブジェクト インスタンスのすべてのフィールドはシリアル化されます。つまり、データは、インスタンスのシリアル化されたデータで表されます。Normally, all fields of an object instance are serialized, meaning that data is represented in the serialized data for the instance. 形式を解釈できるコードでは、メンバーのアクセシビリティとは関係なく、データ値を判断できます。It is possible for code that can interpret the format to determine what the data values are, independent of the accessibility of the member. 同様に、逆シリアル化でもアクセシビリティ規則に関係なく、シリアル化された表現からデータを抽出し、オブジェクトの状態を直接設定します。Similarly, deserialization extracts data from the serialized representation and sets object state directly, again irrespective of accessibility rules.

機密データを含む可能性のあるオブジェクトは、可能であれば、シリアル化できないようにしてください。Any object that could contain security-sensitive data should be made nonserializable, if possible. そのようなオブジェクトをシリアル化しなければならない場合、機密データを保持する特定のフィールドは、シリアル化できないように維持してください。If it must be serializable, try to make specific fields that hold sensitive data nonserializable. これが不可能な場合は、このデータが、シリアル化のアクセス許可を持つあらゆるコードに公開されることに注意し、絶対に、悪質なコードがこのアクセス許可を取得できないようにしてください。If this cannot be done, be aware that this data will be exposed to any code that has permission to serialize, and make sure that no malicious code can get this permission.

ISerializable インターフェイスは、シリアル化インフラストラクチャでのみ使用するためのものです。The ISerializable interface is intended for use only by the serialization infrastructure. ただし、保護されていない場合、機密情報をリリースする可能性があります。However, if unprotected, it can potentially release sensitive information. ISerializableを実装してカスタムのシリアル化を提供する場合は、必ず次の予防措置を取ってください。If you provide custom serialization by implementing ISerializable, make sure you take the following precautions:

  • GetObjectData SerializationFormatter アクセス許可を指定した SecurityPermission を要求するか、メソッドの出力で機密情報がリリースされないことを確実にして、 メソッドを明示的に保護します。The GetObjectData method should be explicitly secured either by demanding the SecurityPermission with SerializationFormatter permission specified or by making sure that no sensitive information is released with the method output. 例えば:For example:

    Public Overrides<SecurityPermissionAttribute(SecurityAction.Demand, SerializationFormatter := True)>  _  
    Sub GetObjectData(info As SerializationInfo, context As StreamingContext)  
    End Sub  
    
    [SecurityPermissionAttribute(SecurityAction.Demand,SerializationFormatter   
    =true)]  
    public override void GetObjectData(SerializationInfo info,   
    StreamingContext context)  
    {  
    }  
    
  • シリアル化に使用する特殊なコンストラクターでも徹底的な入力検証を行い、悪質なコードによる悪用を防ぐために、コンストラクターを保護するか、またはプライベートにする必要があります。The special constructor used for serialization should also perform thorough input validation and should be either protected or private to help protect against misuse by malicious code. また、クラスを明示的に作成したり、ある種のファクトリで間接的に作成したりするなど、他の方法でこのようなクラスのインスタンスを取得する場合にも、同じセキュリティ チェックとアクセス許可を適用してください。It should enforce the same security checks and permissions required to obtain an instance of such a class by any other means, such as explicitly creating the class or indirectly creating it through some kind of factory.

関連項目See also