Skip to content

Commit 6ed4d7b

Browse files
fix(provisioner): split SSH sessions in createKindConfig (#657)
SSH sessions in x/crypto/ssh are single-use. The old code called session.Run() then tried session.StdinPipe() on the same session, which always failed. Split into two sessions (mkdir + file write), following the pattern used in createKubeAdmConfig. Also close the local file that was previously leaked. Audit findings #2 (HIGH), #12 (MEDIUM). Signed-off-by: Carlos Eduardo Arango Gutierrez <eduardoa@nvidia.com>
1 parent dd99942 commit 6ed4d7b

File tree

1 file changed

+23
-22
lines changed

1 file changed

+23
-22
lines changed

pkg/provisioner/provisioner.go

Lines changed: 23 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -274,55 +274,56 @@ func (p *Provisioner) provision() error {
274274
}
275275

276276
func (p *Provisioner) createKindConfig(env v1alpha1.Environment) error {
277-
// Specify the remote file path
278277
remoteFilePath := remoteKindConfig
279278

280-
// Create a session
281-
session, err := p.Client.NewSession()
279+
// Session 1: create remote directory
280+
session1, err := p.Client.NewSession()
282281
if err != nil {
283282
return fmt.Errorf("failed to create session: %w", err)
284283
}
285-
defer func() { _ = session.Close() }()
286-
287-
// create remote directory if it does not exist
288-
if err := session.Run("sudo mkdir -p /etc/kubernetes"); err != nil {
284+
if err := session1.Run("sudo mkdir -p /etc/kubernetes"); err != nil {
285+
_ = session1.Close()
289286
return fmt.Errorf("failed to create remote directory /etc/kubernetes: %w", err)
290287
}
288+
_ = session1.Close()
291289

292-
// Open a remote file for writing
293-
remoteFile, err := session.StdinPipe()
290+
// Session 2: write file to remote
291+
session2, err := p.Client.NewSession()
292+
if err != nil {
293+
return fmt.Errorf("failed to create session: %w", err)
294+
}
295+
defer func() { _ = session2.Close() }()
296+
297+
remoteFile, err := session2.StdinPipe()
294298
if err != nil {
295299
return fmt.Errorf("failed to open remote file %s: %w", remoteFilePath, err)
296300
}
297-
if err := session.Start("cat > " + remoteFilePath); err != nil {
301+
if err := session2.Start("cat > " + remoteFilePath); err != nil {
298302
return fmt.Errorf("failed to start session: %w", err)
299303
}
300304

301-
// open local file for reading
302-
// first check if file path is relative or absolute
303-
// if relative, then prepend the current working directory
304-
if !filepath.IsAbs(env.Spec.Kubernetes.KindConfig) {
305+
// Resolve local file path
306+
kindConfigPath := env.Spec.Kubernetes.KindConfig
307+
if !filepath.IsAbs(kindConfigPath) {
305308
cwd, err := os.Getwd()
306309
if err != nil {
307310
return fmt.Errorf("failed to get current working directory: %w", err)
308311
}
309-
310-
env.Spec.Kubernetes.KindConfig = filepath.Join(cwd, strings.TrimPrefix(env.Spec.Kubernetes.KindConfig, "./"))
312+
kindConfigPath = filepath.Join(cwd, strings.TrimPrefix(kindConfigPath, "./"))
311313
}
312314

313-
localFile, err := os.Open(env.Spec.Kubernetes.KindConfig)
315+
localFile, err := os.Open(kindConfigPath) //nolint:gosec // path from user-provided config
314316
if err != nil {
315-
return fmt.Errorf("failed to open local file %s: %w", env.Spec.Kubernetes.KindConfig, err)
317+
return fmt.Errorf("failed to open local file %s: %w", kindConfigPath, err)
316318
}
319+
defer func() { _ = localFile.Close() }()
317320

318-
// copy local file to remote file
319321
if _, err := io.Copy(remoteFile, localFile); err != nil {
320-
return fmt.Errorf("failed to copy local file %s to remote file %s: %w", env.Spec.Kubernetes.KindConfig, remoteFilePath, err)
322+
return fmt.Errorf("failed to copy local file %s to remote file %s: %w", kindConfigPath, remoteFilePath, err)
321323
}
322324

323-
// Close the writing pipe and wait for the session to finish
324325
_ = remoteFile.Close()
325-
if err := session.Wait(); err != nil {
326+
if err := session2.Wait(); err != nil {
326327
return fmt.Errorf("failed to wait for command to complete: %w", err)
327328
}
328329

0 commit comments

Comments
 (0)