安全でないデシリアライゼーション
安全でないデシリアライゼーション とは何ですか?
安全でないデシリアライゼーションアプリが信頼できないデータをデシリアライズすることで、攻撃者が任意オブジェクトを生成し、しばしばリモートコード実行に至る脆弱性。
アプリケーションがシリアライズされたデータ(Java/PHP/Python/.NET のバイナリ形式、YAML、あるいは型メタデータ付きの JSON)を再びオブジェクトへ復元する際、デシリアライザはコンストラクタやマジックメソッド、あるいは ガジェットチェーン を呼び出すことがあります。ガジェットチェーンとは、すでに読み込まれているメソッドを連鎖させ、最終的に Runtime.exec のような危険なシンクへ到達させる一連の手順です。信頼できない入力を扱う場合、攻撃者はデシリアライズ中にこの挙動を引き起こすペイロードを作り込み、リモートコード実行(RCE)、認証バイパス、ファイル書き込み、あるいはサービス妨害(DoS)を成立させます。
代表的な事例が CVE-2015-4852 です。Oracle WebLogic は T3 プロトコル経由で TCP 7001 に送られてくる未認証の Java オブジェクトを安全でない形でデシリアライズしており、クラスパスに Apache Commons Collections が存在すると、ysoserial ツールが動作する RCE ガジェットを生成できました。Oracle の最初のパッチは、信頼できないデシリアライズそのものを止めるのではなく、クラスの脆弱な拒否リストに頼るものでした。同様の欠陥は Apache Struts(CVE-2017-9805、XStream 経由)にも及び、PHP の unserialize() に起因するオブジェクトインジェクションのバグも無数に発生しました。OWASP のリストでは、このカテゴリは A8:2017 から、より広範な A08:2021 – ソフトウェアとデータの整合性の不備 へと移行しました。
flowchart LR A[攻撃者] -->|細工したシリアライズブロブ<br/>cookie / T3 / API body| APP[アプリケーション] APP -->|信頼できないバイト列をデシリアライズ| DZ[デシリアライザ] DZ -->|オブジェクト生成<br/>マジックメソッド呼び出し| GC[クラスパス上の<br/>ガジェットチェーン] GC -->|危険なシンクへ到達| RCE[Runtime.exec / ファイル書き込み] APP -. 防御 .-> SIG[署名付きペイロード +<br/>型の許可リスト] SIG -.->|未知の型を拒否| DROP[破棄]
対策としては、信頼できないデータをそもそもデシリアライズしないこと、型復元を行わないスキーマ拘束型の形式(素の JSON、Protobuf)を選ぶこと、シリアライズペイロードに署名または HMAC を付与すること、デシリアライズ可能な型の厳格な許可リストを強制すること、そしてランタイムにパッチを適用し続けることが挙げられます。実際、最新の .NET では BinaryFormatter が非推奨化され、削除されています。
● 例
- 01
クラスパスに Commons Collections を持つ Java アプリがセッション Cookie をデシリアライズし、RCE に至る。
- 02
Python サービスがユーザー制御バイトに対して pickle.loads を実行する。
● よくある質問
安全でないデシリアライゼーション とは何ですか?
アプリが信頼できないデータをデシリアライズすることで、攻撃者が任意オブジェクトを生成し、しばしばリモートコード実行に至る脆弱性。 サイバーセキュリティの 脆弱性 カテゴリに属します。
安全でないデシリアライゼーション とはどういう意味ですか?
アプリが信頼できないデータをデシリアライズすることで、攻撃者が任意オブジェクトを生成し、しばしばリモートコード実行に至る脆弱性。
安全でないデシリアライゼーション からどのように防御しますか?
安全でないデシリアライゼーション に対する防御は通常、上記の定義で述べたとおり、技術的統制と運用上の実践を組み合わせます。
安全でないデシリアライゼーション の別名は何ですか?
一般的な別名: 危険なデシリアライズ, オブジェクトデシリアライゼーションの脆弱性。