2012-04-24 3 views
7

Python 설명서에 pickle이 안전하지 않으므로 신뢰할 수없는 사용자 입력을 구문 분석해서는 안됩니다. 이것을 연구하면 거의 모든 사례가 os.system을 통해 system() 전화로이를 입증합니다.Python Pickle Insecurity 이해

나에게 명확하지 않은 점은 os 모듈을 가져 오지 않고 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) 라인.

피클 바이트 코드 명령어가 실행될 때이 함수가 호출됩니다.

이 메커니즘은 호출자의 네임 스페이스에 모듈을 명시 적으로 가져 오지 않은 클래스의 인스턴스를 unpickle 할 수 있어야합니다. . 모듈을 가져 오기

+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을) 즉 argtuple에 호출 적용 os.system을가 최상위 스택 항목에서 문자열 'LS ~' 빌드 튜플을 밀어 밀어, 둘 다 스택에. 즉 os.system을 (* ('1! ~')) 표준 os.system을() 예보다 훨씬 더 나아가 악의적 인 절임 작성에 모두 너무 많은 내용

Source

+2

예,하지만 왜 'import os'가 필요하지 않습니까? – NPE

+1

dir()은 엄격하게 또는 일관되게 정의 된 이름 집합을 제공하려고 시도하는 것보다 흥미로운 이름 집합을 제공하려고 시도하며 상세한 동작은 릴리스간에 변경 될 수 있습니다. 모듈을 동적으로 가져올 때 dir() –

8

는, 볼이 presentation 및 그것의 동반 paper.

+1

+1으로 부자 리소스를 검색 할 수 있다고 보장 할 수 없습니다. – gauden

+0

멋진 찾기 - 감사합니다. – tMC