Skip to content

Commit 0615919

Browse files
committed
fix(postgres): handle log-dir root path safely in log file resolver
1 parent 1e3b260 commit 0615919

File tree

2 files changed

+12
-1
lines changed

2 files changed

+12
-1
lines changed

cli/postgres/log.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@ func resolveRequestedLogFile(logDir string, file string) (string, error) {
3232

3333
cleanDir := filepath.Clean(logDir)
3434
logPath := filepath.Clean(filepath.Join(cleanDir, file))
35-
if !strings.HasPrefix(logPath, cleanDir+string(filepath.Separator)) {
35+
rel, err := filepath.Rel(cleanDir, logPath)
36+
if err != nil || rel == ".." || strings.HasPrefix(rel, ".."+string(filepath.Separator)) {
3637
return "", fmt.Errorf("invalid log file path")
3738
}
3839
return logPath, nil

cli/postgres/log_security_test.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,16 @@ func TestResolveRequestedLogFileValid(t *testing.T) {
1313
}
1414
}
1515

16+
func TestResolveRequestedLogFileValidRootDir(t *testing.T) {
17+
got, err := resolveRequestedLogFile("/", "passwd")
18+
if err != nil {
19+
t.Fatalf("resolveRequestedLogFile returned error: %v", err)
20+
}
21+
if got != "/passwd" {
22+
t.Fatalf("resolveRequestedLogFile returned %q, want %q", got, "/passwd")
23+
}
24+
}
25+
1626
func TestResolveRequestedLogFileRejectsTraversal(t *testing.T) {
1727
tests := []string{
1828
"../../../etc/hosts",

0 commit comments

Comments
 (0)