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