説明
攻撃者が操作したデータを逆シリアル化すると、任意のコードを実行されたり、アプリケーションの動作を変えられたりするおそれがあります。ネットワーク経由で受け取ったシリアル化済みオブジェクトを復元する場面などで発生します。
想定される影響
- コード実行: 悪意あるデータによってコードが実行され、システムを侵害される可能性があります。
- データ改ざん: アプリケーションのデータを変更されるおそれがあります。
- 情報漏えい: 機密情報が漏えいする可能性があります。
対処方法
- 信頼できない入力に
pickleや任意のオブジェクトを生成するローダーを使用しません。 - 逆シリアル化する前に、データの完全性と信頼性を確認します。
jsonやyaml.safe_loadなど、任意のオブジェクトを生成しないパーサーを使用し、入力のサイズと構造も検証します。
例
pickle / JSON
変更前
python
# 安全でないpickleの逆シリアル化
import pickle
def unsafe_loads(data):
return pickle.loads(data)
変更後
python
# JSONによる逆シリアル化
import json
def safe_loads(data):
return json.loads(data)
解説:
- 変更前: 悪意あるpickleデータは、逆シリアル化の際にコードを実行できます。
- 変更後: JSONでは任意のPythonオブジェクトを生成しません。入力のサイズと構造は別途検証する必要があります。
YAML
変更前
python
# 安全でないYAMLの逆シリアル化
import yaml
def unsafe_load(data):
return yaml.load(data, Loader=yaml.Loader)
変更後
python
# 安全なYAMLの逆シリアル化
import yaml
def safe_load(data):
return yaml.safe_load(data)
解説:
- 変更前: この例のローダーで
yaml.loadを使うと、悪意あるデータからコードが実行される可能性があります。 - 変更後:
yaml.safe_loadは任意のPythonオブジェクトの生成を防ぎます。入力のサイズと構造は別途検証する必要があります。
参考資料
- OWASP: 信頼できないデータの逆シリアル化
- CWE: CWE-502: 信頼できないデータの逆シリアル化