설명
아카이브 엔트리의 링크 대상과 이름을 검증하지 않고 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)만 사용하면 링크 대상..가 그대로 남을 수 있으므로 링크 생성 방어로 충분하지 않습니다.