diff --git a/pkg/api/plugins.go b/pkg/api/plugins.go index 62ad623c416..518ffc21f5a 100644 --- a/pkg/api/plugins.go +++ b/pkg/api/plugins.go @@ -478,15 +478,15 @@ func (hs *HTTPServer) pluginMarkdown(ctx context.Context, pluginId string, name } // nolint:gosec - // We can ignore the gosec G304 warning on this one because `plugin.PluginDir` is based - // on plugin the folder structure on disk and not user input. - path := filepath.Join(plugin.PluginDir, fmt.Sprintf("%s.md", strings.ToUpper(name))) + // We can ignore the gosec G304 warning since we have cleaned the requested file path and subsequently + // use this with a prefix of the plugin's directory, which is set during plugin loading + path := filepath.Join(plugin.PluginDir, mdFilepath(strings.ToUpper(name))) exists, err := fs.Exists(path) if err != nil { return nil, err } if !exists { - path = filepath.Join(plugin.PluginDir, fmt.Sprintf("%s.md", strings.ToLower(name))) + path = filepath.Join(plugin.PluginDir, mdFilepath( strings.ToLower(name))) } exists, err = fs.Exists(path) @@ -498,11 +498,15 @@ func (hs *HTTPServer) pluginMarkdown(ctx context.Context, pluginId string, name } // nolint:gosec - // We can ignore the gosec G304 warning on this one because `plugin.PluginDir` is based - // on plugin the folder structure on disk and not user input. + // We can ignore the gosec G304 warning since we have cleaned the requested file path and subsequently + // use this with a prefix of the plugin's directory, which is set during plugin loading data, err := ioutil.ReadFile(path) if err != nil { return nil, err } return data, nil } + +func mdFilepath(mdFilename string) string { + return filepath.Clean(filepath.Join("/", fmt.Sprintf("%s.md", mdFilename))) +} diff --git a/pkg/tsdb/testdatasource/csv_data.go b/pkg/tsdb/testdatasource/csv_data.go index 8154695db05..e45ded815b4 100644 --- a/pkg/tsdb/testdatasource/csv_data.go +++ b/pkg/tsdb/testdatasource/csv_data.go @@ -8,7 +8,6 @@ import ( "io" "os" "path/filepath" - "regexp" "strconv" "strings" "time" @@ -73,13 +72,12 @@ func (s *Service) handleCsvFileScenario(ctx context.Context, req *backend.QueryD } func (s *Service) loadCsvFile(fileName string) (*data.Frame, error) { - validFileName := regexp.MustCompile(`([\w_]+)\.csv`) - - if !validFileName.MatchString(fileName) { + if filepath.Ext(fileName) != ".csv" || strings.Contains(fileName, "..") { return nil, fmt.Errorf("invalid csv file name: %q", fileName) } - filePath := filepath.Join(s.cfg.StaticRootPath, "testdata", fileName) + csvFilepath := filepath.Clean(filepath.Join("/", fileName)) + filePath := filepath.Join(s.cfg.StaticRootPath, "testdata", csvFilepath) // Can ignore gosec G304 here, because we check the file pattern above // nolint:gosec