mirror of
https://github.com/gravitational/teleport.git
synced 2026-10-11 22:49:54 +00:00
unset XAUTHORITY env var for the networking command (#65713)
* unset XAUTHORITY env var for the networking command When Teleport passes almost all the environment variables to the child processes that are born of a reexec. This is an issue when XAUTHORITY is set as it will be passed to the networking process, causing `xauth` to use a different file than the one that the SSH session process will use. This is because the SSH session process only inherits a small subset of the environment variables from the parent process, and XAUTHORITY is not one of them. This causes X11 forwarding to fail. * add Remove method to SafeEnv
This commit is contained in:
@@ -1018,7 +1018,6 @@ func testSessionRecordingModes(t *testing.T, suite *integrationTestSuite) {
|
|||||||
term.Type("exit\n\r")
|
term.Type("exit\n\r")
|
||||||
waitSessionTermination(t, errCh, require.NoError)
|
waitSessionTermination(t, errCh, require.NoError)
|
||||||
})
|
})
|
||||||
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -4636,6 +4635,11 @@ func testX11Forwarding(t *testing.T, suite *integrationTestSuite) {
|
|||||||
t.Skip("Skipping TestX11Forwarding, no external SSH binary found.")
|
t.Skip("Skipping TestX11Forwarding, no external SSH binary found.")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Set XAUTHORITY to a non-existent path to ensure that XAUTHORITY
|
||||||
|
// is unset for the networking command, if it isn't xauth will attempt
|
||||||
|
// to read /does/not/exist and fail, causing X11 forwarding to fail.
|
||||||
|
t.Setenv(x11.XAuthFileEnvVar, "/does/not/exist")
|
||||||
|
|
||||||
// Create a fake client XServer listener.
|
// Create a fake client XServer listener.
|
||||||
clientXServer, clientDisplay, err := x11.OpenNewXServerListener(x11.DefaultDisplayOffset, x11.DefaultMaxDisplays, 0)
|
clientXServer, clientDisplay, err := x11.OpenNewXServerListener(x11.DefaultDisplayOffset, x11.DefaultMaxDisplays, 0)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|||||||
+10
-4
@@ -44,6 +44,7 @@ import (
|
|||||||
"github.com/gravitational/teleport/lib/events"
|
"github.com/gravitational/teleport/lib/events"
|
||||||
"github.com/gravitational/teleport/lib/sshutils/reexec"
|
"github.com/gravitational/teleport/lib/sshutils/reexec"
|
||||||
"github.com/gravitational/teleport/session/envutils"
|
"github.com/gravitational/teleport/session/envutils"
|
||||||
|
"github.com/gravitational/teleport/session/networking/x11"
|
||||||
sessionreexec "github.com/gravitational/teleport/session/reexec"
|
sessionreexec "github.com/gravitational/teleport/session/reexec"
|
||||||
"github.com/gravitational/teleport/session/reexec/reexecconstants"
|
"github.com/gravitational/teleport/session/reexec/reexecconstants"
|
||||||
)
|
)
|
||||||
@@ -701,11 +702,20 @@ func ConfigureCommand(ctx *ServerContext, extraFiles ...*os.File) (*exec.Cmd, er
|
|||||||
return nil, trace.Wrap(err)
|
return nil, trace.Wrap(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Build env for `teleport exec`.
|
||||||
|
env := &envutils.SafeEnv{}
|
||||||
|
env.AddExecEnvironment()
|
||||||
|
|
||||||
// The channel/request type determines the subcommand to execute.
|
// The channel/request type determines the subcommand to execute.
|
||||||
var subCommand string
|
var subCommand string
|
||||||
switch ctx.ExecType {
|
switch ctx.ExecType {
|
||||||
case reexecconstants.NetworkingSubCommand:
|
case reexecconstants.NetworkingSubCommand:
|
||||||
subCommand = reexecconstants.NetworkingSubCommand
|
subCommand = reexecconstants.NetworkingSubCommand
|
||||||
|
|
||||||
|
// Unset XAUTHORITY for the networking command as the SSH session
|
||||||
|
// process given to the user will not have it set which can cause
|
||||||
|
// issues with the X11 forwarding.
|
||||||
|
env.Remove(x11.XAuthFileEnvVar)
|
||||||
default:
|
default:
|
||||||
subCommand = reexecconstants.ExecSubCommand
|
subCommand = reexecconstants.ExecSubCommand
|
||||||
}
|
}
|
||||||
@@ -714,10 +724,6 @@ func ConfigureCommand(ctx *ServerContext, extraFiles ...*os.File) (*exec.Cmd, er
|
|||||||
// is appended if Teleport is running in debug mode.
|
// is appended if Teleport is running in debug mode.
|
||||||
args := []string{executable, subCommand}
|
args := []string{executable, subCommand}
|
||||||
|
|
||||||
// build env for `teleport exec`
|
|
||||||
env := &envutils.SafeEnv{}
|
|
||||||
env.AddExecEnvironment()
|
|
||||||
|
|
||||||
// Build the "teleport exec" command.
|
// Build the "teleport exec" command.
|
||||||
cmd := &exec.Cmd{
|
cmd := &exec.Cmd{
|
||||||
Path: executable,
|
Path: executable,
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ import (
|
|||||||
"io"
|
"io"
|
||||||
"log/slog"
|
"log/slog"
|
||||||
"os"
|
"os"
|
||||||
|
"slices"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/gravitational/trace"
|
"github.com/gravitational/trace"
|
||||||
@@ -174,3 +175,11 @@ func (e *SafeEnv) isUnsafeKey(preventDuplicates bool, key string) bool {
|
|||||||
func (e *SafeEnv) AddExecEnvironment() {
|
func (e *SafeEnv) AddExecEnvironment() {
|
||||||
e.addFull(true, os.Environ())
|
e.addFull(true, os.Environ())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Remove deletes the key and value from the environment if it exists.
|
||||||
|
func (e *SafeEnv) Remove(key string) {
|
||||||
|
keyPrefix := key + "="
|
||||||
|
*e = slices.DeleteFunc(*e, func(s string) bool {
|
||||||
|
return strings.HasPrefix(s, keyPrefix)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|||||||
@@ -33,6 +33,10 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
// XAuthFileEnvVar is the environment variable used to specify the path to the
|
||||||
|
// X11 authorization file.
|
||||||
|
XAuthFileEnvVar = "XAUTHORITY"
|
||||||
|
|
||||||
// mitMagicCookieProto is the default xauth protocol used for X11 forwarding.
|
// mitMagicCookieProto is the default xauth protocol used for X11 forwarding.
|
||||||
mitMagicCookieProto = "MIT-MAGIC-COOKIE-1"
|
mitMagicCookieProto = "MIT-MAGIC-COOKIE-1"
|
||||||
// mitMagicCookieSize is the number of bytes in an mit magic cookie.
|
// mitMagicCookieSize is the number of bytes in an mit magic cookie.
|
||||||
|
|||||||
Reference in New Issue
Block a user