Reject path traversal in deploy log download handler (closes #177)
Check / check (pull_request) Skipped
Check / check (pull_request) Skipped
gosec flagged G703 (path traversal via taint analysis) on the log download handler because the served path derives from a URL parameter. Open the log file through an os.Root confined to the deploy log directory instead of passing the path to http.ServeFile; Root.Open rejects any path that escapes the root, so traversal attempts return 404. Serve the opened file with http.ServeContent. Adds GetLogDir on the deploy service and unit tests covering a legitimate download and a traversal-shaped app name. Model: opus-4-8
This commit is contained in:
@@ -294,6 +294,12 @@ func (svc *Service) GetLogFilePath(
|
||||
return filepath.Join(svc.config.DataDir, "logs", hostname, app.Name, filename)
|
||||
}
|
||||
|
||||
// GetLogDir returns the root directory under which all deployment log
|
||||
// files live. Paths returned by GetLogFilePath are always inside it.
|
||||
func (svc *Service) GetLogDir() string {
|
||||
return filepath.Join(svc.config.DataDir, "logs")
|
||||
}
|
||||
|
||||
// HasActiveDeploy returns true if there is an active deployment for the given app.
|
||||
func (svc *Service) HasActiveDeploy(appID string) bool {
|
||||
_, ok := svc.activeDeploys.Load(appID)
|
||||
|
||||
Reference in New Issue
Block a user