From b94988ebaceb7fca741a082cc98dcb72d4c86a00 Mon Sep 17 00:00:00 2001 From: Erik Tate Date: Thu, 11 Jun 2026 15:06:48 -0400 Subject: [PATCH] reject path separators in scp received file names (#67604) Signed-off-by: Erik Tate Co-authored-by: alhudz --- lib/sshutils/scp/scp.go | 3 ++- lib/sshutils/scp/scp_test.go | 23 +++++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/lib/sshutils/scp/scp.go b/lib/sshutils/scp/scp.go index ebaa842b9b4..e5ab80d9378 100644 --- a/lib/sshutils/scp/scp.go +++ b/lib/sshutils/scp/scp.go @@ -648,7 +648,8 @@ func parseNewFile(line string) (*newFileCmd, error) { // * https://sintonen.fi/advisories/scp-client-multiple-vulnerabilities.txt // * https://github.com/openssh/openssh-portable/commit/6010c03 c.Name = parts[2] - if len(c.Name) == 0 || strings.HasPrefix(c.Name, string(filepath.Separator)) || c.Name == "." || c.Name == ".." { + if len(c.Name) == 0 || c.Name == "." || c.Name == ".." || + strings.ContainsRune(c.Name, '/') || strings.ContainsRune(c.Name, '\\') { return nil, trace.BadParameter("invalid name") } diff --git a/lib/sshutils/scp/scp_test.go b/lib/sshutils/scp/scp_test.go index 8a72b462852..701c1a61cc4 100644 --- a/lib/sshutils/scp/scp_test.go +++ b/lib/sshutils/scp/scp_test.go @@ -852,3 +852,26 @@ var testNow = time.Date(1984, time.April, 4, 0, 0, 0, 0, time.UTC) func args(params ...string) []string { return params } + +func TestParseNewFileRejectsPathComponents(t *testing.T) { + t.Parallel() + + rejected := []string{ + "", + ".", + "..", + "/etc/passwd", + "../../../tmp/evil", + "sub/../../etc/passwd", + "sub/evil", + `sub\evil`, + } + for _, name := range rejected { + _, err := parseNewFile("0644 10 " + name) + require.Error(t, err, "name %q must be rejected", name) + } + + c, err := parseNewFile("0644 10 file.txt") + require.NoError(t, err) + require.Equal(t, "file.txt", c.Name) +}