9.3. 파이썬

모든 언어에서와 같이 반드시 신뢰되지 않은 사용자가 입력에 영향을 미칠 수 없도록 데이타가 프로그램의 한 부분으로 실행되도록 하는 모든 함수들에 주의해라. 이 함수로는 exec(), eval() 과 exefile() 이 있다 (솔직히 compile() 에 대한 모든 호출을 검사해야 한다). 또한 input() 문도 예기치 않게 위험하다 [Watters 1996, 150].

권한이 없는 사용자에 의해 호출될 수 있는 권한을 갖는 파이썬 프로그램들은 (예, setuid/setgid 프로그램) "user (사용자)" 모듈을 import 하지 않아야 한다. user 모듈은 pthonrc.py 파일이 읽혀져 실행되게 한다. 이 파일을 신뢰되지 않은 사용자가 제어할 수 있기 때문에 user 모듈을 import 하는 것은 공격자에게 신뢰된 프로그램이 임의의 코드를 실행시키도록 할 수 있다.

파이썬은 컴파일시 검사를 거의 하지 않는다 -- 본질적으로 컴파일시 어떠한 타입 정보도 갖지 않으며 건네지는 매개변수의 수가 주어진 함수 또는 메쏘드에 대해 합법적인지를 전혀 검사하지 않는다. 이는 잠재적인 많은 버그를 야기하는데 John Viega 와 저자는 이 문제를 경험해왔다. 잘된다면 언젠가 파이썬은 오랫동안 논의되어온 개념인 선택적인 정적 타이핑 및 타입 검사를 구현할 것이다. 현재 부분적인 해결 방법은 파이썬 소스 코드내의 일반적인 버그를 검사하는 lint 같은 프로그램인 PyChecker 로 http://pychecker.sourceforge.net 에서 얻을 수 있다.

파이썬은 RExec 클래스를 통해 ``제한된 실행 (Restricted Execution)" 을 지원한다. 이는 본래 애플릿과 모바일 코드를 실행시키기 위한 것이지만 코드가 외부에서 제공되지 않을 때에도 프로그램내의 권한을 제한하기 위해 또한 사용될 수 있다. 디폴트로 제한된 실행 환경은 파일 읽기 (쓰기가 아닌) 를 허용하지만 네트워크 접근 또는 GUI 상호작용을 위한 연산을 포함하지는 않는다. 이러한 디폴트는 변경될 수 있는데 제한된 환경에서 허점 (loophole) 생성에 주의해라. 특히 사용자에게 클래스에 속성을 제한없이 추가하도록 허용하는 것은 파이썬 구현이 많은 숨겨진 메쏘드를 호출하기 때문에 환경을 깨뜨릴 수 있는 모든 종류의 방법을 허용한다. 디폴트로 대부분의 파이썬 객체는 참조에 의해 전달됨을 주목해라; 가변값에 대한 참조를 제한된 프로그램의 환경내에 삽입한다면 제한된 프로그램은 제한된 환경 외부에서 보일 수 있게 객체를 변경할 수 있다. 따라서 가변값에 대한 접근을 허용하려면 많은 경우 가변값을 복사하거나 다른 객체에 대한 제한된 접근을 지원하는 Bation 모듈을 사용해야 한다. 더욱 자세한 정보는 Kuchling [2000] 을 보라. 저자는 제한된 실행 능력이 수행하는 감사의 양에 대해 잘 모르며 따라서 프로그래머들은 주의해라.