신뢰할 수없는 tar 파일을 안전하게 추출하려면 어떻게합니까?


30

압축을 푼 모든 파일이 특정 접두어 디렉토리 아래에 배치되도록 tar 파일을 추출하고 싶습니다. tar 파일이 외부 디렉토리에 쓰려고하면 추출이 실패합니다.

알다시피, 이것은 신뢰할 수없는 tar 파일을 안전하게 추출 할 수 있도록하기위한 것입니다.

GNU로 어떻게 이것을 할 수 tar있습니까?

나는 생각해 냈다 :

tar --exclude='/*' --exclude='*/../*' --exclude='../*' -xvf untrusted_file.tar

그러나 이것이 충분히 편집증인지 확실하지 않습니다.


2
편집증이 충분하지 않습니다. 나는 과거에 상징적 인 링크를 통해 올라간 불쾌한 타르볼을 만들었습니다. 나는 setuid-root 인 내 자신의 tar를 만들었으므로 chroot ( ".")를 실행하고 권한을 떨어 뜨릴 수있었습니다.
Joshua

8
@Joshua는 광범위한 테스트를 거친 유틸리티를보다 안전하게 만드는 솔루션은 자신의 버전을 만들고 루트 권한을 부여하는 것입니까?
모니카 해밍 중지

4
@OrangeDog : int main (int argc, char ** argv) {chroot ( ".") || 이탈 (1); setuid (getuid ()); 감사하기 쉽습니다.
Joshua

2
-t옵션 을 사용하여 tar 파일 내부의 내용을 검사 할 수도 있습니다.
토마스

답변:


40

편집증이 전혀 필요하지 않습니다. GNU tar- 사실 어떤 잘 작성된 tar지난 30 년 정도에 제작 프로그램 - 슬래시로 시작하거나 포함하는 TAR 파일에 파일의 압축을 거부 할 ..기본적 요소.

현대의 tar프로그램이 잠재적으로 악의적 인 타르볼을 추출하게 tar하려면 GNU와 BSD 모두이 -P보호 기능을 비활성화 할 수 있는 옵션이 필요합니다 . 절대 파일 이름 섹션을 참조하십시오GNU tar 매뉴얼의 .

-P플래그가 POSIX에 의해 지정되지 않은, ¹하지만, 그래서 다른 tar프로그램이 대처의 여러 가지 방법이있을 수 있습니다. 예를 들어, Schily 도구 ' star프로그램 사용 -/-.. 이러한 보호를 비활성화합니다.

순진한 tar명령에 추가하는 것을 고려할 수있는 유일한 방법 -C은 안전한 임시 디렉토리에서 항목을 추출하도록 강제 하는 플래그입니다. 따라서 먼저 따를 필요는 없습니다 cd.


옆으로 :

  1. 기술적 tar으로 POSIX는 더 이상 지정하지 않습니다. 그들은 유닉스 컴퓨팅 세계에 pax지금 대신 사용해야 tar하고cpio 무시했습니다.

    POSIX 사양은 pax슬래시 또는 내장 ..요소를 처리하는 방법을 언급하지 않습니다 . 임베디드 경로 요소 에 대한 보호를 억제 --insecure하는 BSDpax 에는 비표준 플래그가 ..있지만 선행 슬래시에 대한 기본 보호는 없습니다. BSD pax매뉴얼 페이지는 간접적으로 글쓰기를 권장합니다-s 는 절대 경로 위험을 처리하기위한 대체 규칙 합니다.

    그것은 사실상 표준이 적극적으로 사용되는 반면, 표준은 크게 무시 될 때 발생하는 일종의 일입니다.


7
pax - portable archive interchangeAwww, POSIX는 아마도 가장 널리 사용되는 아카이브 형식을 대체 할 것이라고 생각합니다. : P
cat

1
@cat 기본 아카이브 형식은 상당히 광범위하게 지원되는 tar 변형입니다 (AIUI는 cpio 형식도 지원해야 함). Pax는 tar의 명령 인수 처리가 기발하기 때문에 그러한 아카이브를 처리 하기 위해 명령 인터페이스 를 대체하려는 시도 입니다.
Random832

랜덤 참고 : "de jure"와는 반대로 "de jour", 즉 프랑스어라는 것이 확실합니다.
기금 모니카의 소송

7
@QPaysTaxes 아닙니다. 법정은 라틴어이며 현재 상황, 즉 사실상의 상황과 대조됩니다. 프랑스의 문법 규칙을 준수하기 위해 드 주르도해야합니다.
Prime

1
불행한 거짓 동족의 경우입니다. 프랑스어 "du jour"( "오늘의")는 여기서 "실제"( "실제")와 대조되는 라틴어 "법률"( "법의")과 매우 흡사합니다. pax는 새로운 표준이 너무 자주 제안되는 방식을 재미있게 만드는 "이달의 표준"또는 "표준 du jour"라고 주장 할 수 있지만 방대한 사용자는 단순히 표준에 맞는 기능을 그대로 유지합니다 (사실 표준). 그들이 (무시 적으로) 무시할 내일의 새로운 표준이 있다는 것을 아는 것.
Monty Harder

19

GNU tar를 사용하면 간단합니다.

tar -xvf untrusted_file.tar

빈 디렉토리에. GNU tar /--absolute-names옵션으로 달리 명시하지 않는 한 추출시 자동으로 주요 멤버 이름을 제거합니다 . GNU tar는 또한 언제 사용 ../하면 최상위 디렉토리 외부에서 파일이 추출 되는지를 감지 하고 대신 해당 파일을 최상위 디렉토리에 넣습니다. 예를 들어 컴포넌트 foo/../../bar/quxbar/qux최상위 디렉토리 bar/qux의 상위가 아닌 최상위 디렉토리에서 추출됩니다 . . GNU 타르는 예를 들어 최상위 디렉토리, 외부 가리키는 기호 연결을 담당 foo -> ../..하고 foo/bar발생하지 않습니다 bar최상위 디렉토리 밖에 추출 할 수 있습니다.

이는 GNU tar (충분히 최신 버전) GNU tar (* BSD tar 및 BusyBox tar와 같은 일부 다른 구현)에만 적용됩니다. 다른 구현에는 그러한 보호 기능이 없습니다.

심볼릭 링크 때문에 사용하는 보호로는 충분하지 않습니다. 아카이브에는 트리 외부의 디렉토리를 가리키는 심볼릭 링크가 포함되어 있으며 해당 디렉토리의 파일을 추출 할 수 있습니다. 순전히 멤버 이름을 기반으로 문제를 해결할 수있는 방법이 없으므로 기호 링크의 대상을 검사해야합니다.

이미 심볼릭 링크가 포함 된 디렉토리로 추출하는 경우 보증이 더 이상 유지되지 않을 수 있습니다.


6

몇 가지 점을 다루기 위해 다른 답변은 그렇지 않았습니다.

  1. 먼저 파일을 추출하기 전에 파일의 내용을 확인하십시오.

    tar -tvf untrusted_tar_file.tar
    

    신뢰할 수 없거나 추출하고 싶은 것이 있으면 tarball을 추출하지 마십시오.

  2. 둘째, tarball을 추출 할 디렉토리에 대한 쓰기 권한 만 가진 루트가 아닌 사용자로 tarball을 추출하십시오. 예를 들어, 루트가 아닌 사용자의 홈 디렉토리에서 tarball을 추출하십시오.

4
1. 배치 작업에는 실용적이지 않습니다. 2. 사용자 정의 설정을 실행하지 않는 한 / tmp /
파이프

@pipe one은 디렉토리와 새 사용자를 만들 수 있으며 해당 사용자 만 해당 디렉토리에만 액세스 한 다음 명령을 실행하십시오. 나는 내 홈 디렉토리를 아주 좋아합니다. 감사합니다.
cat

2
@pipe는 왜 하나님의 좋은 지구에 당신은 것 이제까지 통과 신뢰할 수없는 일괄 작업을 통해 데이터를? 신뢰하지 않으면 무인으로 실행 하지 마십시오 .
Andrew Henle

6
@AndrewHenle Uhm, 알았어. 인터넷상의 모든 서버가 어떻게 작동한다고 생각하십니까? stackexchange의 일부 직원이 수동으로 작업을 모니터링하면서 데이터베이스 및 마크 업 시스템을 통해이 주석을 실행한다고 생각하십니까? 이 입력은 일괄 작업을 통해 신뢰할 수없는 데이터이기 때문입니다.
파이프

신뢰할 수없는 파일을 홈 디렉토리에서 직접 추출하지 않는 것이 좋습니다. .bashrc 및 기타 .config / 파일을 덮어 쓰지 않기를 원합니까?
Hugal31
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.