파이썬 샌드 박싱은 어렵다 . 파이썬은 본질적으로 여러 단계에서 내성적입니다.
즉, 해당 유형 자체에서 특정 유형에 대한 팩토리 메소드를 찾고 해석기가 직접 제한없이 실행하는 새로운 하위 레벨 오브젝트를 구성 할 수 있습니다.
다음은 Python 샌드 박스에서 벗어날 수있는 창의적인 방법을 찾는 몇 가지 예입니다.
Ned Batchelder는 실제로 얼마나 위험eval()
한지 시범으로 시작합니다 . eval()
파이썬 표현식을 실행하는 데 종종 사용됩니다. 원 라이너의 기본적이고 순진한 샌드 박스로 사용됩니다.
그는 계속해서 같은 원리를 파이썬 3 에도 적용하려고 노력했으며 결국 유용한 포인터 로 성공했습니다 .
Pierre Bourdon은 유사한 기술을 사용하여 해킹에서 파이썬 시스템 을 해킹합니다.
기본 아이디어는 항상 기본 파이썬 유형을 만드는 방법을 찾는 것입니다. 파이썬 인터프리터가 임의의 (체크되지 않은!) 바이트 코드를 실행하도록하여 함수와 클래스를 호출하고 셸에서 벗어날 수 있습니다.
exec
명령문 에도 동일하게 적용됩니다 ( exec()
Python 3의 함수).
따라서 다음을 원합니다.
밑줄로 시작하는 이름에 대한 액세스를 제거하기 위해 Python 코드의 바이트 컴파일을 엄격하게 제어하거나 적어도 바이트 코드를 사후 처리하십시오.
이를 위해서는 파이썬 인터프리터의 작동 방식과 파이썬 바이트 코드의 구조에 대한 자세한 지식이 필요합니다. 코드 객체는 중첩됩니다. 모듈의 바이트 코드는 최상위 수준의 문장 만 다루고, 각 함수와 클래스는 예를 들어 중첩 된 함수와 클래스에 대한 다른 바이트 코드 객체를 포함하는 메타 데이터로 구성됩니다 .
사용할 수있는 모듈 을 허용 목록에 추가해야합니다 . 면밀히.
파이썬 모듈은 다른 모듈에 대한 참조를 포함 합니다. 를 가져 오면 모듈 네임 스페이스에 모듈을 os
나타내는 로컬 이름 os
이 있습니다 os
. 이로 인해 결정된 공격자가 모듈을 샌드 박스에서 벗어날 수 있습니다. pickle
모듈은, 예를 들어, 당신이 그렇게하면, 예를 들어 임의의 코드가 객체를로드 할 수 있는 받는 사람의 허용 된 모듈 리드를 통해 경로 pickle
모듈, 당신은 여전히 문제가 있습니다.
시간 할당량을 엄격하게 제한해야합니다. 가장 중립적 인 코드조차도 리소스를 묶어 영원히 실행을 시도 할 수 있습니다.
엄격한 바이트 코드 컨트롤을 제공하는 RestrictedPython을 살펴보십시오 . RestrictedPython
Python 코드를 Python 2.3에서 2.7까지 허용되는 이름, 모듈 및 객체를 제어 할 수있는 것으로 변환합니다.
RestrictedPython
귀하의 목적을 위해 충분히 안전한 경우 구현하는 정책에 따라 다릅니다. 밑줄로 시작하는 이름에 대한 액세스를 허용하지 않고 모듈을 엄격히 화이트리스트에 올리는 것이 시작입니다.
내 견해로는 유일하게 강력한 옵션은 외부 세계에 대한 네트워크 액세스 권한이없는 별도의 가상 컴퓨터를 사용하는 것입니다. 각각의 새 스크립트에는 새로운 VM이 대신 제공됩니다. 그렇게하면 코드가 Python 샌드 박스에서 벗어날 수 있지만 (아마도 그렇지는 않음) 모든 공격자가 액세스 할 수있는 수명이 짧고 가치가 없습니다.