압축 해제 중 안전하지 않은 심볼릭 링크 생성

압축 해제 중 안전하지 않은 심볼릭 링크 생성

설명

아카이브 엔트리의 링크 대상과 이름을 검증하지 않고 os.Symlink로 생성하면 추출 디렉터리 밖을 가리키는 링크를 만들 수 있습니다.

잠재적 영향

  • 후속 파일 추출이 링크를 따라가며 외부 파일을 덮어쓸 수 있습니다.
  • 설정 파일 또는 실행 파일 변조로 이어질 수 있습니다.

해결 방법

  • 심볼릭 링크 엔트리는 기본적으로 거부하거나 엄격한 허용 목록으로만 허용하세요.
  • 링크 이름과 대상 모두 추출 루트 내부인지 검증하세요.

예시

변경 전

go
target := filepath.Join(dest, hdr.Name)
_ = os.Symlink(hdr.Linkname, target)

변경 후

go
package example

import (
    "archive/tar"
    "fmt"
)

func rejectArchiveLinks(hdr *tar.Header) error {
    switch hdr.Typeflag {
    case tar.TypeSymlink, tar.TypeLink:
        return fmt.Errorf("archive links are not allowed: %q", hdr.Name)
    }
    return nil
}

설명:

  • 변경 전: 압축 해제 과정에서 엔트리의 링크 대상과 이름을 검증하지 않고 os.Symlink로 생성하면, 기존 심볼릭 링크나 .. 경로를 이용해 추출 루트 밖을 가리키는 링크를 만들 수 있습니다.
  • 변경 후: 심볼릭 링크와 하드 링크 엔트리를 명시적으로 거부합니다. filepath.Base(hdr.Linkname)만 사용하면 링크 대상 ..가 그대로 남을 수 있으므로 링크 생성 방어로 충분하지 않습니다.

참조