33

ユーザー入力をオブジェクトに保存する Web アプリを作成しています。このオブジェクトはピクルスになります。

オブジェクトが unpickle されたときに何か悪質なことを実行できる悪意のある入力をユーザーが作成することは可能ですか?

これは、カプセル化などの素晴らしい原則を無視しているが、私が見ているものの典型を表した、非常に基本的なコード例です。

import pickle

class X(object):
    some_attribute = None

x = X()
x.some_attribute = 'insert some user input that could possibly be bad'

p = pickle.dumps(x)

# Can bad things happen here if the object, before being picked, contained
# potentially bad data in some_attribute?
x = pickle.loads(p)
4

3 に答える 3

15

はいといいえ...

いいえ - インタープリターまたは pickle モジュールにバグがない限り、pickle テキストなどを介して任意のコードを実行することはできません。ピクルされたテキストがeval後で編集されるか、このデータに記載されているタイプで新しいオブジェクトを作成するなどのことをしていない限り。

はい - オブジェクト内の情報を後でどうするかによって、ユーザーはあらゆる種類の操作を実行できます。SQL インジェクションの試みから、資格情報の変更、ブルート フォース パスワード クラッキング、またはユーザー入力を検証する際に考慮すべきあらゆることまで。しかし、あなたはおそらくこれらすべてをチェックしています。


編集

Pythonのドキュメントには、次のように記載されています。

警告 pickle モジュールは、誤ったデータや悪意を持って作成されたデータに対して安全であることを意図していません。信頼できない、または認証されていないソースから受け取ったデータを unpickle しないでください。

ただし、これはあなたのケースではありません-入力を受け入れ、通常の検証を通過させてから、ピクルします。

于 2012-04-23T14:14:51.700 に答える
7

ドキュメントによると

警告:pickleモジュールは、誤ったデータや悪意を持って作成されたデータに対して安全であることを意図していません。信頼できない、または認証されていないソースから受け取ったデータを unpickle しないでください。

pickle アルゴリズムがプログラムの動作が保証されない状態になるような状態でデータの構造が存在する場合、この機能を呼び出すだけでこの機能を攻撃できることを意味します。

このサイトによると

import pickle
pickle.loads("cos\nsystem\n(S'ls ~'\ntR.") # This will run: ls ~

任意のコードを実行するために必要なのはそれだけです。他にも例があり、セキュリティ目的での酸洗いの「改善」もあります。

于 2012-04-23T14:23:28.400 に答える