Skip to content

Commit f362ca8

Browse files
fix(provisioner): split SSH sessions in createKindConfig
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 86aa79d commit f362ca8

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
@@ -270,55 +270,56 @@ func (p *Provisioner) provision() error {
270270
}
271271

272272
func (p *Provisioner) createKindConfig(env v1alpha1.Environment) error {
273-
// Specify the remote file path
274273
remoteFilePath := remoteKindConfig
275274

276-
// Create a session
277-
session, err := p.Client.NewSession()
275+
// Session 1: create remote directory
276+
session1, err := p.Client.NewSession()
278277
if err != nil {
279278
return fmt.Errorf("failed to create session: %w", err)
280279
}
281-
defer func() { _ = session.Close() }()
282-
283-
// create remote directory if it does not exist
284-
if err := session.Run("sudo mkdir -p /etc/kubernetes"); err != nil {
280+
if err := session1.Run("sudo mkdir -p /etc/kubernetes"); err != nil {
281+
_ = session1.Close()
285282
return fmt.Errorf("failed to create remote directory /etc/kubernetes: %w", err)
286283
}
284+
_ = session1.Close()
287285

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

297-
// open local file for reading
298-
// first check if file path is relative or absolute
299-
// if relative, then prepend the current working directory
300-
if !filepath.IsAbs(env.Spec.Kubernetes.KindConfig) {
301+
// Resolve local file path
302+
kindConfigPath := env.Spec.Kubernetes.KindConfig
303+
if !filepath.IsAbs(kindConfigPath) {
301304
cwd, err := os.Getwd()
302305
if err != nil {
303306
return fmt.Errorf("failed to get current working directory: %w", err)
304307
}
305-
306-
env.Spec.Kubernetes.KindConfig = filepath.Join(cwd, strings.TrimPrefix(env.Spec.Kubernetes.KindConfig, "./"))
308+
kindConfigPath = filepath.Join(cwd, strings.TrimPrefix(kindConfigPath, "./"))
307309
}
308310

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

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

319-
// Close the writing pipe and wait for the session to finish
320321
_ = remoteFile.Close()
321-
if err := session.Wait(); err != nil {
322+
if err := session2.Wait(); err != nil {
322323
return fmt.Errorf("failed to wait for command to complete: %w", err)
323324
}
324325

0 commit comments

Comments
 (0)