Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions cmd/ocm-backplane/cloud/ssm.go
Original file line number Diff line number Diff line change
Expand Up @@ -248,10 +248,10 @@ func runSSMsession(ssmClient SSMClient, instanceID string, command []string, reg
return fmt.Errorf("session details are incomplete: SessionId=%v, StreamUrl=%v, TokenValue=%v", result.SessionId, result.StreamUrl, result.TokenValue)
}

// Log session details for debugging
logger.Infof("SessionId: %v", *result.SessionId)
logger.Infof("StreamUrl: %v", *result.StreamUrl)
logger.Infof("TokenValue: %v", *result.TokenValue)
// Log non-sensitive session identifier for debugging.
// StreamUrl and TokenValue are intentionally excluded from logs
// to prevent credential exposure (CWE-532, CWE-312).
logger.Debugf("SessionId: %v", *result.SessionId)

sessionJSON, err := json.Marshal(map[string]string{
"SessionId": *result.SessionId,
Expand Down
69 changes: 68 additions & 1 deletion cmd/ocm-backplane/cloud/ssm_test.go
Original file line number Diff line number Diff line change
@@ -1,17 +1,18 @@
package cloud

import (
"bytes"
"context"
"encoding/json"
"errors"
"io"
"fmt"
"os"
"os/exec"
"strings"

"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/service/ssm"
"go.uber.org/mock/gomock"
. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
cmv1 "github.com/openshift-online/ocm-sdk-go/clustersmgmt/v1"
Expand All @@ -21,7 +22,9 @@ import (
ocmMock "github.com/openshift/backplane-cli/pkg/ocm/mocks"
"github.com/openshift/backplane-cli/pkg/ssm/mocks"
"github.com/openshift/backplane-cli/pkg/utils"
log "github.com/sirupsen/logrus"
"github.com/spf13/cobra"
"go.uber.org/mock/gomock"
v1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
Expand Down Expand Up @@ -136,6 +139,70 @@ var _ = Describe("SSM command", func() {
})
})

Context("SSM session should not log sensitive credentials", func() {
var (
logBuf bytes.Buffer
originalExecCommand func(string, ...string) *exec.Cmd
originalLevel log.Level
originalOutput io.Writer
)

BeforeEach(func() {
logBuf.Reset()
originalLevel = log.GetLevel()
originalOutput = log.StandardLogger().Out
log.SetLevel(log.InfoLevel)
log.SetOutput(&logBuf)

originalExecCommand = ExecCommand
ExecCommand = func(name string, arg ...string) *exec.Cmd {
return exec.Command("echo", "mock command")
}

mockSSMClient.EXPECT().StartSession(
context.TODO(),
gomock.Any(),
).Return(&ssm.StartSessionOutput{
SessionId: aws.String("test-session-id"),
StreamUrl: aws.String("wss://secret-stream-url.example.com"),
TokenValue: aws.String("secret-token-value-abc123"),
}, nil)
})

AfterEach(func() {
ExecCommand = originalExecCommand
log.SetLevel(originalLevel)
log.SetOutput(originalOutput)
})
Comment thread
coderabbitai[bot] marked this conversation as resolved.

It("should not log TokenValue at Info level", func() {
err := runSSMsession(mockSSMClient, "i-1234567890abcdef0", nil, "us-west-2")
Expect(err).ToNot(HaveOccurred())

logOutput := logBuf.String()
Expect(logOutput).ToNot(ContainSubstring("secret-token-value-abc123"),
"TokenValue should not appear in log output at Info level")
})

It("should not log StreamUrl at Info level", func() {
err := runSSMsession(mockSSMClient, "i-1234567890abcdef0", nil, "us-west-2")
Expect(err).ToNot(HaveOccurred())

logOutput := logBuf.String()
Expect(logOutput).ToNot(ContainSubstring("wss://secret-stream-url.example.com"),
"StreamUrl should not appear in log output at Info level")
})

It("should not log SessionId at Info level", func() {
err := runSSMsession(mockSSMClient, "i-1234567890abcdef0", nil, "us-west-2")
Expect(err).ToNot(HaveOccurred())

logOutput := logBuf.String()
Expect(logOutput).ToNot(ContainSubstring("test-session-id"),
"SessionId should only appear at Debug level, not Info")
})
})

var _ = Describe("SSM command", func() {
var (
originalExecCommand func(string, ...string) *exec.Cmd
Expand Down