Skip to content

Commit 6b2d232

Browse files
Add unit test to not log stdout/stderr create task request fields (#782)
In the shim logger use case, the stdout or stderr fields for create task can be the full binary URI and contain sensitive information via environment variables or parameters. Since this is not a clean solution to redact this information, it is best to not log them to disk. Signed-off-by: Austin Vazquez <[email protected]>
1 parent e5cd857 commit 6b2d232

File tree

1 file changed

+47
-0
lines changed

1 file changed

+47
-0
lines changed

runtime/service_test.go

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,15 @@ import (
1818
"fmt"
1919
"os"
2020
"path/filepath"
21+
"strings"
2122
"testing"
2223

24+
"github.com/containerd/containerd/namespaces"
25+
"github.com/containerd/containerd/runtime/v2/task"
2326
"github.com/firecracker-microvm/firecracker-go-sdk"
2427
models "github.com/firecracker-microvm/firecracker-go-sdk/client/models"
2528
"github.com/sirupsen/logrus"
29+
"github.com/sirupsen/logrus/hooks/test"
2630
"github.com/stretchr/testify/assert"
2731
"github.com/stretchr/testify/require"
2832

@@ -323,3 +327,46 @@ func TestDebugConfig(t *testing.T) {
323327
assert.Equal(t, c.service.config.DebugHelper.GetFirecrackerLogLevel(), cfg.LogLevel)
324328
}
325329
}
330+
331+
// TestTaskCreateDoesNotLogStdoutOrStderrFields validates the firecracker-containerd runtime service implementation
332+
// does not log the Stdout/Stderr request fields because they may contain sensitive information for the shim logger binary use case.
333+
func TestTaskCreateDoesNotLogStdoutOrStderrFields(t *testing.T) {
334+
testLogger, hook := test.NewNullLogger()
335+
testLogger.Level = logrus.DebugLevel
336+
337+
vmIsReady := make(chan struct{})
338+
close(vmIsReady)
339+
340+
uut := service{
341+
logger: logrus.NewEntry(testLogger),
342+
vmReady: vmIsReady,
343+
}
344+
345+
ctx := namespaces.WithNamespace(context.Background(), defaultNamespace)
346+
createTaskRequest := &task.CreateTaskRequest{
347+
ID: t.Name(),
348+
Stdout: "/sbin/shim-loggers-for-containerd --env USERNAME=admin --env PASSWORD=admin",
349+
Stderr: "/sbin/shim-loggers-for-containerd --env TOKEN=tolkien",
350+
}
351+
352+
// (*service).Create will fail on (Dir).CreateBundleLink after the log we want to validate.
353+
_, _ = uut.Create(ctx, createTaskRequest)
354+
355+
require.GreaterOrEqual(t, len(hook.AllEntries()), 1, "Log hook did not receive a log message")
356+
357+
for _, entry := range hook.AllEntries() {
358+
assert.Contains(t, entry.Data, "task_id", "Log hook entry does not contain 'task_id' field")
359+
360+
for k, v := range entry.Data {
361+
valueStr := fmt.Sprintf("%s", v)
362+
if strings.EqualFold(k, "stdout") || strings.Contains(valueStr, "admin") {
363+
t.Logf("Log entry found with stdout field which may contain sensitive information: key=%s, value=%s", k, v)
364+
t.Fail()
365+
}
366+
if strings.EqualFold(k, "stderr") || strings.Contains(valueStr, "tolkien") {
367+
t.Logf("Log entry found with stderr field which may contain sensitive information: key=%s, value=%s", k, v)
368+
t.Fail()
369+
}
370+
}
371+
}
372+
}

0 commit comments

Comments
 (0)