Deserialization
基本情報
シリアライゼーションは、オブジェクトを保存したり、通信プロセスの一部として送信するための形式に変換する方法として理解されます。この技術は、オブジェクトが後で再作成され、その構造と状態が維持されることを保証するために一般的に使用されます。
デシリアライゼーションは、逆に、シリアライゼーションを相殺するプロセスです。特定の形式で構造化されたデータを取り、それをオブジェクトに再構築することを含みます。
デシリアライゼーションは危険である可能性があります、なぜならばそれは攻撃者がシリアライズされたデータを操作して有害なコードを実行したり、オブジェクト再構築プロセス中にアプリケーションで予期しない動作を引き起こすことができるからです。
PHP
PHPでは、シリアライゼーションおよびデシリアライゼーションプロセス中に特定のマジックメソッドが使用されます:
__sleep
: オブジェクトがシリアライズされているときに呼び出されます。このメソッドは、シリアライズする必要があるオブジェクトのすべてのプロパティの名前の配列を返すべきです。保留中のデータを確定させたり、同様のクリーンアップタスクを実行するために一般的に使用されます。__wakeup
: オブジェクトがデシリアライズされているときに呼び出されます。シリアライズ中に失われたデータベース接続を再確立したり、他の再初期化タスクを実行するために使用されます。__unserialize
: このメソッドは、オブジェクトがデシリアライズされているときに、__wakeup
の代わりに呼び出されます(存在する場合)。__wakeup
と比較して、デシリアライゼーションプロセスに対するより多くの制御を提供します。__destruct
: このメソッドは、オブジェクトが破棄される直前またはスクリプトが終了するときに呼び出されます。ファイルハンドルを閉じたり、データベース接続を閉じたりするなどのクリーンアップタスクに通常使用されます。__toString
: このメソッドはオブジェクトを文字列として扱うことを可能にします。ファイルを読み取るか、その中の関数呼び出しに基づいて他のタスクを実行するために使用され、効果的にオブジェクトのテキスト表現を提供します。
結果を見ると、オブジェクトが逆シリアル化されるときに関数**__wakeup
と__destruct
が呼び出されることがわかります。いくつかのチュートリアルでは、__toString
**関数が属性を表示しようとするときに呼び出されると記載されていますが、現在はそれが起こらなくなったようです。
クラスに実装されている場合、__unserialize(array $data)
メソッドが__wakeup()
の代わりに呼び出されます。これにより、シリアル化されたデータを配列として提供してオブジェクトを逆シリアル化することができます。このメソッドを使用してプロパティを逆シリアル化し、逆シリアル化時に必要なタスクを実行できます。
PHPの例については、こちらで詳しく説明されています。また、こちらやこちらでも確認できます。
PHPデシリアライズ + オートロードクラス
PHPのオートロード機能を悪用して、任意のPHPファイルなどを読み込むことができます:
pagePHP - Deserialization + Autoload Classes参照値のシリアライズ
何らかの理由で、値を他の値に対する参照としてシリアライズしたい場合は、次のようにします:
PHPGGC (ysoserial for PHP)
PHPGGCは、PHPの逆シリアル化を悪用するペイロードを生成するのに役立ちます。
いくつかのケースでは、アプリケーションのソースコードで逆シリアル化を悪用する方法を見つけることができないかもしれませんが、外部のPHP拡張機能のコードを悪用することができるかもしれません。
したがって、サーバーのphpinfo()
をチェックし、インターネット上(PHPGGCのガジェットを含む)で悪用できる可能性のあるガジェットを検索してください。
phar:// metadata deserialization
ファイルを読み取り、その中のPHPコードを実行しないLFIを見つけた場合、たとえばfile_get_contents()
、fopen()
、file()
、file_exists()
、md5_file()
、filemtime()
、filesize()
などの関数を使用している場合、ファイルを読み取る際に発生する逆シリアル化を悪用することができます。
詳細については、次の投稿を読んでください:
Python
Pickle
オブジェクトがアンピクルされると、関数__reduce__
が実行されます。
悪用されると、サーバーがエラーを返す可能性があります。
Pickle jails からの脱出に関する詳細は、以下をチェックしてください:
pageBypass Python sandboxesYaml & jsonpickle
次のページでは、YAML Pythonライブラリ内の安全でない逆シリアル化を悪用する技術が紹介され、Pickle、PyYAML、jsonpickle、ruamel.yaml 用のRCE逆シリアル化ペイロードを生成するために使用できるツールで終了します:
pagePython Yaml Deserializationクラスポリューション(Pythonプロトタイプポリューション)
pageClass Pollution (Python's Prototype Pollution)NodeJS
JS Magic Functions
JSにはPHPやPythonのように、オブジェクトの作成時に実行される**"マジック"関数はありません。しかし、toString
、valueOf
、toJSON
など、直接呼び出さなくても頻繁に使用される関数があります。
逆シリアル化を悪用すると、これらの関数を妥協**して他のコードを実行できる可能性があります(プロトタイプポリューションを悪用)。これらが呼び出されるときに任意のコードを実行できます。
別の**"マジック"関数を直接呼び出さずに呼び出す方法は、非同期関数(プロミス)によって返されるオブジェクトを妥協することです。なぜなら、その返されたオブジェクトを別のプロミスに変換**し、関数型の"then"プロパティを持つと、別のプロミスによって返されるため、実行されるからです。詳細はこのリンクを参照してください。
__proto__
と prototype
の汚染
__proto__
と prototype
の汚染このテクニックについて学びたい場合は、次のチュートリアルを参照してください:
pageNodeJS - __proto__ & prototype Pollutionこのライブラリは、関数をシリアル化することを可能にします。例:
シリアル化されたオブジェクトは次のようになります:
例では、関数がシリアル化されるときに _$$ND_FUNC$$_
フラグがシリアル化されたオブジェクトに追加されることがわかります。
node-serialize/lib/serialize.js
ファイルの中に、同じフラグとそのコードがどのように使用されているかが見つかります。
最後のコードチャンクで見るように、フラグが見つかった場合、eval
が使用されて関数の逆シリアル化が行われます。つまり、ユーザー入力が eval
関数の中で使用されていることになります。
ただし、関数を単にシリアル化するだけでは、それを実行することはできません。例では、コードの一部が y.rce
を呼び出している 必要があり、それは非常に 起こりにくい ことです。
とにかく、オブジェクトをデシリアライズするときにシリアル化された関数が自動的に実行されるように、オブジェクトにいくつかの括弧を追加するだけで済むかもしれません。
次のコードチャンクでは、最後の括弧 に注目し、unserialize
関数がコードを自動的に実行する方法を確認してください:
以下の通り、このライブラリは_$$ND_FUNC$$_
の後のコードを取得し、eval
を使用して実行します。したがって、コードを自動実行するためには、関数の作成部分と最後の括弧を削除し、次の例のようにJSのワンライナーを実行することができます:
以下は、この脆弱性を悪用する方法に関する詳細情報をこちらで見つけることができます。
funcsterの注目すべき側面は、標準組込オブジェクトへのアクセスの不可能性です。これらはアクセス可能な範囲外にあります。この制限により、組込オブジェクトのメソッドを呼び出そうとするコードの実行が阻止され、"ReferenceError: console is not defined"
のような例外が発生します。例えば、console.log()
やrequire(something)
などのコマンドを使用した場合です。
この制限にもかかわらず、特定のアプローチを使用することで、グローバルコンテキストへの完全なアクセス、すべての標準組込オブジェクトを含むアクセスを復元することが可能です。グローバルコンテキストを直接活用することで、この制限をバイパスすることができます。たとえば、以下のスニペットを使用してアクセスを再確立することができます。
詳細については、このソースを読んでください。
serialize-javascript パッケージは、シリアル化のためだけに設計されており、組み込みの逆シリアル化機能を持っていません。ユーザーは、自分自身の逆シリアル化メソッドを実装する責任があります。直接 eval
の使用が、シリアル化されたデータを逆シリアル化するための公式の例で提案されています。
この関数がオブジェクトをデシリアライズするために使用されている場合、それを簡単に悪用することができます:
詳細については、このソースを読んでください。
Cryoライブラリ
このライブラリを悪用して任意のコマンドを実行する方法についての情報を以下のページで見つけることができます:
Java - HTTP
Javaでは、逆シリアル化コールバックは逆シリアル化プロセス中に実行されます。この実行は、悪意のあるペイロードを作成し、これらのコールバックをトリガーすることで悪意のあるアクションの実行を引き起こす攻撃者によって悪用される可能性があります。
フィンガープリント
ホワイトボックス
コードベース内の潜在的なシリアル化の脆弱性を特定するには、次のものを検索します:
Serializable
インターフェースを実装するクラス。java.io.ObjectInputStream
、readObject
、readUnshare
関数の使用。
次の点に特に注意してください:
外部ユーザーによって定義されたパラメーターを使用する
XMLDecoder
。特にXStreamバージョンが1.46以下の場合、
XStream
のfromXML
メソッド。これはシリアル化の問題に対して脆弱です。ObjectInputStream
とreadObject
メソッドの組み合わせ。readObject
、readObjectNodData
、readResolve
、またはreadExternal
などのメソッドの実装。ObjectInputStream.readUnshared
。Serializable
の一般的な使用。
ブラックボックス
ブラックボックステストでは、Javaシリアル化オブジェクトを示す特定の シグネチャまたは "マジックバイト" を探します(ObjectInputStream
から発信):
16進数パターン:
AC ED 00 05
。Base64パターン:
rO0
。Content-type
がapplication/x-java-serialized-object
に設定されたHTTPレスポンスヘッダー。圧縮前を示す16進数パターン:
1F 8B 08 00
。圧縮前を示すBase64パターン:
H4sIA
。.faces
拡張子とfaces.ViewState
パラメーターを持つWebファイル。これらのパターンをWebアプリケーションで発見した場合は、Java JSF ViewState Deserializationに関する投稿の詳細な調査を促します。
脆弱性があるかどうかをチェックする
Java Deserialized exploitの動作原理を学びたい場合は、Basic Java Deserialization、Java DNS Deserialization、およびCommonsCollection1 Payloadを参照してください。
ホワイトボックステスト
既知の脆弱性を持つアプリケーションがインストールされていないかをチェックすることができます。
あなたは脆弱であると知られているすべてのライブラリをチェックして、Ysoserialがエクスプロイトを提供できるかどうかを試すことができます。または、Java-Deserialization-Cheat-Sheetで示されているライブラリをチェックすることもできます。 gadgetinspectorを使用して、悪用できる可能性のあるガジェットチェーンを検索することもできます。 gadgetinspectorを実行する際(ビルド後)、通過する警告/エラーの数には気にせず、完了させてください。すべての検出結果は_gadgetinspector/gadget-results/gadget-chains-year-month-day-hore-min.txt_の下に書き込まれます。gadgetinspectorはエクスプロイトを作成せず、誤検知を示す可能性があります。
ブラックボックステスト
Burp拡張機能gadgetprobeを使用すると、使用可能なライブラリ(バージョンも含む)を特定できます。この情報を使用すると、脆弱性を悪用するためのペイロードを選択するのが簡単になるかもしれません。
GadgetProbeについて詳しくはこちらを読んでください。
GadgetProbeは**ObjectInputStream
の逆シリアル化**に焦点を当てています。
Burp拡張機能Java Deserialization Scannerを使用すると、ysoserialを使用して脆弱なライブラリを特定し、それらを悪用することができます。
Java Deserialization Scannerについて詳しくはこちらを読んでください。
Java Deserialization Scannerは**ObjectInputStream
**の逆シリアル化に焦点を当てています。
また、Freddyを使用して、Burp内の逆シリアル化脆弱性を検出することもできます。このプラグインは、ObjectInputStream
関連の脆弱性だけでなく、JsonおよびYmlの逆シリアル化ライブラリからの脆弱性も検出します。アクティブモードでは、スリープまたはDNSペイロードを使用してそれらを確認しようとします。
Freddyに関する詳細情報はこちらで確認できます。
シリアル化テスト
サーバーで使用されている脆弱なライブラリをチェックするだけではありません。時には、シリアル化オブジェクト内のデータを変更して、一部のチェックをバイパスできるかもしれません(たとえば、Webアプリ内で管理者権限を付与できるかもしれません)。 Webアプリケーションに送信されるJavaシリアル化オブジェクトを見つけた場合、SerializationDumperを使用して、送信されるシリアル化オブジェクトをより人間が読みやすい形式で表示できます。送信しているデータがわかると、それを変更して一部のチェックをバイパスするのが簡単になります。
エクスプロイト
ysoserial
Javaの逆シリアル化を悪用するための主要ツールはysoserialです(こちらからダウンロード)。複雑なコマンド(たとえば、パイプを使用する)を使用できるようにするysoseral-modifiedを使用することも検討できます。
このツールは**ObjectInputStream
を悪用することに焦点を当てています。
インジェクションが可能かどうかをテストするために、RCEペイロードの前に「URLDNS」**ペイロードを使用することをお勧めします。とにかく、「URLDNS」ペイロードが機能しないかもしれませんが、他のRCEペイロードは機能するかもしれません。
java.lang.Runtime.exec() のペイロードを作成する際には、出力をリダイレクトするための ">" や "|" のような特殊文字、コマンドを実行するための "$()"、コマンドにスペースで区切られた引数を渡すことはできません(echo -n "hello world"
はできますが、python2 -c 'print "Hello world"'
はできません)。ペイロードを正しくエンコードするためには、このウェブページ を使用できます。
次のスクリプトを自由に使用して、Windows と Linux 用の すべての可能なコード実行 ペイロードを作成し、その後、脆弱なウェブページでテストしてください:
serialkillerbypassgadgets
https://github.com/pwntester/SerialKillerBypassGadgetCollection を使用して、ysoserialと組み合わせてより多くのエクスプロイトを作成できます。このツールに関する詳細は、ツールが発表されたスライドで確認できます: https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next_slideshow=1
marshalsec
marshalsecは、Javaの異なるJsonおよびYmlシリアライゼーションライブラリを悪用するペイロードを生成するために使用できます。
プロジェクトをコンパイルするために、pom.xml
にこの依存関係を追加する必要がありました:
Mavenをインストールし、プロジェクトをコンパイルしてください:
FastJSON
このJava JSONライブラリについて詳しくはこちらを参照してください: https://www.alphabot.com/security/blog/2020/java/Fastjson-exceptional-deserialization-vulnerabilities.html
Labs
いくつかのysoserialペイロードをテストしたい場合は、このWebアプリを実行できます: https://github.com/hvqzao/java-deserialize-webapp
Why
Javaはさまざまな目的でシリアル化を多用しています:
HTTPリクエスト: シリアル化は、パラメータ、ViewState、クッキーの管理などで広く利用されています。
RMI (Remote Method Invocation): 完全にシリアル化に依存するJava RMIプロトコルは、Javaアプリケーションのリモート通信の基盤です。
RMI over HTTP: この方法は、シリアル化を利用してすべてのオブジェクト通信を行うJavaベースの厚いクライアントWebアプリケーションで一般的に使用されます。
JMX (Java Management Extensions): JMXはネットワークを介してオブジェクトを転送するためにシリアル化を利用しています。
カスタムプロトコル: Javaでは、標準的な方法として、今後のエクスプロイト例でデモンストレーションされるように、生のJavaオブジェクトの転送が行われます。
Prevention
一時的なオブジェクト
Serializable
を実装するクラスは、シリアル化されてはいけないクラス内のオブジェクトをtransient
として実装できます。例:
Serializable
を実装する必要があるクラスのシリアライズを避ける
Serializable
を実装する必要があるクラスのシリアライズを避ける特定のオブジェクトがクラス階層のためにSerializable
を実装する必要があるシナリオでは、意図しない逆シリアル化のリスクがあります。これを防ぐために、以下に示すように例外を常にスローするfinal
readObject()
メソッドを定義することで、これらのオブジェクトが逆シリアル化できないようにします。
Javaにおける逆シリアル化セキュリティの強化
java.io.ObjectInputStream
をカスタマイズすることは、逆シリアル化プロセスを保護するための実用的なアプローチです。この方法は、次の場合に適しています:
逆シリアル化コードがあなたの管理下にある場合。
逆シリアル化に必要なクラスが既知の場合。
resolveClass()
メソッドをオーバーライドして、許可されたクラスに対する逆シリアル化を制限します。これにより、Bicycle
クラスのように明示的に許可されたクラス以外のクラスの逆シリアル化を防ぎます。
セキュリティ強化のためのJavaエージェントの使用は、コードの変更が不可能な場合の代替手段を提供します。この方法は、主に有害なクラスをブラックリスト化するためにJVMパラメータを使用します:
デシリアライゼーションを動的に保護する方法を提供し、即座のコード変更が実用的でない環境に最適です。
rO0 by Contrast Security で例を確認してください。
シリアライゼーションフィルターの実装: Java 9 では ObjectInputFilter
インターフェースを介してシリアライゼーションフィルターが導入され、デシリアライズされる前にシリアライズされたオブジェクトが満たす必要がある基準を指定する強力なメカニズムが提供されます。これらのフィルターはグローバルに適用するか、ストリームごとに適用することができ、デシリアライズプロセスに対して細かい制御を提供します。
シリアライゼーションフィルターを利用するには、すべてのデシリアライズ操作に適用されるグローバルフィルターを設定するか、特定のストリームに動的に構成することができます。例:
外部ライブラリを活用したセキュリティの強化: NotSoSerial、jdeserialize、Kryoなどのライブラリは、Javaの逆シリアル化を制御および監視するための高度な機能を提供します。これらのライブラリは、ホワイトリストやブラックリストのクラス、逆シリアル化前のシリアル化オブジェクトの分析、カスタムシリアル化戦略の実装など、追加のセキュリティレイヤーを提供できます。
NotSoSerial は、信頼されていないコードの実行を防ぐために逆シリアル化プロセスをインターセプトします。
jdeserialize は、逆シリアル化せずにシリアル化されたJavaオブジェクトの分析を可能にし、潜在的に悪意のあるコンテンツを特定するのに役立ちます。
Kryo は、速度と効率を重視した代替シリアル化フレームワークであり、セキュリティを強化できる構成可能なシリアル化戦略を提供します。
参考文献
逆シリアル化とysoserialに関するトーク: http://frohoff.github.io/appseccali-marshalling-pickles/
逆シリアル化CVE: https://paper.seebug.org/123/
JNDI Injection & log4Shell
JNDI Injectionとは何か、RMI、CORBA、LDAPを介してどのように悪用できるか、およびlog4shellをどのように悪用するか(およびこの脆弱性の例)については、以下のページで確認してください:
pageJNDI - Java Naming and Directory Interface & Log4ShellJMS - Java Message Service
Java Message Service (JMS) API は、2つ以上のクライアント間でメッセージを送信するためのJavaメッセージ指向ミドルウェアAPIです。これはプロデューサー-コンシューマー問題を処理する実装です。JMSはJava Platform, Enterprise Edition (Java EE)の一部であり、Sun Microsystemsで開発された仕様によって定義されましたが、その後Java Community Processによってガイドされています。これは、Java EEに基づくアプリケーションコンポーネントがメッセージを作成、送信、受信、読み取りすることを可能にするメッセージング標準です。分散アプリケーションの異なるコンポーネント間の通信を緩やかに結合し、信頼性があり非同期であることを可能にします。(Wikipediaより)。
製品
このミドルウェアを使用してメッセージを送信するいくつかの製品があります:
悪用
つまり、危険な方法でJMSを使用している多くのサービスが存在します。したがって、これらのサービスにメッセージを送信するための十分な権限がある場合(通常、有効な資格情報が必要です)、逆シリアル化される悪意のあるオブジェクトを送信できる可能性があります。 これはつまり、この悪用では、そのメッセージを使用するすべてのクライアントが感染する可能性があるということです。
サービスが脆弱であっても(ユーザー入力を安全に逆シリアル化していないため)、脆弱性を悪用するためには有効なガジェットを見つける必要があります。
ツールJMETは、既知のガジェットを使用して逆シリアル化されたいくつかの悪意のあるオブジェクトを送信してこれらのサービスに接続し攻撃するために作成されました。これらのエクスプロイトは、サービスがまだ脆弱であり、使用されたガジェットのいずれかが脆弱なアプリケーション内に存在する場合に機能します。
参考文献
.Net
.Netのコンテキストでは、逆シリアル化の脆弱性は、Javaで見られるものと同様に、オブジェクトの逆シリアル化中に特定のコードを実行するためにガジェットが悪用される方法で機能します。
フィンガープリント
WhiteBox
ソースコードを調査して、以下の出現箇所を確認する必要があります:
TypeNameHandling
JavaScriptTypeResolver
焦点は、ユーザーが制御する変数によって型が決定されるシリアライザに置かれるべきです。
BlackBox
検索対象は、サーバーサイドで逆シリアル化される可能性のあるBase64エンコードされた文字列 AAEAAAD///// やそれに類似するパターンです。これには、TypeObject
や $type
を特徴とする JSON や XML 構造が含まれる可能性があります。
ysoserial.net
この場合、ツール ysoserial.net を使用して 逆シリアル化のエクスプロイトを作成 することができます。Gitリポジトリをダウンロードしたら、例えばVisual Studioを使用してツールを コンパイル する必要があります。
ysoserial.net がどのようにしてエクスプロイトを作成するかについて学びたい場合は、ObjectDataProviderガジェット + ExpandedWrapper + Json.Netフォーマッタが説明されているこのページをチェック で確認できます。
ysoserial.net の主なオプションは、--gadget
、--formatter
、--output
、--plugin
です。
--gadget
は、悪用するガジェットを示すために使用されます(逆シリアル化中にコマンドを実行するために悪用されるクラス/関数を示します)。--formatter
は、エクスプロイトをシリアル化するためのメソッドを示すために使用されます(ペイロードを逆シリアル化するバックエンドがどのライブラリを使用しているかを知っており、同じものを使用してシリアル化する必要があります)。--output
は、エクスプロイトを raw または base64 エンコードで表示するかを示すために使用されます。_ysoserial.net はペイロードを UTF-16LE でエンコードします(Windowsでデフォルトで使用されるエンコーディング)ので、Linuxコンソールから単にエンコードしても、エクスプロイトが正常に機能しない エンコーディングの互換性の問題 が発生する可能性があります(HTB JSONボックスでは、ペイロードはUTF-16LEとASCIIの両方で機能しましたが、これは常に機能するとは限らないことに注意してください)。--plugin
ysoserial.net は、ViewStateなどの 特定のフレームワーク用のエクスプロイトを作成するためのプラグイン をサポートしています。
その他のysoserial.netパラメータ
--minify
は、より小さなペイロード を提供します(可能な場合)。--raf -f Json.Net -c "anything"
これにより、指定されたフォーマッタ(この場合はJson.Net
)で使用できるすべてのガジェットが示されます。--sf xml
は、"xml" を含むフォーマッタを検索し、指定されたガジェット(-g
)を示します。
ysoserialの例:
ysoserial.netには、各エクスプロイトがどのように機能するかをよりよく理解するのに役立つ非常に興味深いパラメーターがあります: --test
このパラメーターを指定すると、ysoserial.netがローカルでエクスプロイトを試み、ペイロードが正しく機能するかどうかをテストできます。
このパラメーターは役立ちます。なぜなら、コードを確認すると、次のようなコードの断片が見つかるからです(ObjectDataProviderGenerator.csから):
これは、エクスプロイトをテストするためにコードがserializersHelper.JsonNet_deserializeを呼び出すことを意味します。
前のコードは作成されたエクスプロイトに脆弱です。そのため、.Netアプリケーションで類似したものを見つけた場合、おそらくそのアプリケーションも脆弱です。
したがって、--test
パラメータを使用すると、ysoserial.netが作成できるデシリアライゼーションエクスプロイトに脆弱なコードのチャンクを理解することができます。
ViewState
.Netの__ViewStateパラメータをエクスプロイトしようとする方法についてのこのPOSTを見て、任意のコードを実行してください。被害者マシンが使用している秘密をすでに知っている場合は、このポストを読んでコードを実行する。
予防
.Netでのデシリアライゼーションに関連するリスクを軽減するには:
データストリームがオブジェクトタイプを定義することを避ける。可能な限り
DataContractSerializer
またはXmlSerializer
を使用します。JSON.Net
では、TypeNameHandling
をNone
に設定する: %%%TypeNameHandling = TypeNameHandling.None%%%JavaScriptSerializer
をJavaScriptTypeResolver
と一緒に使用しない。デシリアライズできるタイプを制限し、
System.IO.FileInfo
などの.Netタイプに伴う固有のリスクを理解します。これにより、サーバーファイルのプロパティを変更できる可能性があるため、サービス拒否攻撃が発生する可能性があります。リスクのあるプロパティを持つタイプには注意してください。たとえば、
Value
プロパティを持つSystem.ComponentModel.DataAnnotations.ValidationException
は悪用される可能性があります。攻撃者がデシリアライゼーションプロセスに影響を与えるのを防ぐために、タイプのインスタンス化を安全に制御します。これにより、
DataContractSerializer
やXmlSerializer
さえも脆弱になります。BinaryFormatter
およびJSON.Net
用にカスタムSerializationBinder
を使用したホワイトリストコントロールを実装します。.Net内の既知の安全でないデシリアライゼーションガジェットについて情報を収集し、そのようなタイプをインスタンス化しないようにします。
潜在的にリスキーなコードを隔離して、既知のガジェット(たとえば、WPFアプリケーションの
System.Windows.Data.ObjectDataProvider
)が信頼できないデータソースにさらされないようにします。
参考文献
Ruby
Rubyでは、marshalライブラリ内の2つのメソッドによってシリアライゼーションが容易になります。最初のメソッドであるdumpは、オブジェクトをバイトストリームに変換するために使用されます。このプロセスはシリアライゼーションと呼ばれます。逆に、2番目のメソッドであるloadは、バイトストリームをオブジェクトに戻すために使用され、これをデシリアライゼーションと呼びます。
シリアライズされたオブジェクトを保護するために、**RubyはHMAC(Hash-Based Message Authentication Code)**を使用してデータの整合性と信頼性を確保します。この目的で使用されるキーは、次のいずれかの場所に保存されます:
config/environment.rb
config/initializers/secret_token.rb
config/secrets.yml
/proc/self/environ
Ruby 2.XジェネリックデシリアライゼーションからRCEガジェットチェーン(詳細は https://www.elttam.com/blog/ruby-deserialization/):
他のRuby On Railsを悪用するRCEチェーン: https://codeclimate.com/blog/rails-remote-code-execution-vulnerability-explained/
Last updated