[Hacking/System Hacking]
파이썬 Eval 함수의 보안적 취약점

2020. 3. 22. 01:13


많은 프로그래밍 언어들이 eval 함수를 가지고있다. 그중에서도 파이썬의 eval 함수는 사용에 있어 주의해야한다.
이 eval함수에 관련된 취약점이 다른 프로그래밍 언어에도 존재하는지는 잘 모르겠으나, 파이썬의 eval함수는 취약점을 가지고있다.

아래 예제 코드를 살펴보자

assert eval("2 + 3 * len('hello')") == 17

파이썬의 eval함수는 문자열을 포함하여 연산할 수 있는 편리한 기능을 가지고있다. 하지만 이 기능은 매우 강력하지만 문자열을 허용하기때문에 신뢰할 수 없는 입력에서 사용하는것은 매우 위험하다. 만약 eval함수에 인자로 주어진 문자열이 "os.system('rm -rf/')"라고 가정한다면 리눅스 시스템의 모든 파일이 삭제될것이다.

하지만 이는 실 시스템에서 사용할 경우 치명적일 수 있기 때문에 아래 코드로 대체해서 사용해보겠다.

eval("os.system('clear')", {})

아마 위 코드를 실행했을때 에러가 발생한다면 OS 모듈이 Import 되지 않은 상태이기때문에 NameError가 발생할것이다.
때문에 공격자는 아래 코드를 사용하면 OS 모듈을 Import 하여 NameError가 발생하지않도록 exploit 코드를 실행해 원하는 목적을 달성할 수 있다.

예제에서는 os모듈과 단순 os.system("clear")명령만을 예제로 사용했지만 이는 무수히 많은 보안 결함을 범할 수도 있다는것이다.

예를 들어 공격자가 request 모듈을 Import하고 자신의 서버로부터 악성 멀웨어를 다운로드받고 실행하는 코드를 삽입한다면 공격당한 PC는 해커가 장악하게된다.

eval("__import__('os').system('clear')", {})

이러한 이유때문에 신뢰할 수 없는 사용자로부터의 입력을 받을 때 이를 연산하기위해서 eval함수를 사용하는것은 매우 위험한 행동이다.
반드시 신뢰할 수 있는 입력에만 eval함수를 사용하여 해킹을 방지하여야 한다.

'Hacking > System Hacking' 카테고리의 다른 글

파이썬 Eval 함수의 보안적 취약점  (0) 2020.03.22