信頼できないデータの逆シリアル化

信頼できないデータの逆シリアル化

説明

攻撃者が操作したデータを逆シリアル化すると、任意のコードを実行されたり、アプリケーションの動作を変えられたりするおそれがあります。ネットワーク経由で受け取ったシリアル化済みオブジェクトを復元する場面などで発生します。

想定される影響

  • コード実行: 悪意あるデータによってコードが実行され、システムを侵害される可能性があります。
  • データ改ざん: アプリケーションのデータを変更されるおそれがあります。
  • 情報漏えい: 機密情報が漏えいする可能性があります。

対処方法

  • 信頼できない入力に 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オブジェクトの生成を防ぎます。入力のサイズと構造は別途検証する必要があります。

参考資料