89548


シリアライザーのデシリアライズ処理において、任意の型のインスタンスを生成しプロパティをセットする機能が提供されていることが多いと思います。  
そのような事が出来る場合、細工されたデータをデシリアライズした時に、セキュリティリスクが発生するBCLまたはASP.NETのクラスは有りますか？

シリアライザーは`System.Runtime.Serialization.NetDataContractSerializer`のような、ペイロードに埋め込まれた型名を使用するシリアライザーを想定しています。  
(実際には、`Activator.CreateInstance`と`PropertyInfo`を用いた簡易の自作デシリアライズ処理で行います)

セキュリティリスクは、メモリ上のデシリアライズしたインスタンス以外に対して変更がある(例えばプロパティに値を設定するとファイルが作成される等)ようなことを想定してます。

JavaのClassLoaderのようなクラスを想定していますが、.NETのAssemblyを始めとしたクラスでは引数付きのコンストラクターおよびメソッド呼び出しが必要なため、私は思い当たるものが有りませんでした。

もしそのようなクラスが有るのなら防いでおきたいので質問しています。  
(攻撃に利用する意図は有りません。)


CC BY-SA 4.0
2022-06-23T03:14:33.360
89536
2022-06-24T00:09:04.767
2022-06-23T05:42:36.027
9113
9113
question
c# .net
.NET に プロパティに任意の値を設定した場合でアクセスした場合にセキュリティ上危険なクラスは有りますか？


NetDataContractSerializerは、逆シリアル化の脆弱性がある事を公式に認めています。

[BinaryFormatter および関連する型を使用するときの逆シリアル化のリスク](https://docs.microsoft.com/ja-
jp/dotnet/standard/serialization/binaryformatter-security-guide)

> ## 危険な代替手段
>
> 次のシリアライザーは避けてください。
>
>   * SoapFormatter
>   * LosFormatter
>   * NetDataContractSerializer
>   * ObjectStateFormatter
>

>
> 上記のシリアライザーはすべて、無制限のポリモーフィックな逆シリアル化を実行し、BinaryFormatter と同様に危険です。


CC BY-SA 4.0
2022-06-23T08:26:03.277
89548
2022-06-24T00:09:04.767
2022-06-24T00:09:04.767
3060
41943
89536
answer


> もしそのようなクラスが有るのなら防いでおきたい

セキュリティの大前提としてblack
list方式は危険です。今回の例で言えば.NETは常に更新され、クラス・プロパティは順次追加されているため、仮に問題となるクラス・プロパティが追加されてもそれに追従できないことになります。white
list方式で安全と分かっているクラス・プロパティを列挙すべきです。

で、white
list方式で管理しきれないとしたらアプローチを改めるべきです。そもそも「改竄されていてもわかる範囲で読み込みたい」という出発点がおかしいです。改竄され得ることが問題であれば、改竄チェックをし、改竄されていたらその時点で破棄すればいいはずです。


CC BY-SA 4.0
2022-06-23T20:00:09.647
89560
2022-06-23T20:00:09.647
4236
89536
answer