BinaryFormatter および関連する型を使用するときの逆シリアル化のリスク
この記事は、次の型に適用されます。
この記事は、次の .NET 実装に適用されます。
- .NET Framework (すべてのバージョン)
- .NET Core 2.1 - 3.1
- .NET 5 以降
注意事項
BinaryFormatter 型は危険であり、データ処理用としては "推奨されません"。 アプリケーションでは、処理するデータが信頼できると思われる場合でも、できるだけ早く BinaryFormatter
の使用をやめる必要があります。 BinaryFormatter
は安全ではなく、セキュリティで保護することはできません。
Note
.NET 9 以降では、以前に使用を有効にした設定であっても、インボックス BinaryFormatter 実装では使用時に例外がスローされます。 これらの設定も削除されます。 詳細については、「BinaryFormatter 移行ガイド」を参照してください。
逆シリアル化の脆弱性
逆シリアル化の脆弱性は、要求ペイロードが安全でない方法で処理される脅威のカテゴリです。 攻撃者がこのような脆弱性をアプリに対して利用することに成功すると、サービス拒否 (DoS)、情報漏えい、またはターゲット アプリ内でのリモート コード実行が発生する可能性があります。 このリスク カテゴリは、常に OWASP Top 10 に入っています。 ターゲットには、C/C++、Java、C# などのさまざまな言語で記述されたアプリが含まれます。
.NET では、最大のリスクのターゲットは、BinaryFormatter 型を使用してデータを逆シリアル化するアプリです。 BinaryFormatter
は、強力で使いやすいため、.NET エコシステム全体で幅広く使用されています。 ただし、この同じ機能を使用して、攻撃者はターゲット アプリ内の制御フローに影響を与えることができます。 攻撃が成功すると、攻撃者はターゲット プロセスのコンテキスト内でコードを実行できるようになります。
単純な例えとして、ペイロードに対して BinaryFormatter.Deserialize
を呼び出すことは、そのペイロードをスタンドアロンの実行可能ファイルとして解釈して起動することと同じです。
BinaryFormatter のセキュリティの脆弱性
警告
BinaryFormatter.Deserialize
メソッドは、信頼されていない入力で使用するときは決して安全ではありません。 代わりにこの記事で後述する代替手段のいずれかの使用を検討することを強くお勧めします。
BinaryFormatter
が実装されたのは、逆シリアル化の脆弱性が脅威カテゴリとしてよく理解される前でした。 このため、そのコードは最新のベスト プラクティスに従っていません。 Deserialize
メソッドは、利用側アプリに対して攻撃者が DoS 攻撃を実行するためのベクトルとして使用できます。 これらの攻撃によって、アプリが応答しなくなったり、予期しないプロセスの終了が発生したりする可能性があります。 このカテゴリの攻撃は、SerializationBinder
またはその他の BinaryFormatter
構成スイッチを使用して軽減することはできません。 .NET では、この動作は "仕様" と見なされ、動作を変更するためのコード更新は発行されません。
BinaryFormatter.Deserialize
は、情報の漏えいやリモート コード実行など、他の攻撃カテゴリに対して脆弱な場合があります。 カスタムの SerializationBinder などの機能を使用しても、これらのリスクを適切に軽減するには不十分な可能性があります。 .NET でセキュリティ更新プログラムを実質的に公開できない新しい脆弱性が検出される可能性があります。 コンシューマーは、個々のシナリオを評価し、これらのリスクに対する潜在的な危険を検討する必要があります。
BinaryFormatter
を利用している場合は、アプリで個々のリスク評価を実行することをお勧めします。 BinaryFormatter
を利用するかどうかの判断に関する責任は、すべてコンシューマーにあります。 使用を検討している場合は、セキュリティ、技術、評判、法律、規制上の影響をリスク評価する必要があります。
推奨される代替手段
.NET には、信頼されていないデータを安全に処理できるいくつかの付属シリアライザーが用意されています。
- XmlSerializer と DataContractSerializer (オブジェクト グラフを XML との間でシリアル化するためのもの)。
DataContractSerializer
と NetDataContractSerializer を混同しないようにしてください。 - BinaryReader と BinaryWriter (XML および JSON 向け)。
- System.Text.Json API (オブジェクト グラフを JSON にシリアル化するためのもの)。
危険な代替手段
次のシリアライザーは避けてください。
上記のシリアライザーはすべて、無制限のポリモーフィックな逆シリアル化を実行し、BinaryFormatter
と同様に危険です。
データを信頼できるものと想定するリスク
しばしばアプリ開発者は、信頼された入力のみを処理していると考えることがあります。 安全な入力という条件は、一部のまれな状況では真です。 しかし、開発者が気付かないうちにペイロードが信頼の境界を越えることの方が、より一般的です。
従業員がワークステーションからデスクトップ クライアントを使用してサービスを操作するオンプレミス サーバーについて考えてみます。 このシナリオは、BinaryFormatter
の使用が許容される "安全な" 環境として単純に見られる場合があります。 ただし、このシナリオは、1 人の従業員のコンピューターにアクセスできれば企業全体への拡散が可能になるマルウェアのベクトルを示しています。 そのマルウェアは、企業で BinaryFormatter
が使用されていることを利用して、従業員のワークステーションからバックエンド サーバーに横方向に移動できます。 その後、会社の機密データを抜き取ることができます。 このようなデータには、取引先の機密情報や顧客データが含まれます。
保存状態を保持するために BinaryFormatter
を使用するアプリについても検討してみます。 これは、自前のハード ドライブ上のデータを読み書きすることは軽微な脅威を表すため、最初は安全なシナリオであるように思えます。 ただし、電子メールまたはインターネットでドキュメントを共有することは一般的です。ほとんどのエンド ユーザーは、これらのダウンロードしたファイルを開くことを危険な動作として認識していません。
このシナリオは、不正な効果を得るために利用できます。 アプリがゲームである場合、保存ファイルを共有しているユーザーは、知らずに危険にさらされます。 開発者自身もターゲットになり得ます。 攻撃者は、悪意のあるデータ ファイルを添付した電子メールを開発者のテクニカル サポートに送信し、サポート スタッフにそのファイルを開くように依頼するかもしれません。 この種の攻撃によって、攻撃者が企業に足掛かりを得る可能性があります。
もう 1 つのシナリオは、データ ファイルがクラウド ストレージに格納され、ユーザーのコンピューター間で自動的に同期される場合です。 クラウド ストレージ アカウントにアクセスできた攻撃者によって、データ ファイルが汚染される可能性があります。 このデータ ファイルは、ユーザーのコンピューターに自動的に同期されます。 次回ユーザーがデータ ファイルを開いたときに、攻撃者のペイロードが実行されます。 そのため、攻撃者はクラウド ストレージ アカウントの侵害を利用して、完全なコード実行アクセス許可を得ることができます。
デスクトップ インストール モデルからクラウド ファースト モデルに移行するアプリを考えてみましょう。 このシナリオには、デスクトップ アプリやリッチ クライアント モデルから Web ベースのモデルに移行するアプリが含まれます。 デスクトップ アプリ用に描かれた脅威モデルは、必ずしもクラウドベースのサービスに適用されるとは限りません。 デスクトップ アプリの脅威モデルでは、特定の脅威を "クライアントが自分自身を攻撃することは関心の対象ではない" として無視することがあります。しかし、リモート ユーザー (クライアント) がクラウド サービス自体を攻撃していると見なされる場合、同じ脅威が関心の対象となる可能性があります。
注意
一般的に、シリアル化の目的は、オブジェクトをアプリの内外に送信することです。 脅威のモデル化の演習では、ほとんどの場合、この種類のデータ転送を信頼境界越えとしてマークします。
関連項目
- BinaryFormatter 移行ガイド
- バイナリ シリアル化
BinaryFormatter
を利用しているアプリがどのように敵対者の攻撃を受けているかを調査するには、YSoSerial.Net を参照してください。- 逆シリアル化の脆弱性に関する一般的な背景情報:
.NET