압축을 푼 모든 파일이 특정 접두어 디렉토리 아래에 배치되도록 tar 파일을 추출하고 싶습니다. tar 파일이 외부 디렉토리에 쓰려고하면 추출이 실패합니다.
알다시피, 이것은 신뢰할 수없는 tar 파일을 안전하게 추출 할 수 있도록하기위한 것입니다.
GNU로 어떻게 이것을 할 수 tar
있습니까?
나는 생각해 냈다 :
tar --exclude='/*' --exclude='*/../*' --exclude='../*' -xvf untrusted_file.tar
그러나 이것이 충분히 편집증인지 확실하지 않습니다.
답변
편집증이 전혀 필요하지 않습니다. GNU tar
– 사실 어떤 잘 작성된 tar
지난 30 년 정도에 제작 프로그램 – 슬래시로 시작하거나 포함하는 TAR 파일에 파일의 압축을 거부 할 ..
기본적 요소.
현대의 tar
프로그램이 잠재적으로 악의적 인 타르볼을 추출하게 tar
하려면 GNU와 BSD 모두이 -P
보호 기능을 비활성화 할 수 있는 옵션이 필요합니다 . 절대 파일 이름 섹션을 참조하십시오GNU tar 매뉴얼의 .
-P
플래그가 POSIX에 의해 지정되지 않은, ¹하지만, 그래서 다른 tar
프로그램이 대처의 여러 가지 방법이있을 수 있습니다. 예를 들어, Schily 도구 ‘ star
프로그램 사용 -/
및-..
이러한 보호를 비활성화합니다.
순진한 tar
명령에 추가하는 것을 고려할 수있는 유일한 방법 -C
은 안전한 임시 디렉토리에서 항목을 추출하도록 강제 하는 플래그입니다. 따라서 먼저 따를 필요는 없습니다 cd
.
옆으로 :
-
기술적
tar
으로 POSIX는 더 이상 지정하지 않습니다. 그들은 유닉스 컴퓨팅 세계에pax
지금 대신 사용해야tar
하고cpio
무시했습니다.POSIX 사양은
pax
슬래시 또는 내장..
요소를 처리하는 방법을 언급하지 않습니다 . 임베디드 경로 요소 에 대한 보호를 억제--insecure
하는 BSDpax
에는 비표준 플래그가..
있지만 선행 슬래시에 대한 기본 보호는 없습니다. BSDpax
매뉴얼 페이지는 간접적으로 글쓰기를 권장합니다-s
는 절대 경로 위험을 처리하기위한 대체 규칙 합니다.그것은 사실상 표준이 적극적으로 사용되는 반면, 표준은 크게 무시 될 때 발생하는 일종의 일입니다.
답변
GNU tar를 사용하면 간단합니다.
tar -xvf untrusted_file.tar
빈 디렉토리에. GNU tar /
는 --absolute-names
옵션으로 달리 명시하지 않는 한 추출시 자동으로 주요 멤버 이름을 제거합니다 . GNU tar는 또한 언제 사용 ../
하면 최상위 디렉토리 외부에서 파일이 추출 되는지를 감지 하고 대신 해당 파일을 최상위 디렉토리에 넣습니다. 예를 들어 컴포넌트 foo/../../bar/qux
는 bar/qux
최상위 디렉토리 bar/qux
의 상위가 아닌 최상위 디렉토리에서 추출됩니다 . . GNU 타르는 예를 들어 최상위 디렉토리, 외부 가리키는 기호 연결을 담당 foo -> ../..
하고 foo/bar
발생하지 않습니다 bar
최상위 디렉토리 밖에 추출 할 수 있습니다.
이는 GNU tar (충분히 최신 버전) GNU tar (* BSD tar 및 BusyBox tar와 같은 일부 다른 구현)에만 적용됩니다. 다른 구현에는 그러한 보호 기능이 없습니다.
심볼릭 링크 때문에 사용하는 보호로는 충분하지 않습니다. 아카이브에는 트리 외부의 디렉토리를 가리키는 심볼릭 링크가 포함되어 있으며 해당 디렉토리의 파일을 추출 할 수 있습니다. 순전히 멤버 이름을 기반으로 문제를 해결할 수있는 방법이 없으므로 기호 링크의 대상을 검사해야합니다.
이미 심볼릭 링크가 포함 된 디렉토리로 추출하는 경우 보증이 더 이상 유지되지 않을 수 있습니다.
답변
몇 가지 점을 다루기 위해 다른 답변은 그렇지 않았습니다.
-
먼저 파일을 추출하기 전에 파일의 내용을 확인하십시오.
tar -tvf untrusted_tar_file.tar
신뢰할 수 없거나 추출하고 싶은 것이 있으면 tarball을 추출하지 마십시오.
- 둘째, tarball을 추출 할 디렉토리에 대한 쓰기 권한 만 가진 루트가 아닌 사용자로 tarball을 추출하십시오. 예를 들어, 루트가 아닌 사용자의 홈 디렉토리에서 tarball을 추출하십시오.