2012-04-24 1 views
7

Pythonのドキュメントでは、pickleは安全ではなく、信頼できないユーザ入力を解析すべきではないと述べています。あなたがこれを研究するならば。ほとんどすべての例がos.systemsystem()コールでこれを実証しています。Python Pickle Insecurityについて

私には分かりませんが、モジュールがインポートされていないと、os.systemが正しく解釈されます。

>>> import pickle 
>>> pickle.loads("cos\nsystem\n(S'ls /'\ntR.") # This clearly works. 
bin boot cgroup dev etc home lib lib64 lost+found media mnt opt proc root run sbin selinux srv sys tmp usr var 
0 
>>> dir() # no os module 
['__builtins__', '__doc__', '__name__', '__package__', 'pickle'] 
>>> os.system('ls /') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'os' is not defined 
>>> 

誰かが説明できますか?

答えて

9

モジュール(os)の名​​前は、オペコードの一部であり、pickleは自動的にモジュールインポート:

# pickle.py 
def find_class(self, module, name): 
    # Subclasses may override this 
    __import__(module) 
    mod = sys.modules[module] 
    klass = getattr(mod, name) 
    return klass 

__import__(module)ライン。

この関数は、pickleバイトコード命令が実行されたときに呼び出されます。GLOBAL 'os system'

このメカニズムは、モジュールが呼び出し元の名前空間に明示的にインポートされていないクラスのインスタンスを消去できないようにするために必要です。唯一のモジュールをインポートする

+1

モジュールコードを見つけるために+1 – tMC

2

必ずしもあなたがしているものではないローカル名前空間に追加しますそうでない場合を除き:

>>> dir() 
['__builtins__', '__doc__', '__name__', '__package__'] 
>>> __import__('os') 
<module 'os' from '/usr/lib64/python2.7/os.pyc'> 
>>> dir() 
['__builtins__', '__doc__', '__name__', '__package__'] 
6

あなたが分解するpickletools.disを使用している場合あなたはこれが機能しているかを確認することができ漬物:

import pickletools 
print pickletools.dis("cos\nsystem\n(S'ls ~'\ntR.") 

出力:

0: c GLOBAL  'os system' 
11: ( MARK 
12: S  STRING  'ls ~' 
20: t  TUPLE  (MARK at 11) 
21: R REDUCE 
22: . STOP 

Pickleは、オブジェクトを再構築するために使用される命令を記録する単純なスタックベースの仮想マシンを使用します。言い換えれば、あなたの例で漬けの手順は以下のとおりです。

プッシュself.find_class(モジュール名、CLASS_NAME)すなわちos.systemは、一番上のスタック項目から ビルドタプル文字列「〜LS」を押し argtupleする呼び出し可能な適用押し込み、両方のスタックに。更に多くの標準os.system()の例よりも行く悪質な漬物を書く上で完全にあまりにも多くの情報についてはすなわちos.system(*( 'のLS〜'、))

Source

+2

はい、なぜこれは 'import os'を必要としませんか? – NPE

+1

dir()は、厳密にまたは一貫して定義された名前セットを提供しようとするよりも面白い名前セットを提供しようとします。モジュールを動的にインポートすると、dir()で表示される保証はありません –

8

、このpresentationを見ると、それに付随するpaper

+1

+1豊富なリソースを掘り起こすために – gauden

+0

素晴らしいfind-thanks – tMC

関連する問題