From 7151bd48c6a137819bf6b2cfc1231c879ab9f348 Mon Sep 17 00:00:00 2001 From: Shahriyar Jalayeri Date: Wed, 13 Nov 2024 00:09:03 +0200 Subject: [PATCH 1/2] secure-logs : add implementation of FssAgg Add implementation "Forward-secure sequential aggregate authentication." Signed-off-by: Shahriyar Jalayeri --- pkg/newlog/cmd/fssagg.go | 95 ++++ pkg/newlog/cmd/newlogd.go | 307 +++++++++-- pkg/newlog/cmd/seclog_perf_test.go | 480 ++++++++++++++++++ pkg/newlog/cmd/seclog_test.go | 453 +++++++++++++++++ pkg/newlog/testdata/dev.log.sample | 46 ++ pkg/newlog/testdata/perf/README.md | 39 ++ ...saggsig_average_secure_non_secure_time.png | Bin 0 -> 54657 bytes .../perf/fssaggsig_overhead_and_cost.png | Bin 0 -> 56593 bytes .../perf/fssaggsig_timing_results.csv | 9 + ...saggver_average_secure_non_secure_time.png | Bin 0 -> 44903 bytes ...s_10000_average_secure_non_secure_time.png | Bin 0 -> 48746 bytes ...er_cached_keys_10000_overhead_and_cost.png | Bin 0 -> 51872 bytes ...ggver_cached_keys_10000_timing_results.csv | 9 + .../perf/fssaggver_overhead_and_cost.png | Bin 0 -> 60674 bytes .../perf/fssaggver_timing_results.csv | 9 + pkg/newlog/testdata/perf/plot.py | 62 +++ 16 files changed, 1478 insertions(+), 31 deletions(-) create mode 100644 pkg/newlog/cmd/fssagg.go create mode 100644 pkg/newlog/cmd/seclog_perf_test.go create mode 100644 pkg/newlog/cmd/seclog_test.go create mode 100644 pkg/newlog/testdata/dev.log.sample create mode 100644 pkg/newlog/testdata/perf/README.md create mode 100644 pkg/newlog/testdata/perf/fssaggsig_average_secure_non_secure_time.png create mode 100644 pkg/newlog/testdata/perf/fssaggsig_overhead_and_cost.png create mode 100644 pkg/newlog/testdata/perf/fssaggsig_timing_results.csv create mode 100644 pkg/newlog/testdata/perf/fssaggver_average_secure_non_secure_time.png create mode 100644 pkg/newlog/testdata/perf/fssaggver_cached_keys_10000_average_secure_non_secure_time.png create mode 100644 pkg/newlog/testdata/perf/fssaggver_cached_keys_10000_overhead_and_cost.png create mode 100644 pkg/newlog/testdata/perf/fssaggver_cached_keys_10000_timing_results.csv create mode 100644 pkg/newlog/testdata/perf/fssaggver_overhead_and_cost.png create mode 100644 pkg/newlog/testdata/perf/fssaggver_timing_results.csv create mode 100644 pkg/newlog/testdata/perf/plot.py diff --git a/pkg/newlog/cmd/fssagg.go b/pkg/newlog/cmd/fssagg.go new file mode 100644 index 0000000000..fe06bf5ace --- /dev/null +++ b/pkg/newlog/cmd/fssagg.go @@ -0,0 +1,95 @@ +// Copyright (c) 2024 Zededa, Inc. +// SPDX-License-Identifier: Apache-2.0 + +package main + +import ( + "crypto/hmac" + "crypto/sha256" +) + +// Notes : +// This is based on wor of Ma and Tsudik: +// Ma, Di, and Gene Tsudik. "Forward-secure sequential aggregate authentication." +// IEEE Symposium on Security and Privacy (SP'07). IEEE, 2007. +// https://eprint.iacr.org/2007/052.pdf +// +// This implementation provides forward security, content integrity, stream integrity +// and truncation detection for each batch of logs *gzipped*. This means logs not +// yet processed by the newlogd are not protected by this scheme, the risk of an +// attacker compromising the logs can be lowered by adjusting the batch size or time +// interval to create batches of logs more frequently. +// +// Current implementation lacks the batch (or tail) deletion detection, this is +// to be implemented in the next version using tpm. +// +// Pure golang implementation of FssAgg might not be entirely safe, the initial +// key, before gc collected, might hang around a bit and swapped into disk if +// the attacker puts the system under memory pressure. Bear in mid this is a highly +// unlikly scenario. Unfortunately mlocking might not possible to implement as +// the underlying golang crypto calls copy data around into not locked memory. + +// h must be a collision-resistant one-way hash function (we are using SHA-256, +// ofcouse given enough universes nothing is collision resistant) +func h(data []byte) []byte { + h := sha256.New() + h.Write(data) + return h.Sum(nil) +} + +// hsk must be a secure MAC function h (here we are using HMAC with SHA-256 and a secret key) +func hsk(key, message []byte) []byte { + mac := hmac.New(sha256.New, key) + mac.Write(message) + return mac.Sum(nil) +} + +// fssAggUpd updates key using hash of previous key +func fssAggUpd(prevKey []byte) []byte { + return h(prevKey) +} + +// FssAggSig takes the current key, aggregated signature so far and a message, +// calculates the message MAC, updated aggregated signature and updates the key +// for forward security. It returns the aggregated signature plus the updated key. +func fssAggSig(key, aggMAC, message []byte) ([]byte, []byte) { + var aggSig []byte + + // generate MAC for current message and aggregate current MAC with previous MACs + curMAC := hsk(key, message) + aggSig = h(append(aggMAC, curMAC...)) + + // update key for forward security + nextKey := fssAggUpd(key) + + return nextKey, aggSig +} + +// FssAggVer verifies aggregated signature over messages, accepting the initial +// secret key and the aggregate signature, returning a boolean indicating the +// verification result. +func fssAggVer(secretKey, aggSig []byte, messages [][]byte) bool { + key := secretKey + var computedAggSig []byte + + for _, message := range messages { + // generate MAC for current message + curMAC := hsk(key, message) + // aggregate current MAC with previous MACs + computedAggSig = h(append(computedAggSig, curMAC...)) + + // update key + key = fssAggUpd(key) + } + + // this compare is constant time, so no time leak and attack. + return hmac.Equal(computedAggSig, aggSig) +} + +func evolveKey(secretKey []byte, num uint64) []byte { + key := secretKey + for i := uint64(0); i < num; i++ { + key = fssAggUpd(key) + } + return key +} diff --git a/pkg/newlog/cmd/newlogd.go b/pkg/newlog/cmd/newlogd.go index e7b06ec467..91e9952d59 100644 --- a/pkg/newlog/cmd/newlogd.go +++ b/pkg/newlog/cmd/newlogd.go @@ -7,10 +7,12 @@ import ( "bufio" "bytes" "compress/gzip" + "encoding/base64" "encoding/json" "flag" "fmt" "io" + "math/rand" "net" "os" "path" @@ -39,33 +41,14 @@ import ( ) const ( - agentName = "newlogd" - errorTime = 3 * time.Minute - warningTime = 40 * time.Second - metricsPublishInterval = 300 * time.Second - logfileDelay = 300 // maximum delay 5 minutes for log file collection - fastlogfileDelay = 10 // faster to close log file if fastUpload is enabled - stillRunningInerval = 25 * time.Second - - collectDir = types.NewlogCollectDir - uploadDevDir = types.NewlogUploadDevDir - uploadAppDir = types.NewlogUploadAppDir - keepSentDir = types.NewlogKeepSentQueueDir - failSendDir = types.NewlogDir + "/failedUpload" - panicFileDir = types.NewlogDir + "/panicStacks" - symlinkFile = collectDir + "/current.device.log" - tmpSymlink = collectDir + "/tmp-sym.dev.log" - devPrefix = types.DevPrefix - appPrefix = types.AppPrefix - tmpPrefix = "TempFile" - skipUpload = "skipTx." - - maxLogFileSize int32 = 550000 // maximum collect file size in bytes - maxGzipFileSize int64 = 50000 // maximum gzipped file size for upload in bytes - gzipFileFooter int64 = 12 // size of gzip footer to use in calculations - defaultSyncCount = 30 // default log events flush/sync to disk file - - maxToSendMbytes uint32 = 2048 // default 2 Gbytes for log files remains on disk + agentName = "newlogd" + errorTime = 3 * time.Minute + warningTime = 40 * time.Second + metricsPublishInterval = 300 * time.Second + logfileDelay = 300 // maximum delay 5 minutes for log file collection + fastlogfileDelay = 10 // faster to close log file if fastUpload is enabled + stillRunningInerval = 25 * time.Second + maxToSendMbytes uint32 = 2048 // default 2 Gbytes for log files remains on disk ansi = "[\u0009\u001B\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[a-zA-Z\\d]*)*)?\u0007)|(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PRZcf-ntqry=><~]))" ) @@ -110,8 +93,37 @@ var ( // goroutine sync/atomic synchronization is used. You've been warned. syslogPrio = types.SyslogKernelLogLevelNum[types.SyslogKernelDefaultLogLevel] kernelPrio = types.SyslogKernelLogLevelNum[types.SyslogKernelDefaultLogLevel] + + // these are constant in principle, but we need to be able to change them + // for testing. + collectDir = types.NewlogCollectDir + uploadDevDir = types.NewlogUploadDevDir + uploadAppDir = types.NewlogUploadAppDir + keepSentDir = types.NewlogKeepSentQueueDir + failSendDir = types.NewlogDir + "/failedUpload" + panicFileDir = types.NewlogDir + "/panicStacks" + symlinkFile = collectDir + "/current.device.log" + tmpSymlink = collectDir + "/tmp-sym.dev.log" + devPrefix = types.DevPrefix + appPrefix = types.AppPrefix + tmpPrefix = "TempFile" + skipUpload = "skipTx." + + maxLogFileSize int32 = 550000 // maximum collect file size in bytes + maxGzipFileSize int64 = 50000 // maximum gzipped file size for upload in bytes + gzipFileFooter int64 = 12 // size of gzip footer to use in calculations + defaultSyncCount = 30 // default log events flush/sync to disk file + + // for log verification + secLog secLogMetadata ) +type secLogMetadata struct { + key []byte + keyIter uint64 + enabled bool +} + // for app Domain-ID mapping into UUID and DisplayName type appDomain struct { appUUID string @@ -210,6 +222,20 @@ func main() { // handle linux Syslog /dev/log messages go getSyslogMsg(loggerChan) + // initialize secure logging key + // this is fixed key, in practice we generate a random key and + // store it in the TPM just like we do the volume storage key. + secLog.key = []byte{ + 0x12, 0x34, 0x56, 0x78, + 0x9A, 0xBC, 0xDE, 0xF0, + 0x11, 0x22, 0x33, 0x44, + 0x55, 0x66, 0x77, 0x88, + } + // evolve the key, so the initial key is gone from memory. + // no need to be random, but looks cool. + secLog.keyIter = uint64(rand.Intn(100)) + secLog.key = evolveKey(secLog.key, secLog.keyIter) + stillRunning := time.NewTicker(stillRunningInerval) ps.StillRunning(agentName, warningTime, errorTime) @@ -335,7 +361,11 @@ func main() { case tmpLogfileInfo := <-movefileChan: // handle logfile to gzip conversion work - doMoveCompressFile(&ps, tmpLogfileInfo) + if secLog.enabled { + doMoveCompressFileSecure(&ps, tmpLogfileInfo) + } else { + doMoveCompressFile(&ps, tmpLogfileInfo) + } case panicBuf := <-panicFileChan: // save panic stack into files @@ -522,6 +552,10 @@ func handleGlobalConfigImp(ctxArg interface{}, key string, statusArg interface{} // parse kernel log level kernelPrioStr := gcp.GlobalValueString(types.KernelLogLevel) atomic.StoreUint32(&kernelPrio, parseLogLevel(kernelPrioStr)) + + // enable secure logging + // secLog.enabled = gcp.GlobalValueBool(types.EnableSecureLogging) + secLog.enabled = true } log.Tracef("handleGlobalConfigModify done for %s, fastupload enabled %v", key, enableFastUpload) } @@ -1121,7 +1155,7 @@ func doMoveCompressFile(ps *pubsub.PubSub, tmplogfileInfo fileChanInfo) { // note: bytesWritten may be updated eventually because of gzip implementation // potentially we cannot account maxGzipFileSize less than windowsize of gzip 32768 if underlayWriter.bytesWritten+gzipFileFooter+int64(len(newLine)) >= maxGzipFileSize { - newSize += finalizeGzipToOutTempFile(gw, oTmpFile, outfile) + newSize += finalizeGzipToOutTempFile(gw, nil, oTmpFile, outfile) logmetrics.NumBreakGZipFile++ fileID++ outfile = gzipFileNameGet(isApp, timeNowNum+fileID, dirName, appuuid, tmplogfileInfo.notUpload) @@ -1135,7 +1169,210 @@ func doMoveCompressFile(ps *pubsub.PubSub, tmplogfileInfo fileChanInfo) { if scanner.Err() != nil { log.Fatal("doMoveCompressFile: reading file failed", scanner.Err()) } - newSize += finalizeGzipToOutTempFile(gw, oTmpFile, outfile) + newSize += finalizeGzipToOutTempFile(gw, nil, oTmpFile, outfile) + fileID++ + + // store variable to check for the new file name generator + lastLogNum = timeNowNum + fileID + + if isApp { + logmetrics.AppMetrics.NumGZipBytesWrite += uint64(newSize) + if tmplogfileInfo.notUpload { + logmetrics.NumSkipUploadAppFile += uint32(fileID) + } + } else { + logmetrics.DevMetrics.NumGZipBytesWrite += uint64(newSize) + } + + _ = iFile.Close() + // done gzip conversion, get rid of the temp log file in collect directory + err = os.Remove(tmplogfileInfo.tmpfile) + if err != nil { + log.Fatal("doMoveCompressFile: remove file failed", err) + } +} + +func sequenceLogEntry(entry []byte, seq int) ([]byte, error) { + jsonMap := make(map[string]interface{}) + err := json.Unmarshal(entry, &jsonMap) + if err != nil { + return nil, err + } + + jsonMap["seqNum"] = seq + out, err := json.Marshal(jsonMap) + if err != nil { + return nil, err + } + + return out, nil +} + +func addSecureLogMetadata(metadata string, aggSig []byte, keyIter uint64) (string, error) { + jsonMap := make(map[string]interface{}) + err := json.Unmarshal([]byte(metadata), &jsonMap) + if err != nil { + return "", err + } + + jsonMap["aggSig"] = base64.StdEncoding.EncodeToString(aggSig) + jsonMap["keyIter"] = keyIter + out, err := json.Marshal(jsonMap) + if err != nil { + return "", err + } + + return string(out), nil +} + +// doMoveCompressFileSecure process logs just like doMoveCompressFile but also +// calculates the aggregate signature for logs and adds necessary information +// to the log metadata so logs can be verified later. +func doMoveCompressFileSecure(ps *pubsub.PubSub, tmplogfileInfo fileChanInfo) { + isApp := tmplogfileInfo.isApp + dirName, appuuid := getFileInfo(tmplogfileInfo) + + now := time.Now() + timeNowNum := int(now.UnixNano() / int64(time.Millisecond)) // in msec + if timeNowNum < lastLogNum { + // adjust variable for file name generation to not overlap with the old one + timeNowNum = lastLogNum + 1 + } + outfile := gzipFileNameGet(isApp, timeNowNum, dirName, appuuid, tmplogfileInfo.notUpload) + + // open input file + iFile, err := os.Open(tmplogfileInfo.tmpfile) + if err != nil { + log.Fatal(err) + } + scanner := bufio.NewScanner(iFile) + // check if we cannot scan + // check valid json header for device log we will use later + if !scanner.Scan() || (!isApp && !json.Valid(scanner.Bytes())) { + _ = iFile.Close() + err = fmt.Errorf("doMoveCompressFile: can't get metadata on first line, remove %s", tmplogfileInfo.tmpfile) + log.Error(err) + if scanner.Err() != nil { + log.Error(scanner.Err()) + } + err = os.Remove(tmplogfileInfo.tmpfile) + if err != nil { + log.Fatal("doMoveCompressFile: remove file failed", err) + } + return + } + + // assign the metadata in the first line of the logfile + tmplogfileInfo.header = scanner.Text() + + // prepare writers to save gzipped logs + gw, underlayWriter, oTmpFile := prepareGzipToOutTempFile(filepath.Dir(outfile), tmplogfileInfo, now) + + fileID := 0 + wdTime := time.Now() + var newSize int64 + + // each log is processed, tagged with sequence number and then palced in + // the processedLogs slice. the log are later written into the gzip file + // in a call to finalizeGzipToOutTempFile. + var processedLogs = make([][]byte, 0) + // each log entry in a batch gets a sequence number, can be used to + // sort the logs for verification. + var logSeq = 0 + // batchKeyIter is what iteration of the key we start with, to calculate + // log entrieys HMAC and the aggregate signature. + var batchKeyIter = secLog.keyIter + // aggregateSig is the aggregate signature of all the logs in a batch + // that are processed. + var aggregateSig []byte + + for scanner.Scan() { + if time.Since(wdTime) >= (15 * time.Second) { + ps.StillRunning(agentName, warningTime, errorTime) + wdTime = time.Now() + } + newLine := scanner.Bytes() + //trim non-graphic symbols + newLine = bytes.TrimFunc(newLine, func(r rune) bool { + return !unicode.IsGraphic(r) + }) + if len(newLine) == 0 { + continue + } + if !json.Valid(newLine) { + log.Errorf("doMoveCompressFile: found broken line: %s", string(newLine)) + continue + } + // assume that next line is incompressible to be safe + // note: bytesWritten may be updated eventually because of gzip implementation + // potentially we cannot account maxGzipFileSize less than windowsize of gzip 32768 + if underlayWriter.bytesWritten+gzipFileFooter+int64(len(newLine)) >= maxGzipFileSize { + // we have reached the size limit of the gzip file, so before starting + // a new batch of logs, finalze the current batch of logs, add aggregate + // signature and key iteration to the gzip metadata, giving the verifier + // the information needed to verify the logs. + verifMetadate, err := addSecureLogMetadata(gw.Comment, aggregateSig, batchKeyIter) + if err != nil { + log.Errorf("doMoveCompressFile: addSecureLogMetadata failed: %v", err) + } else { + gw.Comment = verifMetadate + } + + // write the processed logs to the gzip file and finalize the gzip file. + newSize += finalizeGzipToOutTempFile(gw, processedLogs, oTmpFile, outfile) + + // reset the variables for the next gzip file + processedLogs = processedLogs[:0] + aggregateSig = []byte{} + batchKeyIter = secLog.keyIter + logSeq = 0 + + // update the metrics + logmetrics.NumBreakGZipFile++ + fileID++ + + // start a new batch + outfile = gzipFileNameGet(isApp, timeNowNum+fileID, dirName, appuuid, tmplogfileInfo.notUpload) + gw, underlayWriter, oTmpFile = prepareGzipToOutTempFile(filepath.Dir(outfile), tmplogfileInfo, now) + } + + // tag the log entry with sequence number and collect it + sequencedEntry, err := sequenceLogEntry(newLine, logSeq) + if err != nil { + log.Fatalf("doMoveCompressFile: sequenceLogEntry failed: %v", err) + } + logSeq++ + + // calculate the aggregate signature of the log entry, update the key and + // iteration counter. + secLog.key, aggregateSig = fssAggSig(secLog.key, aggregateSig, sequencedEntry) + secLog.keyIter++ + + // we are not writing the log entry to the gzip file yet, since it will + // write the header (metadata) of the gzip file in the first write(), + // but we are not ready yet, there might be more logs to process, + // signature to calculate and so on. so we just collect the log entries + // at this stage. + processedLogs = append(processedLogs, sequencedEntry) + } + if scanner.Err() != nil { + log.Fatal("doMoveCompressFile: reading file failed", scanner.Err()) + } + + // logs are processed, add aggregate signature and key iteration to the gzip + // metadata, giving the verifier the information needed to verify the logs. + // If you're wondering whether we should sign the device ID in the log batch with + // the TPM-based device key: we don't. Logs are wrapped in an auth container, + // this ensures the cloud knows these logs are from this device. + verifMetadate, err := addSecureLogMetadata(gw.Comment, aggregateSig, batchKeyIter) + if err != nil { + log.Errorf("doMoveCompressFile: addSecureLogMetadata failed: %v", err) + } else { + gw.Comment = verifMetadate + } + + // write the processed logs to the gzip file and finalize the gzip file. + newSize += finalizeGzipToOutTempFile(gw, processedLogs, oTmpFile, outfile) fileID++ // store variable to check for the new file name generator @@ -1205,7 +1442,15 @@ func prepareGzipToOutTempFile(gzipDirName string, fHdr fileChanInfo, now time.Ti return gw, writer, oTmpFile } -func finalizeGzipToOutTempFile(gw *gzip.Writer, oTmpFile *os.File, outfile string) int64 { +func finalizeGzipToOutTempFile(gw *gzip.Writer, logs [][]byte, oTmpFile *os.File, outfile string) int64 { + // this is non-empty only if when we are in secure log mode + for _, l := range logs { + _, err := gw.Write(append(l, '\n')) + if err != nil { + log.Fatal("finalizeGzipToOutTempFile: cannot write log", err) + } + } + err := gw.Close() if err != nil { log.Fatal("finalizeGzipToOutTempFile: cannot close file", err) diff --git a/pkg/newlog/cmd/seclog_perf_test.go b/pkg/newlog/cmd/seclog_perf_test.go new file mode 100644 index 0000000000..0bc3744483 --- /dev/null +++ b/pkg/newlog/cmd/seclog_perf_test.go @@ -0,0 +1,480 @@ +// Copyright (c) 2024 Zededa, Inc. +// SPDX-License-Identifier: Apache-2.0 + +package main + +import ( + "bufio" + "compress/gzip" + "encoding/csv" + "encoding/json" + "fmt" + "os" + "path" + "testing" + "time" + + "github.com/lf-edge/eve/pkg/pillar/base" + "github.com/lf-edge/eve/pkg/pillar/pubsub" + "github.com/sirupsen/logrus" +) + +var ( + runs = []int{10, 20, 30, 40, 50, 100, 200, 500} + growth = 10 + keyCacheBase = 10000 + keyCacheMax = 500000 +) + +func growLogContents(filename string, times int) error { + content, err := os.ReadFile(filename) + if err != nil { + return fmt.Errorf("failed to read file: %v", err) + } + + var newContent []byte + for i := 0; i < times; i++ { + newContent = append(newContent, content...) + } + + err = os.WriteFile(filename, newContent, 0777) + if err != nil { + return fmt.Errorf("failed to write to file: %v", err) + } + + return nil +} + +func processVerifyLogs(t *testing.T) { + // get the log gzipped file path + allLogs := listFilesInDir(uploadDevDir) + for _, logGzipped := range allLogs { + rf, err := os.Open(logGzipped) + if err != nil { + t.Fatalf("Failed to open %s: %s", logGzipped, err) + } + defer rf.Close() + + gr, err := gzip.NewReader(rf) + if err != nil { + t.Fatalf("Failed to create gzip reader: %s", err) + } + defer gr.Close() + + // read the batch metadata from gzipped metadata. + aggSig, keyIter, err := getLogVerficiationMetadata(gr.Comment) + if err != nil { + t.Fatalf("Failed to read secure log metadata from %s: %s", logGzipped, err) + } + + logs := make([][]byte, 0) + scanner := bufio.NewScanner(gr) + for scanner.Scan() { + if !json.Valid(scanner.Bytes()) { + t.Fatalf("Invalid JSON: %s", scanner.Text()) + } + logs = append(logs, append([]byte(nil), scanner.Bytes()...)) + } + + verifKey := evolveKey(sk0Test, keyIter) + res := fssAggVer(verifKey, aggSig, logs) + if !res { + t.Fatalf("Failed to verify logs") + } + } +} + +func processVerifyLogsWithCachedKeys(t *testing.T) { + // get the log gzipped file path + allLogs := listFilesInDir(uploadDevDir) + for _, logGzipped := range allLogs { + rf, err := os.Open(logGzipped) + if err != nil { + t.Fatalf("Failed to open %s: %s", logGzipped, err) + } + defer rf.Close() + + gr, err := gzip.NewReader(rf) + if err != nil { + t.Fatalf("Failed to create gzip reader: %s", err) + } + defer gr.Close() + + // read the batch metadata from gzipped metadata. + aggSig, keyIter, err := getLogVerficiationMetadata(gr.Comment) + if err != nil { + t.Fatalf("Failed to read secure log metadata from %s: %s", logGzipped, err) + } + + logs := make([][]byte, 0) + scanner := bufio.NewScanner(gr) + for scanner.Scan() { + if !json.Valid(scanner.Bytes()) { + t.Fatalf("Invalid JSON: %s", scanner.Text()) + } + logs = append(logs, append([]byte(nil), scanner.Bytes()...)) + } + + // shortcut? + if keyIter > uint64(keyCacheBase) { + keyIndex := (keyIter / uint64(keyCacheBase)) * uint64(keyCacheBase) + keyFile := fmt.Sprintf("key_%d", keyIndex) + + // read the key from the file + startingKey, err := os.ReadFile(keyFile) + if err != nil { + t.Fatalf("Failed to read cached key: %s", err) + } + + verifKey := evolveKey(startingKey, (keyIter - keyIndex)) + res := fssAggVer(verifKey, aggSig, logs) + if !res { + t.Fatalf("Failed to verify log with cached key") + } + } else { + verifKey := evolveKey(sk0Test, keyIter) + res := fssAggVer(verifKey, aggSig, logs) + if !res { + t.Fatalf("Failed to verify logs") + } + } + } +} + +func processLogs(t *testing.T) { + // get the log gzipped file path + allLogs := listFilesInDir(uploadDevDir) + for _, logGzipped := range allLogs { + rf, err := os.Open(logGzipped) + if err != nil { + t.Fatalf("Failed to open %s: %s", logGzipped, err) + } + defer rf.Close() + + gr, err := gzip.NewReader(rf) + if err != nil { + t.Fatalf("Failed to create gzip reader: %s", err) + } + defer gr.Close() + + // just read the logs + logs := make([][]byte, 0) + scanner := bufio.NewScanner(gr) + for scanner.Scan() { + if !json.Valid(scanner.Bytes()) { + t.Fatalf("Invalid JSON: %s", scanner.Text()) + } + logs = append(logs, append([]byte(nil), scanner.Bytes()...)) + } + } +} + +func cacheKeys() { + // cache the keys + for i := keyCacheBase; i <= keyCacheMax; i += keyCacheBase { + key := evolveKey(sk0Test, uint64(i)) + fd, err := os.Create(fmt.Sprintf("key_%d", i)) + if err != nil { + fmt.Printf("Failed to create key file: %s", err) + } + + _, _ = fd.Write(key) + fd.Close() + } +} + +func removeCachedKeys() { + // cache the keys + for i := keyCacheBase; i <= keyCacheMax; i += keyCacheBase { + os.Remove(fmt.Sprintf("key_%d", i)) + } +} + +func TestSecureLogAggregationPerformance(t *testing.T) { + if os.Getenv("RUN_SEC_LOG_PERF_TEST") == "" { + t.Skip("Skipping performance test") + } + + logger := logrus.StandardLogger() + log := base.NewSourceLogObject(logger, "seclog_test", os.Getpid()) + ps := pubsub.New(&pubsub.EmptyDriver{}, logger, log) + + // setup the test environment + makeTestDirs() + defer removeTestDirs() + + secLog.keyIter = 0 + secLog.key = sk0Test + + var fileinfo fileChanInfo + var secureLogTotalTime, nonSecureLogTotalTime time.Duration + for _, run := range runs { + for i := 0; i < run; i++ { + scr := logFile + dst := path.Join(collectDir, "dev.log.sample") + copyFile(scr, dst) + + // grow the log contents for better performance testing + err := growLogContents(dst, growth) + if err != nil { + t.Fatalf("Failed to grow log contents: %s", err) + } + + fileinfo.notUpload = true + fileinfo.tmpfile = dst + fileinfo.inputSize = 0 + + startSecureLog := time.Now() + doMoveCompressFileSecure(ps, fileinfo) + secureLogTotalTime += time.Since(startSecureLog) + + // non-secure log aggregation + scr = logFile + dst = path.Join(collectDir, "dev.log.sample") + copyFile(scr, dst) + + // grow the log contents for better performance testing + err = growLogContents(dst, growth) + if err != nil { + t.Fatalf("Failed to grow log contents: %s", err) + } + + fileinfo.notUpload = true + fileinfo.tmpfile = dst + fileinfo.inputSize = 0 + + startNonSecureLog := time.Now() + doMoveCompressFile(ps, fileinfo) + nonSecureLogTotalTime += time.Since(startNonSecureLog) + } + + // Calculate averages + secureAvg := int(secureLogTotalTime.Microseconds()) / run + nonSecureAvg := int(nonSecureLogTotalTime.Microseconds()) / run + performanceCost := secureAvg - nonSecureAvg + performanceCostPercentage := (float64(performanceCost) / float64(nonSecureAvg)) * 100 + + file, err := os.OpenFile("fssaggsig_timing_results.csv", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) + if err != nil { + t.Fatalf("Error creating CSV file %v", err) + } + defer file.Close() + writer := csv.NewWriter(file) + + stat, _ := file.Stat() + if stat.Size() == 0 { + _ = writer.Write([]string{"Test Run", "Average Secure Time (us)", "Average Non-Secure Time (us)", "Performance Cost (us)", "Performance Overhead (%)"}) + } + + _ = writer.Write([]string{ + fmt.Sprintf("%d", run), + fmt.Sprintf("%d", secureAvg), + fmt.Sprintf("%d", nonSecureAvg), + fmt.Sprintf("%d", performanceCost), + fmt.Sprintf("%.2f", performanceCostPercentage), + }) + + writer.Flush() + } +} + +func TestSecureLogVerificationPerformance(t *testing.T) { + if os.Getenv("RUN_SEC_LOG_PERF_TEST") == "" { + t.Skip("Skipping performance test") + } + + logger := logrus.StandardLogger() + log := base.NewSourceLogObject(logger, "seclog_test", os.Getpid()) + ps := pubsub.New(&pubsub.EmptyDriver{}, logger, log) + + // setup the test environment + makeTestDirs() + defer removeTestDirs() + + secLog.keyIter = 0 + secLog.key = sk0Test + + var fileinfo fileChanInfo + var secureLogTotalTime, nonSecureLogTotalTime time.Duration + for _, run := range runs { + for i := 0; i < run; i++ { + makeTestDirs() + + scr := logFile + dst := path.Join(collectDir, "dev.log.sample") + copyFile(scr, dst) + + // grow the log contents for better performance testing + err := growLogContents(dst, growth) + if err != nil { + t.Fatalf("Failed to grow log contents: %s", err) + } + + fileinfo.notUpload = true + fileinfo.tmpfile = dst + fileinfo.inputSize = 0 + doMoveCompressFileSecure(ps, fileinfo) + + startSecureLog := time.Now() + processVerifyLogs(t) + secureLogTotalTime += time.Since(startSecureLog) + + removeTestDirs() + makeTestDirs() + + // non-secure log verification + scr = logFile + dst = path.Join(collectDir, "dev.log.sample") + copyFile(scr, dst) + + // grow the log contents for better performance testing + err = growLogContents(dst, growth) + if err != nil { + t.Fatalf("Failed to grow log contents: %s", err) + } + + fileinfo.notUpload = true + fileinfo.tmpfile = dst + fileinfo.inputSize = 0 + + doMoveCompressFile(ps, fileinfo) + startNonSecureLog := time.Now() + processLogs(t) + nonSecureLogTotalTime += time.Since(startNonSecureLog) + + removeTestDirs() + } + + // Calculate averages + secureAvg := int(secureLogTotalTime.Microseconds()) / run + nonSecureAvg := int(nonSecureLogTotalTime.Microseconds()) / run + performanceCost := secureAvg - nonSecureAvg + performanceCostPercentage := (float64(performanceCost) / float64(nonSecureAvg)) * 100 + + file, err := os.OpenFile("fssaggver_timing_results.csv", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) + if err != nil { + t.Fatalf("Error creating CSV file %v", err) + } + defer file.Close() + writer := csv.NewWriter(file) + + stat, _ := file.Stat() + if stat.Size() == 0 { + _ = writer.Write([]string{"Test Run", "Average Secure Time (us)", "Average Non-Secure Time (us)", "Performance Cost (us)", "Performance Overhead (%)"}) + } + + _ = writer.Write([]string{ + fmt.Sprintf("%d", run), + fmt.Sprintf("%d", secureAvg), + fmt.Sprintf("%d", nonSecureAvg), + fmt.Sprintf("%d", performanceCost), + fmt.Sprintf("%.2f", performanceCostPercentage), + }) + + writer.Flush() + } +} + +func TestSecureLogCachedKeysVerificationPerformance(t *testing.T) { + if os.Getenv("RUN_SEC_LOG_PERF_TEST") == "" { + t.Skip("Skipping performance test") + } + + logger := logrus.StandardLogger() + log := base.NewSourceLogObject(logger, "seclog_test", os.Getpid()) + ps := pubsub.New(&pubsub.EmptyDriver{}, logger, log) + + // cache the keys first, this is not secure, just for testing, + // in real world, the cached keys should be securely stored just like + // the initial key. + cacheKeys() + defer removeCachedKeys() + + // setup the test environment + makeTestDirs() + defer removeTestDirs() + + secLog.keyIter = 0 + secLog.key = sk0Test + + var fileinfo fileChanInfo + var secureLogTotalTime, nonSecureLogTotalTime time.Duration + for _, run := range runs { + for i := 0; i < run; i++ { + makeTestDirs() + + scr := logFile + dst := path.Join(collectDir, "dev.log.sample") + copyFile(scr, dst) + + // grow the log contents for better performance testing + err := growLogContents(dst, growth) + if err != nil { + t.Fatalf("Failed to grow log contents: %s", err) + } + + fileinfo.notUpload = true + fileinfo.tmpfile = dst + fileinfo.inputSize = 0 + doMoveCompressFileSecure(ps, fileinfo) + + startSecureLog := time.Now() + processVerifyLogsWithCachedKeys(t) + secureLogTotalTime += time.Since(startSecureLog) + + removeTestDirs() + makeTestDirs() + + // non-secure log verification + scr = logFile + dst = path.Join(collectDir, "dev.log.sample") + copyFile(scr, dst) + + // grow the log contents for better performance testing + err = growLogContents(dst, growth) + if err != nil { + t.Fatalf("Failed to grow log contents: %s", err) + } + + fileinfo.notUpload = true + fileinfo.tmpfile = dst + fileinfo.inputSize = 0 + + doMoveCompressFile(ps, fileinfo) + startNonSecureLog := time.Now() + processLogs(t) + nonSecureLogTotalTime += time.Since(startNonSecureLog) + + removeTestDirs() + } + + // Calculate averages + secureAvg := int(secureLogTotalTime.Microseconds()) / run + nonSecureAvg := int(nonSecureLogTotalTime.Microseconds()) / run + performanceCost := secureAvg - nonSecureAvg + performanceCostPercentage := (float64(performanceCost) / float64(nonSecureAvg)) * 100 + + fileName := fmt.Sprintf("fssaggver_cached_keys_%d_timing_results.csv", keyCacheBase) + file, err := os.OpenFile(fileName, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) + if err != nil { + t.Fatalf("Error creating CSV file %v", err) + } + defer file.Close() + writer := csv.NewWriter(file) + + stat, _ := file.Stat() + if stat.Size() == 0 { + _ = writer.Write([]string{"Test Run", "Average Secure Time (us)", "Average Non-Secure Time (us)", "Performance Cost (us)", "Performance Overhead (%)"}) + } + + _ = writer.Write([]string{ + fmt.Sprintf("%d", run), + fmt.Sprintf("%d", secureAvg), + fmt.Sprintf("%d", nonSecureAvg), + fmt.Sprintf("%d", performanceCost), + fmt.Sprintf("%.2f", performanceCostPercentage), + }) + + writer.Flush() + } +} diff --git a/pkg/newlog/cmd/seclog_test.go b/pkg/newlog/cmd/seclog_test.go new file mode 100644 index 0000000000..58907f5e38 --- /dev/null +++ b/pkg/newlog/cmd/seclog_test.go @@ -0,0 +1,453 @@ +// Copyright (c) 2024 Zededa, Inc. +// SPDX-License-Identifier: Apache-2.0 + +package main + +import ( + "bufio" + "compress/gzip" + "encoding/base64" + "encoding/json" + "fmt" + "math/rand" + "os" + "path" + "testing" + + "github.com/lf-edge/eve/pkg/pillar/base" + "github.com/lf-edge/eve/pkg/pillar/pubsub" + "github.com/sirupsen/logrus" +) + +var ( + // initial key, keep it secret, keep it safe + sk0Test = []byte{ + 0x12, 0x34, 0x56, 0x78, + 0x9A, 0xBC, 0xDE, 0xF0, + 0x11, 0x22, 0x33, 0x44, + 0x55, 0x66, 0x77, 0x88, + } +) + +const ( + // TODO : fix this paths + testDirPrefix = "/tmp/seclog" + logFile = "/home/shah/shah-dev/eve/pkg/newlog/testdata/dev.log.sample" +) + +func makeTestDirs() { + uploadDevDir = path.Join(testDirPrefix, "devupload") + uploadAppDir = path.Join(testDirPrefix, "appupload") + collectDir = path.Join(testDirPrefix, "collect") + + _ = os.MkdirAll(uploadDevDir, 0777) + _ = os.MkdirAll(uploadAppDir, 0777) + _ = os.MkdirAll(collectDir, 0777) +} + +func removeTestDirs() { + os.RemoveAll(testDirPrefix) +} + +func listFilesInDir(dir string) []string { + files, _ := os.ReadDir(dir) + var filenames []string + for _, f := range files { + filenames = append(filenames, path.Join(dir, f.Name())) + } + return filenames +} + +func getLogVerficiationMetadata(gwComment string) ([]byte, uint64, error) { + var jsonMap map[string]interface{} + err := json.Unmarshal([]byte(gwComment), &jsonMap) + if err != nil { + return nil, 0, fmt.Errorf("Failed to unmarshal metadata: %s", err) + } + + macStr, ok := jsonMap["aggSig"].(string) + if !ok { + return nil, 0, fmt.Errorf("Failed to find signature in metadata") + } + + mac, err := base64.StdEncoding.DecodeString(macStr) + if err != nil { + return nil, 0, fmt.Errorf("Failed to decode signature: %s", err) + } + + iter, ok := jsonMap["keyIter"].(float64) + if !ok { + return nil, 0, fmt.Errorf("Failed to find keyIteration in metadata") + } + + return mac, uint64(iter), nil +} + +func copyFile(src string, dst string) { + data, _ := os.ReadFile(src) + _ = os.WriteFile(dst, data, 0777) +} + +func TestSingleSecureLogVerification(t *testing.T) { + logger := logrus.StandardLogger() + log := base.NewSourceLogObject(logger, "seclog_test", os.Getpid()) + ps := pubsub.New(&pubsub.EmptyDriver{}, logger, log) + + // setup the test environment + makeTestDirs() + defer removeTestDirs() + + scr := logFile + dst := path.Join(collectDir, "dev.log.sample") + copyFile(scr, dst) + + var fileinfo fileChanInfo + fileinfo.notUpload = true + fileinfo.tmpfile = dst + fileinfo.inputSize = 0 + + // evolve the key, for good measure. + intialKey := evolveKey(sk0Test, 100) + secLog.keyIter = 100 + secLog.key = intialKey + + // process the log entries and create the gzipped log file + doMoveCompressFileSecure(ps, fileinfo) + + // get the log gzipped file path + logGzipped := listFilesInDir(uploadDevDir)[0] + rf, err := os.Open(logGzipped) + if err != nil { + t.Fatalf("Failed to open %s: %s", logGzipped, err) + } + defer rf.Close() + + gr, err := gzip.NewReader(rf) + if err != nil { + t.Fatalf("Failed to create gzip reader: %s", err) + } + defer gr.Close() + + // read the batch metadata from gzipped metadata. + aggSig, keyIter, err := getLogVerficiationMetadata(gr.Comment) + if err != nil { + t.Fatalf("Failed to read secure log metadata from %s: %s", logGzipped, err) + } + + logs := make([][]byte, 0) + scanner := bufio.NewScanner(gr) + for scanner.Scan() { + if !json.Valid(scanner.Bytes()) { + t.Fatalf("Invalid JSON: %s", scanner.Text()) + } + logs = append(logs, append([]byte(nil), scanner.Bytes()...)) + } + + // evolve the key to the same iteration as the one used to sign the log. + verifKey := evolveKey(sk0Test, keyIter) + // verify the log + res := fssAggVer(verifKey, aggSig, logs) + if !res { + t.Fatalf("Secure log verification failed") + } +} + +func TestMultipleSecureLogVerification(t *testing.T) { + logger := logrus.StandardLogger() + log := base.NewSourceLogObject(logger, "seclog_test", os.Getpid()) + ps := pubsub.New(&pubsub.EmptyDriver{}, logger, log) + + // setup the test environment + makeTestDirs() + defer removeTestDirs() + + scr := logFile + dst := path.Join(collectDir, "dev.log.sample") + copyFile(scr, dst) + + var fileinfo fileChanInfo + fileinfo.notUpload = true + fileinfo.tmpfile = dst + fileinfo.inputSize = 0 + + // evolve the key, for good measure. + intialKey := evolveKey(sk0Test, 100) + secLog.keyIter = 100 + secLog.key = intialKey + + // lower the maxGzipFileSize to multiple batches + maxGzipFileSize = 1000 + + // process the log entries and create the gzipped log file + doMoveCompressFileSecure(ps, fileinfo) + + // get the log gzipped file path + allLogs := listFilesInDir(uploadDevDir) + for _, logGzipped := range allLogs { + rf, err := os.Open(logGzipped) + if err != nil { + t.Fatalf("Failed to open %s: %s", logGzipped, err) + } + defer rf.Close() + + gr, err := gzip.NewReader(rf) + if err != nil { + t.Fatalf("Failed to create gzip reader: %s", err) + } + defer gr.Close() + + // read the batch metadata from gzipped metadata. + aggSig, keyIter, err := getLogVerficiationMetadata(gr.Comment) + if err != nil { + t.Fatalf("Failed to read secure log metadata from %s: %s", logGzipped, err) + } + + logs := make([][]byte, 0) + scanner := bufio.NewScanner(gr) + for scanner.Scan() { + if !json.Valid(scanner.Bytes()) { + t.Fatalf("Invalid JSON: %s", scanner.Text()) + } + logs = append(logs, append([]byte(nil), scanner.Bytes()...)) + } + + t.Logf("Verifying log with key iteration : %d", keyIter) + t.Logf("Number of log entries: %d", len(logs)) + t.Logf("Batch aggregated signature: %x", aggSig) + t.Log("----------------------------------------") + + // evolve the key to the same iteration as the one used to sign the log. + verifKey := evolveKey(sk0Test, keyIter) + // verify the log + res := fssAggVer(verifKey, aggSig, logs) + if !res { + t.Fatalf("Secure log verification failed for %s", logGzipped) + } + } +} + +func TestContentIntegritySecureLogVerification(t *testing.T) { + logger := logrus.StandardLogger() + log := base.NewSourceLogObject(logger, "seclog_test", os.Getpid()) + ps := pubsub.New(&pubsub.EmptyDriver{}, logger, log) + + // setup the test environment + makeTestDirs() + defer removeTestDirs() + + scr := logFile + dst := path.Join(collectDir, "dev.log.sample") + copyFile(scr, dst) + + var fileinfo fileChanInfo + fileinfo.notUpload = true + fileinfo.tmpfile = dst + fileinfo.inputSize = 0 + + // evolve the key, for good measure. + intialKey := evolveKey(sk0Test, 100) + secLog.keyIter = 100 + secLog.key = intialKey + + // process the log entries and create the gzipped log file + doMoveCompressFileSecure(ps, fileinfo) + + // get the log gzipped file path + logGzipped := listFilesInDir(uploadDevDir)[0] + rf, err := os.Open(logGzipped) + if err != nil { + t.Fatalf("Failed to open %s: %s", logGzipped, err) + } + defer rf.Close() + + gr, err := gzip.NewReader(rf) + if err != nil { + t.Fatalf("Failed to create gzip reader: %s", err) + } + defer gr.Close() + + // read the batch metadata from gzipped metadata. + aggSig, keyIter, err := getLogVerficiationMetadata(gr.Comment) + if err != nil { + t.Fatalf("Failed to read secure log metadata from %s: %s", logGzipped, err) + } + + logs := make([][]byte, 0) + scanner := bufio.NewScanner(gr) + for scanner.Scan() { + if !json.Valid(scanner.Bytes()) { + t.Fatalf("Invalid JSON: %s", scanner.Text()) + } + logs = append(logs, append([]byte(nil), scanner.Bytes()...)) + } + + if len(logs) < 3 { + t.Fatalf("Not enough log entries to content integrity") + } + + // get a ranom log entry and corrupt it + corruptLogIdx := rand.Intn(len(logs)) + logs[corruptLogIdx] = []byte("corrupted log entry") + + // evolve the key to the same iteration as the one used to sign the log. + verifKey := evolveKey(sk0Test, keyIter) + // verify the log + res := fssAggVer(verifKey, aggSig, logs) + if res != false { + t.Fatalf("Expected secure log verification to failed") + } +} + +func TestStreamIntegritySecureLogVerification(t *testing.T) { + logger := logrus.StandardLogger() + log := base.NewSourceLogObject(logger, "seclog_test", os.Getpid()) + ps := pubsub.New(&pubsub.EmptyDriver{}, logger, log) + + // setup the test environment + makeTestDirs() + defer removeTestDirs() + + scr := logFile + dst := path.Join(collectDir, "dev.log.sample") + copyFile(scr, dst) + + var fileinfo fileChanInfo + fileinfo.notUpload = true + fileinfo.tmpfile = dst + fileinfo.inputSize = 0 + + // evolve the key, for good measure. + intialKey := evolveKey(sk0Test, 100) + secLog.keyIter = 100 + secLog.key = intialKey + + // process the log entries and create the gzipped log file + doMoveCompressFileSecure(ps, fileinfo) + + // get the log gzipped file path + logGzipped := listFilesInDir(uploadDevDir)[0] + rf, err := os.Open(logGzipped) + if err != nil { + t.Fatalf("Failed to open %s: %s", logGzipped, err) + } + defer rf.Close() + + gr, err := gzip.NewReader(rf) + if err != nil { + t.Fatalf("Failed to create gzip reader: %s", err) + } + defer gr.Close() + + // read the batch metadata from gzipped metadata. + aggSig, keyIter, err := getLogVerficiationMetadata(gr.Comment) + if err != nil { + t.Fatalf("Failed to read secure log metadata from %s: %s", logGzipped, err) + } + + logs := make([][]byte, 0) + scanner := bufio.NewScanner(gr) + for scanner.Scan() { + if !json.Valid(scanner.Bytes()) { + t.Fatalf("Invalid JSON: %s", scanner.Text()) + } + logs = append(logs, append([]byte(nil), scanner.Bytes()...)) + } + + if len(logs) < 3 { + t.Fatalf("Not enough log entries to stream integrity") + } + + // get a ranom log entry and delete it + corruptLogIdx := rand.Intn(len(logs)) + logs = append(logs[:corruptLogIdx], logs[corruptLogIdx+1:]...) + + // evolve the key to the same iteration as the one used to sign the log. + verifKey := evolveKey(sk0Test, keyIter) + // verify the log + res := fssAggVer(verifKey, aggSig, logs) + if res != false { + t.Fatalf("Expected secure log verification to failed") + } +} + +func TestTruncationSecureLogVerification(t *testing.T) { + logger := logrus.StandardLogger() + log := base.NewSourceLogObject(logger, "seclog_test", os.Getpid()) + ps := pubsub.New(&pubsub.EmptyDriver{}, logger, log) + + // setup the test environment + makeTestDirs() + defer removeTestDirs() + + scr := logFile + dst := path.Join(collectDir, "dev.log.sample") + copyFile(scr, dst) + + var fileinfo fileChanInfo + fileinfo.notUpload = true + fileinfo.tmpfile = dst + fileinfo.inputSize = 0 + + // evolve the key, for good measure. + intialKey := evolveKey(sk0Test, 100) + secLog.keyIter = 100 + secLog.key = intialKey + + // process the log entries and create the gzipped log file + doMoveCompressFileSecure(ps, fileinfo) + + // get the log gzipped file path + logGzipped := listFilesInDir(uploadDevDir)[0] + rf, err := os.Open(logGzipped) + if err != nil { + t.Fatalf("Failed to open %s: %s", logGzipped, err) + } + defer rf.Close() + + gr, err := gzip.NewReader(rf) + if err != nil { + t.Fatalf("Failed to create gzip reader: %s", err) + } + defer gr.Close() + + // read the batch metadata from gzipped metadata. + aggSig, keyIter, err := getLogVerficiationMetadata(gr.Comment) + if err != nil { + t.Fatalf("Failed to read secure log metadata from %s: %s", logGzipped, err) + } + + logs := make([][]byte, 0) + scanner := bufio.NewScanner(gr) + for scanner.Scan() { + if !json.Valid(scanner.Bytes()) { + t.Fatalf("Invalid JSON: %s", scanner.Text()) + } + logs = append(logs, append([]byte(nil), scanner.Bytes()...)) + } + + if len(logs) < 3 { + t.Fatalf("Not enough log entries to test truncation") + } + + // delete a few log entries form the tail + logsTail := logs[:len(logs)-2] + + // evolve the key to the same iteration as the one used to sign the log. + verifKey := evolveKey(sk0Test, keyIter) + // verify the log + res := fssAggVer(verifKey, aggSig, logsTail) + if res != false { + t.Fatalf("Expected secure log verification to failed (tail truncation)") + } + + // delete a few log entries form the head + logsHead := logs[2:] + + // evolve the key to the same iteration as the one used to sign the log. + verifKey = evolveKey(sk0Test, keyIter) + // verify the log + res = fssAggVer(verifKey, aggSig, logsHead) + if res != false { + t.Fatalf("Expected secure log verification to failed (head truncation)") + } +} diff --git a/pkg/newlog/testdata/dev.log.sample b/pkg/newlog/testdata/dev.log.sample new file mode 100644 index 0000000000..d2373588bf --- /dev/null +++ b/pkg/newlog/testdata/dev.log.sample @@ -0,0 +1,46 @@ +{"devID":"8dbec8c5-91c0-4f4b-85dc-ec67bee778c7","image":"IMGA","eveVersion":"6.8.2-kvm-amd64"} +{"severity":"warning","source":"zedbox","iid":"2003","content":"{\"file\":\"/pillar/agentlog/agentlog.go:181\",\"func\":\"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals\",\"level\":\"warning\",\"log_event_type\":\"log\",\"msg\":\"goroutine 2360 [select, 17 minutes]:\\ngithub.com/lf-edge/eve/pkg/pillar/pubsub/socketdriver.(*Publisher).serveConnection(0xc00034c600, 0x1d69ff8, 0xc00000eb98, 0x12)\\n\\t/pillar/pubsub/socketdriver/publish.go:267 +0xaed\\ncreated by github.com/lf-edge/eve/pkg/pillar/pubsub/socketdriver.(*Publisher).Start.func1\\n\\t/pillar/pubsub/socketdriver/publish.go:148 +0x274\",\"obj_key\":\"sigusr1_stacks\",\"obj_type\":\"sigusr1_stacks\",\"pid\":2003,\"source\":\"zedbox\",\"time\":\"2024-02-14T11:48:49.952576111Z\"}\n","msgid":3783,"timestamp":{"seconds":1707911329,"nanos":952576111},"filename":"/pillar/agentlog/agentlog.go:181","function":"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals"} +{"severity":"warning","source":"zedbox","iid":"2003","content":"{\"file\":\"/pillar/agentlog/agentlog.go:181\",\"func\":\"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals\",\"level\":\"warning\",\"log_event_type\":\"log\",\"msg\":\"goroutine 2341 [select]:\\ngithub.com/lf-edge/eve/pkg/pillar/cmd/vaultmgr.Run(0xc0011e11d0, 0xc000e008c0, 0xc00195afc0, 0xc000010720)\\n\\t/pillar/cmd/vaultmgr/vaultmgr.go:858 +0xb6f\\nmain.startAgentAndDone(0x1acbaa0, 0xc000945c01, 0xc000699ef0, 0x8, 0xc0011e11d0, 0xc000e008c0, 0xc00195afc0)\\n\\t/pillar/zedbox/zedbox.go:241 +0x62\\ncreated by main.handleService\\n\\t/pillar/zedbox/zedbox.go:231 +0x3fb\",\"obj_key\":\"sigusr1_stacks\",\"obj_type\":\"sigusr1_stacks\",\"pid\":2003,\"source\":\"zedbox\",\"time\":\"2024-02-14T11:48:49.952591506Z\"}\n","msgid":3784,"timestamp":{"seconds":1707911329,"nanos":952591506},"filename":"/pillar/agentlog/agentlog.go:181","function":"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals"} +{"severity":"warning","source":"zedbox","iid":"2003","content":"{\"file\":\"/pillar/agentlog/agentlog.go:181\",\"func\":\"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals\",\"level\":\"warning\",\"log_event_type\":\"log\",\"msg\":\"goroutine 2332 [select, 126 minutes]:\\ngithub.com/lf-edge/eve/pkg/pillar/pubsub/socketdriver.(*Publisher).serveConnection(0xc000a81500, 0x1d69ff8, 0xc00000fe98, 0x0)\\n\\t/pillar/pubsub/socketdriver/publish.go:267 +0xaed\\ncreated by github.com/lf-edge/eve/pkg/pillar/pubsub/socketdriver.(*Publisher).Start.func1\\n\\t/pillar/pubsub/socketdriver/publish.go:148 +0x274\",\"obj_key\":\"sigusr1_stacks\",\"obj_type\":\"sigusr1_stacks\",\"pid\":2003,\"source\":\"zedbox\",\"time\":\"2024-02-14T11:48:49.952607158Z\"}\n","msgid":3785,"timestamp":{"seconds":1707911329,"nanos":952607158},"filename":"/pillar/agentlog/agentlog.go:181","function":"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals"} +{"severity":"warning","source":"zedbox","iid":"2003","content":"{\"file\":\"/pillar/agentlog/agentlog.go:181\",\"func\":\"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals\",\"level\":\"warning\",\"log_event_type\":\"log\",\"msg\":\"goroutine 2011 [select]:\\ngithub.com/lf-edge/eve/pkg/pillar/cmd/zfsmanager.Run(0xc00142e570, 0xc000fe61c0, 0xc0015c1470, 0xc0010baf80)\\n\\t/pillar/cmd/zfsmanager/zfsmanager.go:97 +0x605\\nmain.startAgentAndDone(0x1acc070, 0xc000945c00, 0xc000520f50, 0xa, 0xc00142e570, 0xc000fe61c0, 0xc0015c1470)\\n\\t/pillar/zedbox/zedbox.go:241 +0x62\\ncreated by main.handleService\\n\\t/pillar/zedbox/zedbox.go:231 +0x3fb\",\"obj_key\":\"sigusr1_stacks\",\"obj_type\":\"sigusr1_stacks\",\"pid\":2003,\"source\":\"zedbox\",\"time\":\"2024-02-14T11:48:49.952622327Z\"}\n","msgid":3786,"timestamp":{"seconds":1707911329,"nanos":952622327},"filename":"/pillar/agentlog/agentlog.go:181","function":"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals"} +{"severity":"warning","source":"zedbox","iid":"2003","content":"{\"file\":\"/pillar/agentlog/agentlog.go:181\",\"func\":\"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals\",\"level\":\"warning\",\"log_event_type\":\"log\",\"msg\":\"goroutine 2697 [IO wait, 126 minutes]:\\ninternal/poll.runtime_pollWait(0x7f79ba8f7dc0, 0x72, 0x0)\\n\\t/usr/lib/go/src/runtime/netpoll.go:222 +0x55\\ninternal/poll.(*pollDesc).wait(0xc000e8d418, 0x72, 0x0, 0x0, 0x1a1d5d2)\\n\\t/usr/lib/go/src/internal/poll/fd_poll_runtime.go:87 +0x45\\ninternal/poll.(*pollDesc).waitRead(...)\\n\\t/usr/lib/go/src/internal/poll/fd_poll_runtime.go:92\\ninternal/poll.(*FD).Accept(0xc000e8d400, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)\\n\\t/usr/lib/go/src/internal/poll/fd_unix.go:401 +0x212\\nnet.(*netFD).accept(0xc000e8d400, 0x0, 0xc00134bf00, 0x5d0000)\\n\\t/usr/lib/go/src/net/fd_unix.go:172 +0x45\\nnet.(*UnixListener).accept(0xc0017fefc0, 0xc001529380, 0xc00134bf00, 0x20)\\n\\t/usr/lib/go/src/net/unixsock_posix.go:162 +0x32\\nnet.(*UnixListener).Accept(0xc0017fefc0, 0xc001529380, 0xc00034db00, 0x1d69ff8, 0xc001936008)\\n\\t/usr/lib/go/src/net/unixsock.go:260 +0x65\\ngithub.com/lf-edge/eve/pkg/pillar/pubsub/socketdriver.(*Publisher).Start.func1(0xc00034dbc0)\\n\\t/pillar/pubsub/socketdriver/publish.go:140 +0x95\\ncreated by github.com/lf-edge/eve/pkg/pillar/pubsub/socketdriver.(*Publisher).Start\\n\\t/pillar/pubsub/socketdriver/publish.go:130 +0xf0\",\"obj_key\":\"sigusr1_stacks\",\"obj_type\":\"sigusr1_stacks\",\"pid\":2003,\"source\":\"zedbox\",\"time\":\"2024-02-14T11:48:49.952638765Z\"}\n","msgid":3787,"timestamp":{"seconds":1707911329,"nanos":952638765},"filename":"/pillar/agentlog/agentlog.go:181","function":"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals"} +{"severity":"warning","source":"zedbox","iid":"2003","content":"{\"file\":\"/pillar/agentlog/agentlog.go:181\",\"func\":\"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals\",\"level\":\"warning\",\"log_event_type\":\"log\",\"msg\":\"goroutine 2164 [select, 120 minutes]:\\ngithub.com/lf-edge/eve/pkg/pillar/pubsub/socketdriver.(*Publisher).serveConnection(0xc000a81380, 0x1d69ff8, 0xc000011890, 0x0)\\n\\t/pillar/pubsub/socketdriver/publish.go:267 +0xaed\\ncreated by github.com/lf-edge/eve/pkg/pillar/pubsub/socketdriver.(*Publisher).Start.func1\\n\\t/pillar/pubsub/socketdriver/publish.go:148 +0x274\",\"obj_key\":\"sigusr1_stacks\",\"obj_type\":\"sigusr1_stacks\",\"pid\":2003,\"source\":\"zedbox\",\"time\":\"2024-02-14T11:48:49.952655478Z\"}\n","msgid":3788,"timestamp":{"seconds":1707911329,"nanos":952655478},"filename":"/pillar/agentlog/agentlog.go:181","function":"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals"} +{"severity":"warning","source":"zedbox","iid":"2003","content":"{\"file\":\"/pillar/agentlog/agentlog.go:181\",\"func\":\"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals\",\"level\":\"warning\",\"log_event_type\":\"log\",\"msg\":\"goroutine 2165 [select, 1 minutes]:\\ngithub.com/lf-edge/eve/pkg/pillar/pubsub/socketdriver.(*Publisher).serveConnection(0xc000a81440, 0x1d69ff8, 0xc0000118a8, 0x1)\\n\\t/pillar/pubsub/socketdriver/publish.go:267 +0xaed\\ncreated by github.com/lf-edge/eve/pkg/pillar/pubsub/socketdriver.(*Publisher).Start.func1\\n\\t/pillar/pubsub/socketdriver/publish.go:148 +0x274\",\"obj_key\":\"sigusr1_stacks\",\"obj_type\":\"sigusr1_stacks\",\"pid\":2003,\"source\":\"zedbox\",\"time\":\"2024-02-14T11:48:49.952712681Z\"}\n","msgid":3789,"timestamp":{"seconds":1707911329,"nanos":952712681},"filename":"/pillar/agentlog/agentlog.go:181","function":"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals"} +{"severity":"warning","source":"zedbox","iid":"2003","content":"{\"file\":\"/pillar/agentlog/agentlog.go:181\",\"func\":\"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals\",\"level\":\"warning\",\"log_event_type\":\"log\",\"msg\":\"goroutine 2166 [select, 126 minutes]:\\ngithub.com/lf-edge/eve/pkg/pillar/pubsub/socketdriver.(*Publisher).serveConnection(0xc000a80e40, 0x1d69ff8, 0xc0000118c8, 0x0)\\n\\t/pillar/pubsub/socketdriver/publish.go:267 +0xaed\\ncreated by github.com/lf-edge/eve/pkg/pillar/pubsub/socketdriver.(*Publisher).Start.func1\\n\\t/pillar/pubsub/socketdriver/publish.go:148 +0x274\",\"obj_key\":\"sigusr1_stacks\",\"obj_type\":\"sigusr1_stacks\",\"pid\":2003,\"source\":\"zedbox\",\"time\":\"2024-02-14T11:48:49.95272817Z\"}\n","msgid":3790,"timestamp":{"seconds":1707911329,"nanos":952728170},"filename":"/pillar/agentlog/agentlog.go:181","function":"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals"} +{"severity":"warning","source":"zedbox","iid":"2003","content":"{\"file\":\"/pillar/agentlog/agentlog.go:181\",\"func\":\"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals\",\"level\":\"warning\",\"log_event_type\":\"log\",\"msg\":\"goroutine 2167 [select, 126 minutes]:\\ngithub.com/lf-edge/eve/pkg/pillar/pubsub/socketdriver.(*Publisher).serveConnection(0xc000a80fc0, 0x1d69ff8, 0xc0000118f0, 0x0)\\n\\t/pillar/pubsub/socketdriver/publish.go:267 +0xaed\\ncreated by github.com/lf-edge/eve/pkg/pillar/pubsub/socketdriver.(*Publisher).Start.func1\\n\\t/pillar/pubsub/socketdriver/publish.go:148 +0x274\",\"obj_key\":\"sigusr1_stacks\",\"obj_type\":\"sigusr1_stacks\",\"pid\":2003,\"source\":\"zedbox\",\"time\":\"2024-02-14T11:48:49.952743286Z\"}\n","msgid":3791,"timestamp":{"seconds":1707911329,"nanos":952743286},"filename":"/pillar/agentlog/agentlog.go:181","function":"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals"} +{"severity":"warning","source":"zedbox","iid":"2003","content":"{\"file\":\"/pillar/agentlog/agentlog.go:181\",\"func\":\"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals\",\"level\":\"warning\",\"log_event_type\":\"log\",\"msg\":\"goroutine 2342 [IO wait, 17 minutes]:\\ninternal/poll.runtime_pollWait(0x7f79ba8f87b8, 0x72, 0x0)\\n\\t/usr/lib/go/src/runtime/netpoll.go:222 +0x55\\ninternal/poll.(*pollDesc).wait(0xc001235118, 0x72, 0x0, 0x0, 0x0)\\n\\t/usr/lib/go/src/internal/poll/fd_poll_runtime.go:87 +0x45\\ninternal/poll.(*pollDesc).waitRead(...)\\n\\t/usr/lib/go/src/internal/poll/fd_poll_runtime.go:92\\ninternal/poll.(*FD).RawRead(0xc001235100, 0xc000e22f80, 0x0, 0x0)\\n\\t/usr/lib/go/src/internal/poll/fd_unix.go:553 +0xff\\nnet.(*rawConn).Read(0xc001ad42d8, 0xc000e22f80, 0xc001ad42d8, 0x0)\\n\\t/usr/lib/go/src/net/rawconn.go:43 +0x68\\ngithub.com/lf-edge/eve/pkg/pillar/pubsub.ConnReadCheck(0x1d69ff8, 0xc00000ea48, 0x0, 0x0)\\n\\t/pillar/pubsub/util.go:82 +0x168\\ngithub.com/lf-edge/eve/pkg/pillar/pubsub/socketdriver.(*Subscriber).connectAndRead(0xc0014bc240, 0xc001239f98, 0x6, 0xc0006983f0, 0x6, 0xc00108e000, 0x17b4, 0x17b5)\\n\\t/pillar/pubsub/socketdriver/subscribe.go:251 +0x38e\\ngithub.com/lf-edge/eve/pkg/pillar/pubsub/socketdriver.(*Subscriber).watchSock(0xc0014bc240)\\n\\t/pillar/pubsub/socketdriver/subscribe.go:173 +0x45\\ncreated by github.com/lf-edge/eve/pkg/pillar/pubsub/socketdriver.(*Subscriber).Start\\n\\t/pillar/pubsub/socketdriver/subscribe.go:132 +0x470\",\"obj_key\":\"sigusr1_stacks\",\"obj_type\":\"sigusr1_stacks\",\"pid\":2003,\"source\":\"zedbox\",\"time\":\"2024-02-14T11:48:49.952776851Z\"}\n","msgid":3792,"timestamp":{"seconds":1707911329,"nanos":952776851},"filename":"/pillar/agentlog/agentlog.go:181","function":"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals"} +{"severity":"warning","source":"zedbox","iid":"2003","content":"{\"file\":\"/pillar/agentlog/agentlog.go:181\",\"func\":\"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals\",\"level\":\"warning\",\"log_event_type\":\"log\",\"msg\":\"goroutine 2343 [IO wait, 126 minutes]:\\ninternal/poll.runtime_pollWait(0x7f79ba8f88a0, 0x72, 0x0)\\n\\t/usr/lib/go/src/runtime/netpoll.go:222 +0x55\\ninternal/poll.(*pollDesc).wait(0xc001234e98, 0x72, 0x0, 0x0, 0x0)\\n\\t/usr/lib/go/src/internal/poll/fd_poll_runtime.go:87 +0x45\\ninternal/poll.(*pollDesc).waitRead(...)\\n\\t/usr/lib/go/src/internal/poll/fd_poll_runtime.go:92\\ninternal/poll.(*FD).RawRead(0xc001234e80, 0xc0008bc5c0, 0x0, 0x0)\\n\\t/usr/lib/go/src/internal/poll/fd_unix.go:553 +0xff\\nnet.(*rawConn).Read(0xc00000ecd0, 0xc0008bc5c0, 0xc00000ecd0, 0x0)\\n\\t/usr/lib/go/src/net/rawconn.go:43 +0x68\\ngithub.com/lf-edge/eve/pkg/pillar/pubsub.ConnReadCheck(0x1d69ff8, 0xc00000ea30, 0x0, 0x0)\\n\\t/pillar/pubsub/util.go:82 +0x168\\ngithub.com/lf-edge/eve/pkg/pillar/pubsub/socketdriver.(*Subscriber).connectAndRead(0xc0014bdb90, 0xc001478f98, 0x8, 0x0, 0x0, 0x0, 0x0, 0x0)\\n\\t/pillar/pubsub/socketdriver/subscribe.go:251 +0x38e\\ngithub.com/lf-edge/eve/pkg/pillar/pubsub/socketdriver.(*Subscriber).watchSock(0xc0014bdb90)\\n\\t/pillar/pubsub/socketdriver/subscribe.go:173 +0x45\\ncreated by github.com/lf-edge/eve/pkg/pillar/pubsub/socketdriver.(*Subscriber).Start\\n\\t/pillar/pubsub/socketdriver/subscribe.go:132 +0x470\",\"obj_key\":\"sigusr1_stacks\",\"obj_type\":\"sigusr1_stacks\",\"pid\":2003,\"source\":\"zedbox\",\"time\":\"2024-02-14T11:48:49.952816114Z\"}\n","msgid":3793,"timestamp":{"seconds":1707911329,"nanos":952816114},"filename":"/pillar/agentlog/agentlog.go:181","function":"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals"} +{"severity":"warning","source":"zedbox","iid":"2003","content":"{\"file\":\"/pillar/agentlog/agentlog.go:181\",\"func\":\"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals\",\"level\":\"warning\",\"log_event_type\":\"log\",\"msg\":\"goroutine 2344 [IO wait, 126 minutes]:\\ninternal/poll.runtime_pollWait(0x7f79ba9c95b8, 0x72, 0x0)\\n\\t/usr/lib/go/src/runtime/netpoll.go:222 +0x55\\ninternal/poll.(*pollDesc).wait(0xc001318f98, 0x72, 0x0, 0x0, 0x1a1d5d2)\\n\\t/usr/lib/go/src/internal/poll/fd_poll_runtime.go:87 +0x45\\ninternal/poll.(*pollDesc).waitRead(...)\\n\\t/usr/lib/go/src/internal/poll/fd_poll_runtime.go:92\\ninternal/poll.(*FD).Accept(0xc001318f80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)\\n\\t/usr/lib/go/src/internal/poll/fd_unix.go:401 +0x212\\nnet.(*netFD).accept(0xc001318f80, 0x0, 0xc001238f00, 0x5d0000)\\n\\t/usr/lib/go/src/net/fd_unix.go:172 +0x45\\nnet.(*UnixListener).accept(0xc00131c4e0, 0xc00049ef60, 0xc001238f00, 0x20)\\n\\t/usr/lib/go/src/net/unixsock_posix.go:162 +0x32\\nnet.(*UnixListener).Accept(0xc00131c4e0, 0xc00049ef60, 0xc000ece900, 0x1d69ff8, 0xc0010bbdd0)\\n\\t/usr/lib/go/src/net/unixsock.go:260 +0x65\\ngithub.com/lf-edge/eve/pkg/pillar/pubsub/socketdriver.(*Publisher).Start.func1(0xc000ece900)\\n\\t/pillar/pubsub/socketdriver/publish.go:140 +0x95\\ncreated by github.com/lf-edge/eve/pkg/pillar/pubsub/socketdriver.(*Publisher).Start\\n\\t/pillar/pubsub/socketdriver/publish.go:130 +0xf0\",\"obj_key\":\"sigusr1_stacks\",\"obj_type\":\"sigusr1_stacks\",\"pid\":2003,\"source\":\"zedbox\",\"time\":\"2024-02-14T11:48:49.952832812Z\"}\n","msgid":3794,"timestamp":{"seconds":1707911329,"nanos":952832812},"filename":"/pillar/agentlog/agentlog.go:181","function":"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals"} +{"severity":"warning","source":"zedbox","iid":"2003","content":"{\"file\":\"/pillar/agentlog/agentlog.go:181\",\"func\":\"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals\",\"level\":\"warning\",\"log_event_type\":\"log\",\"msg\":\"goroutine 2345 [IO wait, 126 minutes]:\\ninternal/poll.runtime_pollWait(0x7f79ba9c94d0, 0x72, 0x0)\\n\\t/usr/lib/go/src/runtime/netpoll.go:222 +0x55\\ninternal/poll.(*pollDesc).wait(0xc001319118, 0x72, 0x0, 0x0, 0x1a1d5d2)\\n\\t/usr/lib/go/src/internal/poll/fd_poll_runtime.go:87 +0x45\\ninternal/poll.(*pollDesc).waitRead(...)\\n\\t/usr/lib/go/src/internal/poll/fd_poll_runtime.go:92\\ninternal/poll.(*FD).Accept(0xc001319100, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)\\n\\t/usr/lib/go/src/internal/poll/fd_unix.go:401 +0x212\\nnet.(*netFD).accept(0xc001319100, 0x0, 0xc001588f00, 0x5d0000)\\n\\t/usr/lib/go/src/net/fd_unix.go:172 +0x45\\nnet.(*UnixListener).accept(0xc00131ca50, 0xc00049f020, 0xc001588f00, 0x20)\\n\\t/usr/lib/go/src/net/unixsock_posix.go:162 +0x32\\nnet.(*UnixListener).Accept(0xc00131ca50, 0xc00049f020, 0xc000ece900, 0x1d69ff8, 0xc0010ba1d0)\\n\\t/usr/lib/go/src/net/unixsock.go:260 +0x65\\ngithub.com/lf-edge/eve/pkg/pillar/pubsub/socketdriver.(*Publisher).Start.func1(0xc000ece9c0)\\n\\t/pillar/pubsub/socketdriver/publish.go:140 +0x95\\ncreated by github.com/lf-edge/eve/pkg/pillar/pubsub/socketdriver.(*Publisher).Start\\n\\t/pillar/pubsub/socketdriver/publish.go:130 +0xf0\",\"obj_key\":\"sigusr1_stacks\",\"obj_type\":\"sigusr1_stacks\",\"pid\":2003,\"source\":\"zedbox\",\"time\":\"2024-02-14T11:48:49.952850619Z\"}\n","msgid":3795,"timestamp":{"seconds":1707911329,"nanos":952850619},"filename":"/pillar/agentlog/agentlog.go:181","function":"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals"} +{"severity":"warning","source":"zedbox","iid":"2003","content":"{\"file\":\"/pillar/agentlog/agentlog.go:181\",\"func\":\"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals\",\"level\":\"warning\",\"log_event_type\":\"log\",\"msg\":\"goroutine 2364 [IO wait, 126 minutes]:\\ninternal/poll.runtime_pollWait(0x7f79ba8f85e8, 0x72, 0x0)\\n\\t/usr/lib/go/src/runtime/netpoll.go:222 +0x55\\ninternal/poll.(*pollDesc).wait(0xc001235998, 0x72, 0x0, 0x0, 0x1a1d5d2)\\n\\t/usr/lib/go/src/internal/poll/fd_poll_runtime.go:87 +0x45\\ninternal/poll.(*pollDesc).waitRead(...)\\n\\t/usr/lib/go/src/internal/poll/fd_poll_runtime.go:92\\ninternal/poll.(*FD).Accept(0xc001235980, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)\\n\\t/usr/lib/go/src/internal/poll/fd_unix.go:401 +0x212\\nnet.(*netFD).accept(0xc001235980, 0x0, 0xc0007a4f00, 0x400000)\\n\\t/usr/lib/go/src/net/fd_unix.go:172 +0x45\\nnet.(*UnixListener).accept(0xc000d19020, 0xc00093d620, 0xc0007a4f00, 0x0)\\n\\t/usr/lib/go/src/net/unixsock_posix.go:162 +0x32\\nnet.(*UnixListener).Accept(0xc000d19020, 0xc00093d620, 0x0, 0x0, 0xc0007a4f90)\\n\\t/usr/lib/go/src/net/unixsock.go:260 +0x65\\ngithub.com/lf-edge/eve/pkg/pillar/pubsub/socketdriver.(*Publisher).Start.func1(0xc000a80600)\\n\\t/pillar/pubsub/socketdriver/publish.go:140 +0x95\\ncreated by github.com/lf-edge/eve/pkg/pillar/pubsub/socketdriver.(*Publisher).Start\\n\\t/pillar/pubsub/socketdriver/publish.go:130 +0xf0\",\"obj_key\":\"sigusr1_stacks\",\"obj_type\":\"sigusr1_stacks\",\"pid\":2003,\"source\":\"zedbox\",\"time\":\"2024-02-14T11:48:49.95288038Z\"}\n","msgid":3796,"timestamp":{"seconds":1707911329,"nanos":952880380},"filename":"/pillar/agentlog/agentlog.go:181","function":"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals"} +{"severity":"warning","source":"zedbox","iid":"2003","content":"{\"file\":\"/pillar/agentlog/agentlog.go:181\",\"func\":\"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals\",\"level\":\"warning\",\"log_event_type\":\"log\",\"msg\":\"goroutine 2377 [select, 126 minutes]:\\ngithub.com/lf-edge/eve/pkg/pillar/pubsub/socketdriver.(*Publisher).serveConnection(0xc000ece900, 0x1d69ff8, 0xc000010d78, 0x0)\\n\\t/pillar/pubsub/socketdriver/publish.go:267 +0xaed\\ncreated by github.com/lf-edge/eve/pkg/pillar/pubsub/socketdriver.(*Publisher).Start.func1\\n\\t/pillar/pubsub/socketdriver/publish.go:148 +0x274\",\"obj_key\":\"sigusr1_stacks\",\"obj_type\":\"sigusr1_stacks\",\"pid\":2003,\"source\":\"zedbox\",\"time\":\"2024-02-14T11:48:49.952895921Z\"}\n","msgid":3797,"timestamp":{"seconds":1707911329,"nanos":952895921},"filename":"/pillar/agentlog/agentlog.go:181","function":"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals"} +{"severity":"warning","source":"zedbox","iid":"2003","content":"{\"file\":\"/pillar/agentlog/agentlog.go:181\",\"func\":\"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals\",\"level\":\"warning\",\"log_event_type\":\"log\",\"msg\":\"goroutine 462598 [select, 4 minutes]:\\nnet/http.(*persistConn).writeLoop(0xc000322a20)\\n\\t/usr/lib/go/src/net/http/transport.go:2382 +0xf7\\ncreated by net/http.(*Transport).dialConn\\n\\t/usr/lib/go/src/net/http/transport.go:1744 +0xc9c\",\"obj_key\":\"sigusr1_stacks\",\"obj_type\":\"sigusr1_stacks\",\"pid\":2003,\"source\":\"zedbox\",\"time\":\"2024-02-14T11:48:49.952910582Z\"}\n","msgid":3798,"timestamp":{"seconds":1707911329,"nanos":952910582},"filename":"/pillar/agentlog/agentlog.go:181","function":"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals"} +{"severity":"warning","source":"zedbox","iid":"2003","content":"{\"file\":\"/pillar/agentlog/agentlog.go:181\",\"func\":\"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals\",\"level\":\"warning\",\"log_event_type\":\"log\",\"msg\":\"goroutine 2383 [chan receive, 126 minutes]:\\ngoogle.golang.org/grpc.(*addrConn).resetTransport(0xc0013d3600)\\n\\t/pillar/vendor/google.golang.org/grpc/clientconn.go:1213 +0x465\\ncreated by google.golang.org/grpc.(*addrConn).connect\\n\\t/pillar/vendor/google.golang.org/grpc/clientconn.go:843 +0x12a\",\"obj_key\":\"sigusr1_stacks\",\"obj_type\":\"sigusr1_stacks\",\"pid\":2003,\"source\":\"zedbox\",\"time\":\"2024-02-14T11:48:49.952945459Z\"}\n","msgid":3799,"timestamp":{"seconds":1707911329,"nanos":952945459},"filename":"/pillar/agentlog/agentlog.go:181","function":"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals"} +{"severity":"warning","source":"zedbox","iid":"2003","content":"{\"file\":\"/pillar/agentlog/agentlog.go:181\",\"func\":\"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals\",\"level\":\"warning\",\"log_event_type\":\"log\",\"msg\":\"goroutine 2385 [IO wait]:\\ninternal/poll.runtime_pollWait(0x7f79ba8f8418, 0x72, 0xffffffffffffffff)\\n\\t/usr/lib/go/src/runtime/netpoll.go:222 +0x55\\ninternal/poll.(*pollDesc).wait(0xc001319998, 0x72, 0x8000, 0x8000, 0xffffffffffffffff)\\n\\t/usr/lib/go/src/internal/poll/fd_poll_runtime.go:87 +0x45\\ninternal/poll.(*pollDesc).waitRead(...)\\n\\t/usr/lib/go/src/internal/poll/fd_poll_runtime.go:92\\ninternal/poll.(*FD).Read(0xc001319980, 0xc000e80000, 0x8000, 0x8000, 0x0, 0x0, 0x0)\\n\\t/usr/lib/go/src/internal/poll/fd_unix.go:166 +0x1d5\\nnet.(*netFD).Read(0xc001319980, 0xc000e80000, 0x8000, 0x8000, 0xacdd3e, 0x800000601, 0x0)\\n\\t/usr/lib/go/src/net/fd_posix.go:55 +0x4f\\nnet.(*conn).Read(0xc000010f28, 0xc000e80000, 0x8000, 0x8000, 0x0, 0x0, 0x0)\\n\\t/usr/lib/go/src/net/net.go:183 +0x91\\nbufio.(*Reader).Read(0xc0012af260, 0xc000618b98, 0x9, 0x9, 0xc0008ca480, 0xc00146ddd8, 0x405cc5)\\n\\t/usr/lib/go/src/bufio/bufio.go:227 +0x222\\nio.ReadAtLeast(0x1d221a0, 0xc0012af260, 0xc000618b98, 0x9, 0x9, 0x9, 0x18, 0xc000432570, 0x462780)\\n\\t/usr/lib/go/src/io/io.go:328 +0x87\\nio.ReadFull(...)\\n\\t/usr/lib/go/src/io/io.go:347\\ngolang.org/x/net/http2.readFrameHeader(0xc000618b98, 0x9, 0x9, 0x1d221a0, 0xc0012af260, 0x0, 0xc000000000, 0xc00146de3f, 0xc00146de01)\\n\\t/pillar/vendor/golang.org/x/net/http2/frame.go:237 +0x89\\ngolang.org/x/net/http2.(*Framer).ReadFrame(0xc000618b60, 0xc000975c68, 0xc000975c68, 0x0, 0x0)\\n\\t/pillar/vendor/golang.org/x/net/http2/frame.go:492 +0xa5\\ngoogle.golang.org/grpc/internal/transport.(*http2Client).reader(0xc00110bc00)\\n\\t/pillar/vendor/google.golang.org/grpc/internal/transport/http2_client.go:1330 +0x185\\ncreated by google.golang.org/grpc/internal/transport.newHTTP2Client\\n\\t/pillar/vendor/google.golang.org/grpc/internal/transport/http2_client.go:345 +0x1011\",\"obj_key\":\"sigusr1_stacks\",\"obj_type\":\"sigusr1_stacks\",\"pid\":2003,\"source\":\"zedbox\",\"time\":\"2024-02-14T11:48:49.952960808Z\"}\n","msgid":3800,"timestamp":{"seconds":1707911329,"nanos":952960808},"filename":"/pillar/agentlog/agentlog.go:181","function":"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals"} +{"severity":"warning","source":"zedbox","iid":"2003","content":"{\"file\":\"/pillar/agentlog/agentlog.go:181\",\"func\":\"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals\",\"level\":\"warning\",\"log_event_type\":\"log\",\"msg\":\"goroutine 2386 [select]:\\ngoogle.golang.org/grpc/internal/transport.(*controlBuffer).get(0xc000afe1e0, 0x1, 0x0, 0x0, 0x0, 0x0)\\n\\t/pillar/vendor/google.golang.org/grpc/internal/transport/controlbuf.go:395 +0xff\\ngoogle.golang.org/grpc/internal/transport.(*loopyWriter).run(0xc0012af380, 0x0, 0x0)\\n\\t/pillar/vendor/google.golang.org/grpc/internal/transport/controlbuf.go:515 +0x1dd\\ngoogle.golang.org/grpc/internal/transport.newHTTP2Client.func3(0xc00110bc00)\\n\\t/pillar/vendor/google.golang.org/grpc/internal/transport/http2_client.go:391 +0x7b\\ncreated by google.golang.org/grpc/internal/transport.newHTTP2Client\\n\\t/pillar/vendor/google.golang.org/grpc/internal/transport/http2_client.go:389 +0x11e7\",\"obj_key\":\"sigusr1_stacks\",\"obj_type\":\"sigusr1_stacks\",\"pid\":2003,\"source\":\"zedbox\",\"time\":\"2024-02-14T11:48:49.952978372Z\"}\n","msgid":3801,"timestamp":{"seconds":1707911329,"nanos":952978372},"filename":"/pillar/agentlog/agentlog.go:181","function":"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals"} +{"severity":"warning","source":"zedbox","iid":"2003","content":"{\"file\":\"/pillar/agentlog/agentlog.go:181\",\"func\":\"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals\",\"level\":\"warning\",\"log_event_type\":\"log\",\"msg\":\"goroutine 3071 [select, 126 minutes]:\\ngithub.com/lf-edge/eve/pkg/pillar/pubsub/socketdriver.(*Publisher).serveConnection(0xc00034dbc0, 0x1d69ff8, 0xc001936008, 0x0)\\n\\t/pillar/pubsub/socketdriver/publish.go:267 +0xaed\\ncreated by github.com/lf-edge/eve/pkg/pillar/pubsub/socketdriver.(*Publisher).Start.func1\\n\\t/pillar/pubsub/socketdriver/publish.go:148 +0x274\",\"obj_key\":\"sigusr1_stacks\",\"obj_type\":\"sigusr1_stacks\",\"pid\":2003,\"source\":\"zedbox\",\"time\":\"2024-02-14T11:48:49.952993734Z\"}\n","msgid":3802,"timestamp":{"seconds":1707911329,"nanos":952993734},"filename":"/pillar/agentlog/agentlog.go:181","function":"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals"} +{"severity":"warning","source":"zedbox","iid":"2003","content":"{\"file\":\"/pillar/agentlog/agentlog.go:181\",\"func\":\"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals\",\"level\":\"warning\",\"log_event_type\":\"log\",\"msg\":\"goroutine 2422 [select, 126 minutes]:\\ngithub.com/lf-edge/eve/pkg/pillar/pubsub/socketdriver.(*Publisher).serveConnection(0xc000ece900, 0x1d69ff8, 0xc000011430, 0x1)\\n\\t/pillar/pubsub/socketdriver/publish.go:267 +0xaed\\ncreated by github.com/lf-edge/eve/pkg/pillar/pubsub/socketdriver.(*Publisher).Start.func1\\n\\t/pillar/pubsub/socketdriver/publish.go:148 +0x274\",\"obj_key\":\"sigusr1_stacks\",\"obj_type\":\"sigusr1_stacks\",\"pid\":2003,\"source\":\"zedbox\",\"time\":\"2024-02-14T11:48:49.953045486Z\"}\n","msgid":3803,"timestamp":{"seconds":1707911329,"nanos":953045486},"filename":"/pillar/agentlog/agentlog.go:181","function":"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals"} +{"severity":"warning","source":"zedbox","iid":"2003","content":"{\"file\":\"/pillar/agentlog/agentlog.go:181\",\"func\":\"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals\",\"level\":\"warning\",\"log_event_type\":\"log\",\"msg\":\"goroutine 2940 [select, 126 minutes]:\\ngithub.com/lf-edge/eve/pkg/pillar/pubsub/socketdriver.(*Publisher).serveConnection(0xc000ece900, 0x1d69ff8, 0xc0010bbdd0, 0x6)\\n\\t/pillar/pubsub/socketdriver/publish.go:267 +0xaed\\ncreated by github.com/lf-edge/eve/pkg/pillar/pubsub/socketdriver.(*Publisher).Start.func1\\n\\t/pillar/pubsub/socketdriver/publish.go:148 +0x274\",\"obj_key\":\"sigusr1_stacks\",\"obj_type\":\"sigusr1_stacks\",\"pid\":2003,\"source\":\"zedbox\",\"time\":\"2024-02-14T11:48:49.953060295Z\"}\n","msgid":3804,"timestamp":{"seconds":1707911329,"nanos":953060295},"filename":"/pillar/agentlog/agentlog.go:181","function":"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals"} +{"severity":"warning","source":"zedbox","iid":"2003","content":"{\"file\":\"/pillar/agentlog/agentlog.go:181\",\"func\":\"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals\",\"level\":\"warning\",\"log_event_type\":\"log\",\"msg\":\"goroutine 2469 [chan receive, 126 minutes]:\\ngithub.com/lf-edge/eve/pkg/pillar/worker.(*Pool).mergeResult(0xc000d8f800, 0x1d6d388, 0xc001551e60)\\n\\t/pillar/worker/workerpool.go:93 +0x170\\ncreated by github.com/lf-edge/eve/pkg/pillar/worker.(*Pool).TrySubmit\\n\\t/pillar/worker/workerpool.go:178 +0x3c5\",\"obj_key\":\"sigusr1_stacks\",\"obj_type\":\"sigusr1_stacks\",\"pid\":2003,\"source\":\"zedbox\",\"time\":\"2024-02-14T11:48:49.953074872Z\"}\n","msgid":3805,"timestamp":{"seconds":1707911329,"nanos":953074872},"filename":"/pillar/agentlog/agentlog.go:181","function":"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals"} +{"severity":"warning","source":"zedbox","iid":"2003","content":"{\"file\":\"/pillar/agentlog/agentlog.go:181\",\"func\":\"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals\",\"level\":\"warning\",\"log_event_type\":\"log\",\"msg\":\"goroutine 2945 [select, 126 minutes]:\\ngithub.com/lf-edge/eve/libs/zedUpload.(*DronaCtx).ListenAndServe(0xc0006ba390)\\n\\t/pillar/vendor/github.com/lf-edge/eve/libs/zedUpload/datastore.go:132 +0xa5\\ngithub.com/lf-edge/eve/libs/zedUpload.NewDronaCtx.func1(0xc000647014, 0xc0006ba390)\\n\\t/pillar/vendor/github.com/lf-edge/eve/libs/zedUpload/datastore.go:281 +0x53\\ncreated by github.com/lf-edge/eve/libs/zedUpload.NewDronaCtx\\n\\t/pillar/vendor/github.com/lf-edge/eve/libs/zedUpload/datastore.go:279 +0x171\",\"obj_key\":\"sigusr1_stacks\",\"obj_type\":\"sigusr1_stacks\",\"pid\":2003,\"source\":\"zedbox\",\"time\":\"2024-02-14T11:48:49.953089735Z\"}\n","msgid":3806,"timestamp":{"seconds":1707911329,"nanos":953089735},"filename":"/pillar/agentlog/agentlog.go:181","function":"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals"} +{"severity":"warning","source":"zedbox","iid":"2003","content":"{\"file\":\"/pillar/agentlog/agentlog.go:181\",\"func\":\"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals\",\"level\":\"warning\",\"log_event_type\":\"log\",\"msg\":\"goroutine 2468 [chan receive, 126 minutes]:\\ngithub.com/lf-edge/eve/pkg/pillar/worker.(*Single).processWork(0xc001551e60, 0x1d24a40, 0xc001056ed0, 0x171e680, 0xc0014ce3c0, 0xc000e07e00, 0xc000e07e60)\\n\\t/pillar/worker/worker.go:141 +0x2c5\\ncreated by github.com/lf-edge/eve/pkg/pillar/worker.NewWorker\\n\\t/pillar/worker/worker.go:117 +0x24c\",\"obj_key\":\"sigusr1_stacks\",\"obj_type\":\"sigusr1_stacks\",\"pid\":2003,\"source\":\"zedbox\",\"time\":\"2024-02-14T11:48:49.953122888Z\"}\n","msgid":3807,"timestamp":{"seconds":1707911329,"nanos":953122888},"filename":"/pillar/agentlog/agentlog.go:181","function":"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals"} +{"severity":"warning","source":"zedbox","iid":"2003","content":"{\"file\":\"/pillar/agentlog/agentlog.go:181\",\"func\":\"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals\",\"level\":\"warning\",\"log_event_type\":\"log\",\"msg\":\"goroutine 2405 [select, 1 minutes]:\\ngithub.com/lf-edge/eve/pkg/pillar/flextimer.flexTicker(0xc001490000, 0xc000d7b1a0)\\n\\t/pillar/flextimer/flextimer.go:153 +0x2f5\\ncreated by github.com/lf-edge/eve/pkg/pillar/flextimer.newFlexTicker\\n\\t/pillar/flextimer/flextimer.go:117 +0x67\",\"obj_key\":\"sigusr1_stacks\",\"obj_type\":\"sigusr1_stacks\",\"pid\":2003,\"source\":\"zedbox\",\"time\":\"2024-02-14T11:48:49.953153353Z\"}\n","msgid":3808,"timestamp":{"seconds":1707911329,"nanos":953153353},"filename":"/pillar/agentlog/agentlog.go:181","function":"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals"} +{"severity":"warning","source":"zedbox","iid":"2003","content":"{\"file\":\"/pillar/agentlog/agentlog.go:181\",\"func\":\"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals\",\"level\":\"warning\",\"log_event_type\":\"log\",\"msg\":\"goroutine 2910 [select, 126 minutes]:\\ngithub.com/lf-edge/eve/libs/zedUpload.(*DronaCtx).ListenAndServe(0xc0006ba390)\\n\\t/pillar/vendor/github.com/lf-edge/eve/libs/zedUpload/datastore.go:132 +0xa5\\ngithub.com/lf-edge/eve/libs/zedUpload.NewDronaCtx.func1(0xc000647014, 0xc0006ba390)\\n\\t/pillar/vendor/github.com/lf-edge/eve/libs/zedUpload/datastore.go:281 +0x53\\ncreated by github.com/lf-edge/eve/libs/zedUpload.NewDronaCtx\\n\\t/pillar/vendor/github.com/lf-edge/eve/libs/zedUpload/datastore.go:279 +0x171\",\"obj_key\":\"sigusr1_stacks\",\"obj_type\":\"sigusr1_stacks\",\"pid\":2003,\"source\":\"zedbox\",\"time\":\"2024-02-14T11:48:49.953209123Z\"}\n","msgid":3809,"timestamp":{"seconds":1707911329,"nanos":953209123},"filename":"/pillar/agentlog/agentlog.go:181","function":"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals"} +{"severity":"warning","source":"zedbox","iid":"2003","content":"{\"file\":\"/pillar/agentlog/agentlog.go:181\",\"func\":\"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals\",\"level\":\"warning\",\"log_event_type\":\"log\",\"msg\":\"goroutine 2906 [select, 126 minutes]:\\ngithub.com/lf-edge/eve/libs/zedUpload.(*DronaCtx).ListenAndServe(0xc0006ba390)\\n\\t/pillar/vendor/github.com/lf-edge/eve/libs/zedUpload/datastore.go:132 +0xa5\\ngithub.com/lf-edge/eve/libs/zedUpload.NewDronaCtx.func1(0xc000647014, 0xc0006ba390)\\n\\t/pillar/vendor/github.com/lf-edge/eve/libs/zedUpload/datastore.go:281 +0x53\\ncreated by github.com/lf-edge/eve/libs/zedUpload.NewDronaCtx\\n\\t/pillar/vendor/github.com/lf-edge/eve/libs/zedUpload/datastore.go:279 +0x171\",\"obj_key\":\"sigusr1_stacks\",\"obj_type\":\"sigusr1_stacks\",\"pid\":2003,\"source\":\"zedbox\",\"time\":\"2024-02-14T11:48:49.953246339Z\"}\n","msgid":3810,"timestamp":{"seconds":1707911329,"nanos":953246339},"filename":"/pillar/agentlog/agentlog.go:181","function":"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals"} +{"severity":"warning","source":"zedbox","iid":"2003","content":"{\"file\":\"/pillar/agentlog/agentlog.go:181\",\"func\":\"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals\",\"level\":\"warning\",\"log_event_type\":\"log\",\"msg\":\"goroutine 2908 [select, 126 minutes]:\\ngithub.com/lf-edge/eve/libs/zedUpload.(*DronaCtx).ListenAndServe(0xc0006ba390)\\n\\t/pillar/vendor/github.com/lf-edge/eve/libs/zedUpload/datastore.go:132 +0xa5\\ngithub.com/lf-edge/eve/libs/zedUpload.NewDronaCtx.func1(0xc000647014, 0xc0006ba390)\\n\\t/pillar/vendor/github.com/lf-edge/eve/libs/zedUpload/datastore.go:281 +0x53\\ncreated by github.com/lf-edge/eve/libs/zedUpload.NewDronaCtx\\n\\t/pillar/vendor/github.com/lf-edge/eve/libs/zedUpload/datastore.go:279 +0x171\",\"obj_key\":\"sigusr1_stacks\",\"obj_type\":\"sigusr1_stacks\",\"pid\":2003,\"source\":\"zedbox\",\"time\":\"2024-02-14T11:48:49.953261833Z\"}\n","msgid":3811,"timestamp":{"seconds":1707911329,"nanos":953261833},"filename":"/pillar/agentlog/agentlog.go:181","function":"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals"} +{"severity":"warning","source":"zedbox","iid":"2003","content":"{\"file\":\"/pillar/agentlog/agentlog.go:181\",\"func\":\"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals\",\"level\":\"warning\",\"log_event_type\":\"log\",\"msg\":\"goroutine 2909 [select, 126 minutes]:\\ngithub.com/lf-edge/eve/libs/zedUpload.(*DronaCtx).ListenAndServe(0xc0006ba390)\\n\\t/pillar/vendor/github.com/lf-edge/eve/libs/zedUpload/datastore.go:132 +0xa5\\ngithub.com/lf-edge/eve/libs/zedUpload.NewDronaCtx.func1(0xc000647014, 0xc0006ba390)\\n\\t/pillar/vendor/github.com/lf-edge/eve/libs/zedUpload/datastore.go:281 +0x53\\ncreated by github.com/lf-edge/eve/libs/zedUpload.NewDronaCtx\\n\\t/pillar/vendor/github.com/lf-edge/eve/libs/zedUpload/datastore.go:279 +0x171\",\"obj_key\":\"sigusr1_stacks\",\"obj_type\":\"sigusr1_stacks\",\"pid\":2003,\"source\":\"zedbox\",\"time\":\"2024-02-14T11:48:49.953276606Z\"}\n","msgid":3812,"timestamp":{"seconds":1707911329,"nanos":953276606},"filename":"/pillar/agentlog/agentlog.go:181","function":"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals"} +{"severity":"warning","source":"zedbox","iid":"2003","content":"{\"file\":\"/pillar/agentlog/agentlog.go:181\",\"func\":\"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals\",\"level\":\"warning\",\"log_event_type\":\"log\",\"msg\":\"goroutine 2946 [select, 126 minutes]:\\ngithub.com/lf-edge/eve/libs/zedUpload.(*DronaCtx).ListenAndServe(0xc0006ba390)\\n\\t/pillar/vendor/github.com/lf-edge/eve/libs/zedUpload/datastore.go:132 +0xa5\\ngithub.com/lf-edge/eve/libs/zedUpload.NewDronaCtx.func1(0xc000647014, 0xc0006ba390)\\n\\t/pillar/vendor/github.com/lf-edge/eve/libs/zedUpload/datastore.go:281 +0x53\\ncreated by github.com/lf-edge/eve/libs/zedUpload.NewDronaCtx\\n\\t/pillar/vendor/github.com/lf-edge/eve/libs/zedUpload/datastore.go:279 +0x171\",\"obj_key\":\"sigusr1_stacks\",\"obj_type\":\"sigusr1_stacks\",\"pid\":2003,\"source\":\"zedbox\",\"time\":\"2024-02-14T11:48:49.953291616Z\"}\n","msgid":3813,"timestamp":{"seconds":1707911329,"nanos":953291616},"filename":"/pillar/agentlog/agentlog.go:181","function":"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals"} +{"severity":"warning","source":"zedbox","iid":"2003","content":"{\"file\":\"/pillar/agentlog/agentlog.go:181\",\"func\":\"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals\",\"level\":\"warning\",\"log_event_type\":\"log\",\"msg\":\"goroutine 2912 [select, 126 minutes]:\\ngithub.com/lf-edge/eve/libs/zedUpload.(*DronaCtx).ListenAndServe(0xc0006ba390)\\n\\t/pillar/vendor/github.com/lf-edge/eve/libs/zedUpload/datastore.go:132 +0xa5\\ngithub.com/lf-edge/eve/libs/zedUpload.NewDronaCtx.func1(0xc000647014, 0xc0006ba390)\\n\\t/pillar/vendor/github.com/lf-edge/eve/libs/zedUpload/datastore.go:281 +0x53\\ncreated by github.com/lf-edge/eve/libs/zedUpload.NewDronaCtx\\n\\t/pillar/vendor/github.com/lf-edge/eve/libs/zedUpload/datastore.go:279 +0x171\",\"obj_key\":\"sigusr1_stacks\",\"obj_type\":\"sigusr1_stacks\",\"pid\":2003,\"source\":\"zedbox\",\"time\":\"2024-02-14T11:48:49.953308511Z\"}\n","msgid":3814,"timestamp":{"seconds":1707911329,"nanos":953308511},"filename":"/pillar/agentlog/agentlog.go:181","function":"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals"} +{"severity":"warning","source":"zedbox","iid":"2003","content":"{\"file\":\"/pillar/agentlog/agentlog.go:181\",\"func\":\"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals\",\"level\":\"warning\",\"log_event_type\":\"log\",\"msg\":\"goroutine 2911 [select, 126 minutes]:\\ngithub.com/lf-edge/eve/libs/zedUpload.(*DronaCtx).ListenAndServe(0xc0006ba390)\\n\\t/pillar/vendor/github.com/lf-edge/eve/libs/zedUpload/datastore.go:132 +0xa5\\ngithub.com/lf-edge/eve/libs/zedUpload.NewDronaCtx.func1(0xc000647014, 0xc0006ba390)\\n\\t/pillar/vendor/github.com/lf-edge/eve/libs/zedUpload/datastore.go:281 +0x53\\ncreated by github.com/lf-edge/eve/libs/zedUpload.NewDronaCtx\\n\\t/pillar/vendor/github.com/lf-edge/eve/libs/zedUpload/datastore.go:279 +0x171\",\"obj_key\":\"sigusr1_stacks\",\"obj_type\":\"sigusr1_stacks\",\"pid\":2003,\"source\":\"zedbox\",\"time\":\"2024-02-14T11:48:49.953323695Z\"}\n","msgid":3815,"timestamp":{"seconds":1707911329,"nanos":953323695},"filename":"/pillar/agentlog/agentlog.go:181","function":"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals"} +{"severity":"warning","source":"zedbox","iid":"2003","content":"{\"file\":\"/pillar/agentlog/agentlog.go:181\",\"func\":\"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals\",\"level\":\"warning\",\"log_event_type\":\"log\",\"msg\":\"goroutine 2546 [select, 126 minutes]:\\ngithub.com/lf-edge/eve/pkg/pillar/pubsub/socketdriver.(*Publisher).serveConnection(0xc000ece900, 0x1d69ff8, 0xc00000f4f0, 0x2)\\n\\t/pillar/pubsub/socketdriver/publish.go:267 +0xaed\\ncreated by github.com/lf-edge/eve/pkg/pillar/pubsub/socketdriver.(*Publisher).Start.func1\\n\\t/pillar/pubsub/socketdriver/publish.go:148 +0x274\",\"obj_key\":\"sigusr1_stacks\",\"obj_type\":\"sigusr1_stacks\",\"pid\":2003,\"source\":\"zedbox\",\"time\":\"2024-02-14T11:48:49.953342048Z\"}\n","msgid":3816,"timestamp":{"seconds":1707911329,"nanos":953342048},"filename":"/pillar/agentlog/agentlog.go:181","function":"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals"} +{"severity":"warning","source":"zedbox","iid":"2003","content":"{\"file\":\"/pillar/agentlog/agentlog.go:181\",\"func\":\"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals\",\"level\":\"warning\",\"log_event_type\":\"log\",\"msg\":\"goroutine 2667 [select, 126 minutes]:\\ngithub.com/lf-edge/eve/pkg/pillar/pubsub/socketdriver.(*Publisher).serveConnection(0xc000ece900, 0x1d69ff8, 0xc0010ba198, 0x5)\\n\\t/pillar/pubsub/socketdriver/publish.go:267 +0xaed\\ncreated by github.com/lf-edge/eve/pkg/pillar/pubsub/socketdriver.(*Publisher).Start.func1\\n\\t/pillar/pubsub/socketdriver/publish.go:148 +0x274\",\"obj_key\":\"sigusr1_stacks\",\"obj_type\":\"sigusr1_stacks\",\"pid\":2003,\"source\":\"zedbox\",\"time\":\"2024-02-14T11:48:49.953373872Z\"}\n","msgid":3817,"timestamp":{"seconds":1707911329,"nanos":953373872},"filename":"/pillar/agentlog/agentlog.go:181","function":"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals"} +{"severity":"warning","source":"zedbox","iid":"2003","content":"{\"file\":\"/pillar/agentlog/agentlog.go:181\",\"func\":\"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals\",\"level\":\"warning\",\"log_event_type\":\"log\",\"msg\":\"goroutine 2668 [select, 126 minutes]:\\ngithub.com/lf-edge/eve/pkg/pillar/pubsub/socketdriver.(*Publisher).serveConnection(0xc000ece9c0, 0x1d69ff8, 0xc0010ba1d0, 0x0)\\n\\t/pillar/pubsub/socketdriver/publish.go:267 +0xaed\\ncreated by github.com/lf-edge/eve/pkg/pillar/pubsub/socketdriver.(*Publisher).Start.func1\\n\\t/pillar/pubsub/socketdriver/publish.go:148 +0x274\",\"obj_key\":\"sigusr1_stacks\",\"obj_type\":\"sigusr1_stacks\",\"pid\":2003,\"source\":\"zedbox\",\"time\":\"2024-02-14T11:48:49.953388599Z\"}\n","msgid":3818,"timestamp":{"seconds":1707911329,"nanos":953388599},"filename":"/pillar/agentlog/agentlog.go:181","function":"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals"} +{"severity":"warning","source":"zedbox","iid":"2003","content":"{\"file\":\"/pillar/agentlog/agentlog.go:181\",\"func\":\"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals\",\"level\":\"warning\",\"log_event_type\":\"log\",\"msg\":\"goroutine 2696 [select, 126 minutes]:\\ngithub.com/lf-edge/eve/pkg/pillar/pubsub/socketdriver.(*Publisher).serveConnection(0xc000ece900, 0x1d69ff8, 0xc0010bb0c8, 0x4)\\n\\t/pillar/pubsub/socketdriver/publish.go:267 +0xaed\\ncreated by github.com/lf-edge/eve/pkg/pillar/pubsub/socketdriver.(*Publisher).Start.func1\\n\\t/pillar/pubsub/socketdriver/publish.go:148 +0x274\",\"obj_key\":\"sigusr1_stacks\",\"obj_type\":\"sigusr1_stacks\",\"pid\":2003,\"source\":\"zedbox\",\"time\":\"2024-02-14T11:48:49.953424684Z\"}\n","msgid":3819,"timestamp":{"seconds":1707911329,"nanos":953424684},"filename":"/pillar/agentlog/agentlog.go:181","function":"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals"} +{"severity":"warning","source":"zedbox","iid":"2003","content":"{\"file\":\"/pillar/agentlog/agentlog.go:181\",\"func\":\"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals\",\"level\":\"warning\",\"log_event_type\":\"log\",\"msg\":\"goroutine 2698 [chan receive, 126 minutes]:\\ngithub.com/lf-edge/eve/pkg/pillar/cmd/zfsmanager.deviceWatcher(0xc001529500)\\n\\t/pillar/cmd/zfsmanager/zfsmanager.go:161 +0x234\\ncreated by github.com/lf-edge/eve/pkg/pillar/cmd/zfsmanager.Run\\n\\t/pillar/cmd/zfsmanager/zfsmanager.go:94 +0x545\",\"obj_key\":\"sigusr1_stacks\",\"obj_type\":\"sigusr1_stacks\",\"pid\":2003,\"source\":\"zedbox\",\"time\":\"2024-02-14T11:48:49.953455524Z\"}\n","msgid":3820,"timestamp":{"seconds":1707911329,"nanos":953455524},"filename":"/pillar/agentlog/agentlog.go:181","function":"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals"} +{"severity":"warning","source":"zedbox","iid":"2003","content":"{\"file\":\"/pillar/agentlog/agentlog.go:181\",\"func\":\"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals\",\"level\":\"warning\",\"log_event_type\":\"log\",\"msg\":\"goroutine 2699 [syscall, 126 minutes]:\\nsyscall.Syscall6(0xe8, 0x162, 0xc0015a7c2c, 0x7, 0xffffffffffffffff, 0x0, 0x0, 0x6666666666666666, 0x3a646e427061430a, 0x6631303030303009)\\n\\t/usr/lib/go/src/syscall/asm_linux_amd64.s:43 +0x5\\ngolang.org/x/sys/unix.EpollWait(0x162, 0xc0015a7c2c, 0x7, 0x7, 0xffffffffffffffff, 0x530a30093a737265, 0x0, 0x0)\\n\\t/pillar/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go:77 +0x72\\ngithub.com/fsnotify/fsnotify.(*fdPoller).wait(0xc001427840, 0x0, 0x0, 0x0)\\n\\t/pillar/vendor/github.com/fsnotify/fsnotify/inotify_poller.go:86 +0x91\\ngithub.com/fsnotify/fsnotify.(*Watcher).readEvents(0xc000ae5400)\\n\\t/pillar/vendor/github.com/fsnotify/fsnotify/inotify.go:192 +0x206\\ncreated by github.com/fsnotify/fsnotify.NewWatcher\\n\\t/pillar/vendor/github.com/fsnotify/fsnotify/inotify.go:59 +0x1ab\",\"obj_key\":\"sigusr1_stacks\",\"obj_type\":\"sigusr1_stacks\",\"pid\":2003,\"source\":\"zedbox\",\"time\":\"2024-02-14T11:48:49.953492281Z\"}\n","msgid":3821,"timestamp":{"seconds":1707911329,"nanos":953492281},"filename":"/pillar/agentlog/agentlog.go:181","function":"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals"} +{"severity":"warning","source":"zedbox","iid":"2003","content":"{\"file\":\"/pillar/agentlog/agentlog.go:181\",\"func\":\"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals\",\"level\":\"warning\",\"log_event_type\":\"log\",\"msg\":\"goroutine 2905 [select, 126 minutes]:\\ngithub.com/lf-edge/eve/libs/zedUpload.(*DronaCtx).ListenAndServe(0xc0006ba390)\\n\\t/pillar/vendor/github.com/lf-edge/eve/libs/zedUpload/datastore.go:132 +0xa5\\ngithub.com/lf-edge/eve/libs/zedUpload.NewDronaCtx.func1(0xc000647014, 0xc0006ba390)\\n\\t/pillar/vendor/github.com/lf-edge/eve/libs/zedUpload/datastore.go:281 +0x53\\ncreated by github.com/lf-edge/eve/libs/zedUpload.NewDronaCtx\\n\\t/pillar/vendor/github.com/lf-edge/eve/libs/zedUpload/datastore.go:279 +0x171\",\"obj_key\":\"sigusr1_stacks\",\"obj_type\":\"sigusr1_stacks\",\"pid\":2003,\"source\":\"zedbox\",\"time\":\"2024-02-14T11:48:49.953508165Z\"}\n","msgid":3822,"timestamp":{"seconds":1707911329,"nanos":953508165},"filename":"/pillar/agentlog/agentlog.go:181","function":"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals"} +{"severity":"warning","source":"zedbox","iid":"2003","content":"{\"file\":\"/pillar/agentlog/agentlog.go:181\",\"func\":\"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals\",\"level\":\"warning\",\"log_event_type\":\"log\",\"msg\":\"goroutine 2907 [select, 126 minutes]:\\ngithub.com/lf-edge/eve/libs/zedUpload.(*DronaCtx).ListenAndServe(0xc0006ba390)\\n\\t/pillar/vendor/github.com/lf-edge/eve/libs/zedUpload/datastore.go:132 +0xa5\\ngithub.com/lf-edge/eve/libs/zedUpload.NewDronaCtx.func1(0xc000647014, 0xc0006ba390)\\n\\t/pillar/vendor/github.com/lf-edge/eve/libs/zedUpload/datastore.go:281 +0x53\\ncreated by github.com/lf-edge/eve/libs/zedUpload.NewDronaCtx\\n\\t/pillar/vendor/github.com/lf-edge/eve/libs/zedUpload/datastore.go:279 +0x171\",\"obj_key\":\"sigusr1_stacks\",\"obj_type\":\"sigusr1_stacks\",\"pid\":2003,\"source\":\"zedbox\",\"time\":\"2024-02-14T11:48:49.953525183Z\"}\n","msgid":3823,"timestamp":{"seconds":1707911329,"nanos":953525183},"filename":"/pillar/agentlog/agentlog.go:181","function":"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals"} +{"severity":"warning","source":"zedbox","iid":"2003","content":"{\"file\":\"/pillar/agentlog/agentlog.go:181\",\"func\":\"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals\",\"level\":\"warning\",\"log_event_type\":\"log\",\"msg\":\"goroutine 448311 [IO wait, 7 minutes]:\\ninternal/poll.runtime_pollWait(0x7f79ba900478, 0x72, 0xffffffffffffffff)\\n\\t/usr/lib/go/src/runtime/netpoll.go:222 +0x55\\ninternal/poll.(*pollDesc).wait(0xc000eb3a98, 0x72, 0x1000, 0x1000, 0xffffffffffffffff)\\n\\t/usr/lib/go/src/internal/poll/fd_poll_runtime.go:87 +0x45\\ninternal/poll.(*pollDesc).waitRead(...)\\n\\t/usr/lib/go/src/internal/poll/fd_poll_runtime.go:92\\ninternal/poll.(*FD).Read(0xc000eb3a80, 0xc00174a000, 0x1000, 0x1000, 0x0, 0x0, 0x0)\\n\\t/usr/lib/go/src/internal/poll/fd_unix.go:166 +0x1d5\\nnet.(*netFD).Read(0xc000eb3a80, 0xc00174a000, 0x1000, 0x1000, 0x43a17c, 0xc00134dc38, 0x465b00)\\n\\t/usr/lib/go/src/net/fd_posix.go:55 +0x4f\\nnet.(*conn).Read(0xc001937e78, 0xc00174a000, 0x1000, 0x1000, 0x0, 0x0, 0x0)\\n\\t/usr/lib/go/src/net/net.go:183 +0x91\\nnet/http.(*persistConn).Read(0xc0017da5a0, 0xc00174a000, 0x1000, 0x1000, 0xc00093daa0, 0xc00134dd40, 0x405755)\\n\\t/usr/lib/go/src/net/http/transport.go:1922 +0x77\\nbufio.(*Reader).fill(0xc00195e480)\\n\\t/usr/lib/go/src/bufio/bufio.go:101 +0x108\\nbufio.(*Reader).Peek(0xc00195e480, 0x1, 0x0, 0x1, 0x4, 0x1, 0x3)\\n\\t/usr/lib/go/src/bufio/bufio.go:139 +0x4f\\nnet/http.(*persistConn).readLoop(0xc0017da5a0)\\n\\t/usr/lib/go/src/net/http/transport.go:2083 +0x1a8\\ncreated by net/http.(*Transport).dialConn\\n\\t/usr/lib/go/src/net/http/transport.go:1743 +0xc77\",\"obj_key\":\"sigusr1_stacks\",\"obj_type\":\"sigusr1_stacks\",\"pid\":2003,\"source\":\"zedbox\",\"time\":\"2024-02-14T11:48:49.953540644Z\"}\n","msgid":3824,"timestamp":{"seconds":1707911329,"nanos":953540644},"filename":"/pillar/agentlog/agentlog.go:181","function":"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals"} +{"severity":"warning","source":"zedbox","iid":"2003","content":"{\"file\":\"/pillar/agentlog/agentlog.go:181\",\"func\":\"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals\",\"level\":\"warning\",\"log_event_type\":\"log\",\"msg\":\"goroutine 448312 [select, 7 minutes]:\\nnet/http.(*persistConn).writeLoop(0xc0017da5a0)\\n\\t/usr/lib/go/src/net/http/transport.go:2382 +0xf7\\ncreated by net/http.(*Transport).dialConn\\n\\t/usr/lib/go/src/net/http/transport.go:1744 +0xc9c\",\"obj_key\":\"sigusr1_stacks\",\"obj_type\":\"sigusr1_stacks\",\"pid\":2003,\"source\":\"zedbox\",\"time\":\"2024-02-14T11:48:49.953556906Z\"}\n","msgid":3825,"timestamp":{"seconds":1707911329,"nanos":953556906},"filename":"/pillar/agentlog/agentlog.go:181","function":"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals"} +{"severity":"warning","source":"zedbox","iid":"2003","content":"{\"file\":\"/pillar/agentlog/agentlog.go:181\",\"func\":\"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals\",\"level\":\"warning\",\"log_event_type\":\"log\",\"msg\":\"goroutine 462597 [IO wait, 4 minutes]:\\ninternal/poll.runtime_pollWait(0x7f79ba8f7b08, 0x72, 0xffffffffffffffff)\\n\\t/usr/lib/go/src/runtime/netpoll.go:222 +0x55\\ninternal/poll.(*pollDesc).wait(0xc001882b98, 0x72, 0x1000, 0x1000, 0xffffffffffffffff)\\n\\t/usr/lib/go/src/internal/poll/fd_poll_runtime.go:87 +0x45\\ninternal/poll.(*pollDesc).waitRead(...)\\n\\t/usr/lib/go/src/internal/poll/fd_poll_runtime.go:92\\ninternal/poll.(*FD).Read(0xc001882b80, 0xc00182b000, 0x1000, 0x1000, 0x0, 0x0, 0x0)\\n\\t/usr/lib/go/src/internal/poll/fd_unix.go:166 +0x1d5\\nnet.(*netFD).Read(0xc001882b80, 0xc00182b000, 0x1000, 0x1000, 0x43a17c, 0xc00158cc38, 0x465b00)\\n\\t/usr/lib/go/src/net/fd_posix.go:55 +0x4f\\nnet.(*conn).Read(0xc000f882f0, 0xc00182b000, 0x1000, 0x1000, 0x0, 0x0, 0x0)\\n\\t/usr/lib/go/src/net/net.go:183 +0x91\\nnet/http.(*persistConn).Read(0xc000322a20, 0xc00182b000, 0x1000, 0x1000, 0xc0013c6ae0, 0xc00158cd40, 0x405755)\\n\\t/usr/lib/go/src/net/http/transport.go:1922 +0x77\\nbufio.(*Reader).fill(0xc0014e9e00)\\n\\t/usr/lib/go/src/bufio/bufio.go:101 +0x108\\nbufio.(*Reader).Peek(0xc0014e9e00, 0x1, 0x0, 0x1, 0x4, 0x1, 0x3)\\n\\t/usr/lib/go/src/bufio/bufio.go:139 +0x4f\\nnet/http.(*persistConn).readLoop(0xc000322a20)\\n\\t/usr/lib/go/src/net/http/transport.go:2083 +0x1a8\\ncreated by net/http.(*Transport).dialConn\\n\\t/usr/lib/go/src/net/http/transport.go:1743 +0xc77\\n\",\"obj_key\":\"sigusr1_stacks\",\"obj_type\":\"sigusr1_stacks\",\"pid\":2003,\"source\":\"zedbox\",\"time\":\"2024-02-14T11:48:49.953571822Z\"}\n","msgid":3826,"timestamp":{"seconds":1707911329,"nanos":953571822},"filename":"/pillar/agentlog/agentlog.go:181","function":"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals"} +{"severity":"warning","source":"zedbox","iid":"2003","content":"{\"file\":\"/pillar/agentlog/agentlog.go:183\",\"func\":\"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals\",\"level\":\"warning\",\"msg\":\"SIGUSR1: end of stacks\",\"pid\":2003,\"source\":\"zedbox\",\"time\":\"2024-02-14T11:48:49.953589346Z\"}\n","msgid":3827,"timestamp":{"seconds":1707911329,"nanos":953589346},"filename":"/pillar/agentlog/agentlog.go:183","function":"github.com/lf-edge/eve/pkg/pillar/agentlog.handleSignals"} diff --git a/pkg/newlog/testdata/perf/README.md b/pkg/newlog/testdata/perf/README.md new file mode 100644 index 0000000000..44f8f15164 --- /dev/null +++ b/pkg/newlog/testdata/perf/README.md @@ -0,0 +1,39 @@ +# Performance Data + +This directory contains performance data for the secure logging mechanisms introduced to `newlogd`. The algorithm used is "Forward-Secure Sequential Aggregate Authentication." + +Each test consists of 10, 20, 30, 40, 50, 100, 200, and 500 runs. A single run is the time required to process a batch of logs. Each batch of logs contains roughly 400 log entries, with each entry varying in size. The base log file is artificially grown by appending its content to itself, so consider a small +/- degree of error in benchmarks compared what you might see in the real world. + +This is a microbenchmark, calculating the performance degradation only for the log processing function `doMoveCompressFile*`. + +## FssAggSig + +This is the cost of computing the aggregated signature for each batch of logs. The results show that adding the aggregated signature to each batch of logs incurs a performance cost of 28% to 46% per processed batch of logs, with the cost dropping on higher-count runs as system caches are utilized. + +![](fssaggsig_overhead_and_cost.png) +*FssAggSig Overhead and Cost* + +![](fssaggsig_average_secure_non_secure_time.png) +*FssAggSig Timing* + +## FssAggVer + +This is the cost of computing the verification result of the aggregated signature for each batch of logs. This can lead to exponential growth as the number of key iterations increases. + + +![](fssaggver_overhead_and_cost.png) +*FssAggVer Overhead and Cost* + +![](fssaggver_average_secure_non_secure_time.png) +*FssAggVer Timing* + + +## FssAggVer with Cached Keys + +This is the cost of computing the verification result of the aggregated signature for each batch of logs. In this run verification key is cached for every multiple of 10,000, allowing the verification algorithm to use shortcuts to verify the logs faster. The results show that verifying each batch of logs can add a performance cost of 35% to 53%. + +![](fssaggver_cached_keys_10000_overhead_and_cost.png) +*FssAggVer (with cached keys) Overhead and Cost* + +![](fssaggver_cached_keys_10000_average_secure_non_secure_time.png) +*FssAggVer (with cached keys) Timing* \ No newline at end of file diff --git a/pkg/newlog/testdata/perf/fssaggsig_average_secure_non_secure_time.png b/pkg/newlog/testdata/perf/fssaggsig_average_secure_non_secure_time.png new file mode 100644 index 0000000000000000000000000000000000000000..ae0d5750d6f7caaa2eadcebe943e9fd08d5771bd GIT binary patch literal 54657 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 literal 0 HcmV?d00001 diff --git a/pkg/newlog/testdata/perf/fssaggsig_overhead_and_cost.png b/pkg/newlog/testdata/perf/fssaggsig_overhead_and_cost.png new file mode 100644 index 0000000000000000000000000000000000000000..0107c8e19efcfdea39c8ae2a4c19f4e2c8ccd613 GIT binary patch literal 56593 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 @m%I}_c|^M(I3Rv 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 literal 0 HcmV?d00001 diff --git a/pkg/newlog/testdata/perf/fssaggsig_timing_results.csv b/pkg/newlog/testdata/perf/fssaggsig_timing_results.csv new file mode 100644 index 0000000000..73044b5173 --- /dev/null +++ b/pkg/newlog/testdata/perf/fssaggsig_timing_results.csv @@ -0,0 +1,9 @@ +Test Run,Average Secure Time (us),Average Non-Secure Time (us),Performance Cost (us),Performance Overhead (%) +10,22588,17526,5062,28.88 +20,33573,25075,8498,33.89 +30,57371,39083,18288,46.79 +40,65602,45449,20153,44.34 +50,76776,53785,22991,42.75 +100,75143,51382,23761,46.24 +200,67506,46271,21235,45.89 +500,53891,37241,16650,44.71 diff --git a/pkg/newlog/testdata/perf/fssaggver_average_secure_non_secure_time.png b/pkg/newlog/testdata/perf/fssaggver_average_secure_non_secure_time.png new file mode 100644 index 0000000000000000000000000000000000000000..bd5caa1c1d3232f1efbf84d6fbafef8ac6e10ec7 GIT binary patch literal 44903 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

;ZdRRD+DIi@p+664U3J%tIPlhrw9}FKp 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

1YQSk8GkN{y-HJ%6YAgm)&eWR_uok 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

U9fH;>0a|kjMhJgx<9B4RNdwXjCgqu9 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 HN@xNABwJk6 literal 0 HcmV?d00001 diff --git a/pkg/newlog/testdata/perf/fssaggver_cached_keys_10000_average_secure_non_secure_time.png b/pkg/newlog/testdata/perf/fssaggver_cached_keys_10000_average_secure_non_secure_time.png new file mode 100644 index 0000000000000000000000000000000000000000..c20fb77d315c25879918ae8dc0b3db4c03ca188b GIT binary patch literal 48746 zcmb5W2RN4D-#>gKqsYoiwnDNhGh0?NGLn^9k&>CcN7<5u%#`c@0&6?-nFy8Z~f>pj|k5tE+z{H2OIk< zyu4Qb^#UGiJ9A!URh&M!$Z;D*U3(0M#034u%8*RIkHM7pT$7d7a!yzna&nI99>8C* z){b&W;~u(^vcP=?3oE)4o5jtV)F4pUhL8e3#hc)eRQ(+V8Ls-Xo3bz0K5sMN`WNPR zh<|_g&E<&TxJo?FtLKHgo}Vt|C zTVLrJSy}CiaDz>aZnN2kz zFoc@7ztoL*q9N?eGsUy;t2f8wYSQ}UdoA9wEY;<1+Y23{Ogucq*_DS^esyQ!7wDZd zGBV14G(@{xvCpHSsk!(){d>OMl+yb0n-u-cU)_sCH#2z*%K|T&HKf4D?Huke=Q_-N z*RX1L@R)WA2?{#jy~QZk=4DSFbWGztg`uJ0>~Og#F@u=J@)DUkE>jVjilz@MD>ho$ zhV)NK7#q4XZ>eW$bGtdcZ9Q5uW?+ z&7O$O^(AIXf zWM%Iv-nn!3@b|XS!@*)Q-ijTTn%dfn9(x;&{rG;>-XA}5WoUh9?0;kuPAB5atzS5r z*Dg_u&**M!yA*F-A#G}!>TyLoFh8HaxVRXWLt5(nu6M#NYiB+87lk(Fd)kMGurOTu zg+xVN|ib`~SDam{+Uyu8T*IuEzx| ze^dpMv97(~eQ;E0W@d)fE6As+ruH;1&)(-Q9uW=3+S)q4U{{#mdU$Z$ssHs=e23*> z`Vr54Zg|#*jY(wcE{*4xVDb4seOlYqbxPcAtIit>hm?Wgkwkje-00L)K(1Niw2Psg z-6btf%3;ratM%NL7G>pR3Hk!dZeNY}vNvv!4!g|I-??{BPpsz!^=Sr%@FyqF$h_Aw z-QQZoc$e7Eq~0!d%+PvI{=-s0FWt(Whum-VEmNJu`E#z)j?N$17I@~1EY((tixpC=d@ z8Owfe4Zy+-D71w~|9a<=*zRPMOIt~4>CACe68bCt9UV6;_-TbjMc-(qtM0%Eu8D28 zC5qBWdWvD=;Jnu2B%`AXjWO~(t*fhxVW`+HiF=nkQfyo6{?T>wm-AA|OpaM2asISV)+;UZxNk9UTB$!3S)4TdrW`;J6aRh8z71IH(W5?@w@ za14gx1n%C}Vu(t-V4NRz6nta8eEHPXCq!7r2WG3gGs%sECH9?}w|Keq@(Ez~SKl)7 z2&neMpSka}y)@)J5hldvykd;X%(THx&5G@oxXb8WS9xO0Myq^w*4rhylO*r8(4e=A zyKYn^h}frSXLjb9w~H+fmb+1_N$j45tsekAAuc^XoKcd2kcx|ArTo2i)~j9drnWYo zoQLWIo%5S$`bep$o=|b?84s7aIKwAKzIfpe7ozHw_xzlfM@CML4fVbyQIz`k{x&`a zt?Sq;k2(8`tRtW$(4rOV>?|xJBa_lKcjDt^78dNDY@^2BT(ew@P8OommyXT<%(@!E zApQ}r!4L1GjFQp`XbJ(+et0HRP0<8|gn1n6HH5sz)xNm1KeNu}FUxyN(g&k@mIp@0%pj~eMa zm3S6$ar(q7k855DJm9nZ!NFxvOu9Hw)VRM~86h;{z8=|sJ{+dB)|k(DYoX7g>)lC- z-y51-Iyo4)h8#TnMe{bgA0KWK!qW+EEe@D_8rs5Y*Ml+wONX#Zc)d�d|2!3!jyJTOcO5-v7#SnrA9V-q z3`5{~cgCJFu55IvnYAT|psS6KkCT#<`$n;=>HQG!JaAs8zF-p2BXWP6O2+}#s};^N|rbGsOu&0jZ(X!y_*)t9-f zkIu~nK`|SJ#T{Y5P8NODH!zTkPTW-sLkc)ahJcv}&o4tGEf_7c*1L`iz08=v)_5U( zu_D-msnC$78zm2S-aJ!EGd()|O*QqBOP2)`=ykZ;=uYGf|2hsAcG-K8l=Ns-_`-$j zu-NP896#+e>7Ycmkygkx5B*y!!+HVY+WGE?7suEiHliEW;ax}a07jZi}5qB(E+%d(I`Q4wTRQ&c3i zEa*>N8h0PoiQ0E1lL_qY)ft(9TdF;}1Zm*md*6Ztr`|beIB* z&Q$FEhkHWQR8(xR>}8deLwhT|DlNJ{L}QpdVZg<*d5e5M)h8sg=H})C+6XQhcFnAU z0$*Q4=D?C_0Qd}j62oq!;#nFoXFh<1=1Kjq>e_1t2F?J+%G-50e*8Fq{~Vh4ds8t+ zH!3|neq`QiH+7hW+JfsXrpYe~^$71I?c|(hTS70~`q^{m05B2@dma?;7T-`3~&jG1z6vo_oik19E=2 znfU~YOuRxxa910wq|wF2#PsZUTMXTRYag!eK->0_eV14E;<~|MYG$_DbRkF}Y+vUshoXFpOZW4! z+9xOdva@+5b|+7*hx$R`8E=ZdKqL5&2B5h0VdC4gwAc1CZM{X-j6`@i@JrCD-yhKY z>$}Y_UHaXA%%2q&reS7grfP&Kqjs3>z)DI=qUyO8!*e^OXP#R=>v}CfcH=``wkY%# zQW@ieoz>|Hpg9?6(JZGHCkx5tKIq}ObN8-E(~I-Zlo${DgiUIW0oa%+x%WaTt$QQc z_hD}i7St&!wDe=!o9|p&e}#+Zhqb!8`n9c1zWF6L_u-HgyoNle?w2cbNp=L!?JtPp zOgE~$;`b>nb&LFDg+aZ=-Q6AGJT#urMq-7m8301x_}G)A2`#Wia|+AsgY?qKMY5aj z24}+qIq=I3BOcHH9E&qglD>22?XGjYpcS9>u-L(7j}dB$lXfC|+shFJ4|-StMJT0_ zpAmZGubQ4m(2)&zgOHjBKvbip+dH{9WnVwPtd|3y?-HV3lOX2uoh62UhA~mdde~o! zvsF`JsXKOJeEeB#Y+%~;m}$|QB2JZdnw-%)E43u6&?H!{T%m=&@u$OW&i7n>eZ#o* zl|a4aOn<=xG?FT}@?SPjp%Px7d*Rk6rt{~IS5#EsZm~2mM?+t5w^$`>pOQ4PC%gMX?MhWkmT+ksDRa3zvNzwI z`4k7AScmTN)XKEyNs;wUxLYo}@3(K?ZoOcKf9zN+b?XUmUDComkD;ehenE$by%aKavY4v|Mg{d!CD@^3n&(ln-Y z6;L`EXS(;H%pLA*!77=-k`p`NXpbefaY;Sr|M=poR;+vV;CeV9VHYrjP*)s-%aaC_$nL$>4nH0*){Rz zTs+NhL5g^)a^e+Az^?(BnHOMR%3Qsg#lyfB_3h(N*5I6H18?}kQX@`Z#;ZI!ELHh+ zK{-=9i_143THcKAvl}dtDXNKAGBnePUAGp3Utrga4FdvodN6+jS@ z)5SG^zq{WqGQgk68xAz(&Ye54j5EXcxQb{6EUSQ{cXoDSjFZG+a~h6529X5E$!S}L z`echs;^ZLD$KsxAmX;q>jy%MO3wO%CanA@utvkg7t@`@)YvUTj@4fkK*j#vmj|MGP zzu2kW&4#By+Y(3>OIYf__os}Wfxze(7(F&3MTWjo^{|kMFigX!i$9Bu^g+nIWG1N= zG=jB37!CgyFDMRH8yPVe=)hPwc*a2gcHr-kiHV8kX_G(~#(2Nb}zQMxje!M(~?8GP*-11*_#ZdVHDc7OE^2={n2W_ zm5mMmhzPaZ{yBisOGBkktt)of)I_>w)j^72iu$%Tc|>L2J_a8uo!v7Lr6%#so<~%) zv`TzX<&A!cLf#4e%?c*i;rJN9{2limzmo4%OA@#aEpf zjjCdAnM+xfk5rUs(=_V+@|2Y6_YO3A1ccBDtMp5x=vu^JqP_ zQ5`JcmJ7`T<9cUV8fy{q!9U!YAc40}o_@^lvi6OAY+}L>mXSS^1W;2%JON`Xz@AYD zyc04LN+&`--;>>ldOj3`Gr)wN8fG`vhft$xvwql&I|o1kV08q@4Mb-Ii2!XO-2D`= z<=Dnt*R&l-8B&1ybB(L92P?f85ry4a8VUiRiIbD?NW^XH;lc0i5yYbq^@AZ`l8|6% zj9_g1bi4FKf~xzkALr3^VO|tqh>_w1a)@#Fhns=H!8N|Pge_h-s0$JS=9)llbzW~3 zvfWuRK~UoU{rkNI52y`YrYJX-hR%Qt11+cyuryPo;tkmB5Bol+>9`aisu#jr5vZGY zZ*1~g6l%=C@)6@lLJWvek1ImNKvj7IYy?O$FYw_TC3bfg21~k3vwX)bfuKDhrVoY@ zVTHB{AiNgd6K($Us%@NIr@ggw+6@jqV1%LcqEzUkI$mG3-CnxA{?gOBY*jv}zjY4S zpe#^rq$>bjN7GErV^Fm=)%;rHeapVt^)!tGC{RdD1sN(3=Cu#X}b~I)HA60*iWX**=Wl&;QpWyl#wZZk4%d!0THG=l_p1~c^gV0g6 z(3h9{Xy{73L5S?6H^csyRnT2QOfL5a>;$vD`x3I{S(^j>>NC{4yAjj0DCwp3M zih#sr3M4tzr1lALffH(KYG`|s0eJuz-ZF&=1fizek{+<&DS%^CN@*GZ_0^#9*8HN9 zfJ={e-!h^EP*Bs|eG^u-g25MuYnYtg)N2IHOT*YV@YxG3Vr>}g}yG!BTWsBI^gZRfI!bB zBqaD36%|?Zd`bjm=+oDxCd5?5ngkz|cp2^fMpDsP*e({fA2X7LeoppOkTzI#1D|0> zQ?$N*insFMGtzPMCFSn(R>t4IF6URxgtQ~|EIk2qPkHxR>t1r}*Ufgmk%RWZ^{b_= zjS4D48W;^pHg+w??tc;P7=xfqP)Bb#ijLcErTJ(#fH}n=@ z>S6jdeLPrFgXLI`-AZC&`S4XWNh}B`h6zGEFt+8TSCP52YfO9vyprekxja$0gj7<{ zFQDo;&i-+uC@Jm1jN*I-?gBP+h}z5TVmKuR;Z_5MCeV>$g>A>p`b_`0RSfj$#iz(_ zGQryrYS>+$iG1}c7(an69WkXyQtb2R&l3<4`D^JNtlHqsrg3m`24}MUHP1w1VL_4H{GfGyYn>(~ zh6Ub@X)p>eEiG-G@0oMxEwN_@R)Gi5Xnik;fihc#GsO9}hHl;b^CnKicrB{vr}LLY zL{0-Vp4Q1JMpx*{cLXS-LD&J{VGPjCJ>DC3%4LG@xyBz~yGxdRoio$fN<&vG=~J_U zitRLu?f=29`}?@5EZ^rh!Ef4Hl7HVd=kTm~s>8AXq{XczVlwZ~wzoMcPJF%dStB#~ z??96fEf`&c+llY>Qa`^1)uG1yE;2pjf_-k?fvruGf3Z!4)*j= zx3#rVN>~Wc5GkstAk_U<<6gZ+pYig%27wQhfVzeTYz#Iw_QPSkzwTlx_Uxvsy^Y~} zjdN~JGr4>;M6k$xK|=FZy(_O<%+qZtfMF68qynNQn7q{HW%cKAarveaL`6jhO4wz! zsA44umCVFX{4*})Zgi#>oKo+6F>Q|ZzYR=vk#muXIrqERO7lIA4n21E_Qt_F6nt+D z;uaDip`Zd0i1=rXisQNZRaHOOUfusDD(t){v4OX$(=YD4!UXUQ3jD54e_j!&5J-iE z@(Wo=e590Skmwn{dv*+4O!u?SZY-Mv>6sH<-2W5?+*FGkq_t7K_VC{=rOGQ ze770aYd}?1mBxeX1X$&UBqf6qCJnF;$Y^PUL612JK+0b)s{zPhj!7*Z40P$nam?q> zpGPMrwLZ=eF^JK;e*Jp7@%P^5)i?5CeD>4I>ldL|#b>h^YR%2f=@dRZ4WQVh%e67| zv|j)rHQHE$Sw&@|1bXRlxif~3fDV{@h*yI(zV4BXWegk~tU+hMwyll9Yr}}twTrD24Gs&N!^{p;g1>ZruGYAhhxU0yZeN!2+#G+R~EKbz|12@^FukT{S_< z!h!>=xBvidamkm#ijb9)GXd8URtpZa|6mYULtJ4-kka~apztI#g{y!CJ4@`%>lz#N zJ<1Oc4+F!)8!CX7d#C}NegZoR#D2zfwd4lCi=lvrjlaLWM&+>&x^@nNUvMAD>NB`~ zJ7nk6ncL;Alt8$upb*%uO@32w6_2n4ZoV`7Cc@@m#};}%LgoNFh${~F9xRMhG6E;A zM>KW{CjO#TKfn7{pE+%iE^A?p7#h65`z!f51+iOuatK)JD{RPcp9|&m_Y+%<}dA7kNY=D+Pkq7vR zjhSvsL>}T8g4Q6Xua^zO3lQxCpl}K{#421e6^J8^fF;G?5P1K9Mry#1zIeBZ0wV>t zi?Fi8uOG*eQxDQx0BjXju;^}oakyByG~NWM5GbL*?AE_#�G!QA}|BI2NYtaBm*j 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 S-^GcCB>jF!JA2=;3;zUAiB#VJ literal 0 HcmV?d00001 diff --git a/pkg/newlog/testdata/perf/fssaggver_cached_keys_10000_overhead_and_cost.png b/pkg/newlog/testdata/perf/fssaggver_cached_keys_10000_overhead_and_cost.png new file mode 100644 index 0000000000000000000000000000000000000000..a2e21807e982b1975b6c4a5426c676e711b4aeef GIT binary patch literal 51872 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

suqU=?XA|vmZofCC|Nn?Qhzx^il(c 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 X5t~-4azLRtN;j{k*(8zzX literal 0 HcmV?d00001 diff --git a/pkg/newlog/testdata/perf/fssaggver_cached_keys_10000_timing_results.csv b/pkg/newlog/testdata/perf/fssaggver_cached_keys_10000_timing_results.csv new file mode 100644 index 0000000000..ed41e5794a --- /dev/null +++ b/pkg/newlog/testdata/perf/fssaggver_cached_keys_10000_timing_results.csv @@ -0,0 +1,9 @@ +Test Run,Average Secure Time (us),Average Non-Secure Time (us),Performance Cost (us),Performance Overhead (%) +10,2561,1908,653,34.22 +20,3960,2892,1068,36.93 +30,5488,3892,1596,41.01 +40,7053,4765,2288,48.02 +50,10219,6904,3315,48.02 +100,8483,5542,2941,53.07 +200,8512,5603,2909,51.92 +500,7414,4856,2558,52.68 diff --git a/pkg/newlog/testdata/perf/fssaggver_overhead_and_cost.png b/pkg/newlog/testdata/perf/fssaggver_overhead_and_cost.png new file mode 100644 index 0000000000000000000000000000000000000000..8212c3ee854355b3229bfd4b2e9de5c074c3d940 GIT binary patch literal 60674 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 Date: Wed, 27 Nov 2024 11:10:14 +0200 Subject: [PATCH 2/2] evetpm : update seal/unseal functions signature Update the Seal/Unseal disk key functions to be generic and accept TPM NV indexes as parameters. These functions are not bound to just store and retrive disk keys, and this modification makes it obvious. Signed-off-by: Shahriyar Jalayeri --- pkg/pillar/cmd/vaultmgr/vaultmgr.go | 2 +- pkg/pillar/evetpm/tpm.go | 113 +++++++++++++++------------- pkg/pillar/evetpm/tpm_test.go | 16 ++-- 3 files changed, 69 insertions(+), 62 deletions(-) diff --git a/pkg/pillar/cmd/vaultmgr/vaultmgr.go b/pkg/pillar/cmd/vaultmgr/vaultmgr.go index 12c1126572..031feba135 100644 --- a/pkg/pillar/cmd/vaultmgr/vaultmgr.go +++ b/pkg/pillar/cmd/vaultmgr/vaultmgr.go @@ -435,7 +435,7 @@ func handleVaultKeyFromControllerImpl(ctxArg interface{}, key string, } // Try unlocking the vault now, in case it is not yet unlocked log.Noticef("Vault is still locked, trying to unlock") - err = etpm.SealDiskKey(log, decryptedKey, etpm.DiskKeySealingPCRs) + err = etpm.TpmSealData(log, decryptedKey, etpm.DiskKeySealingPCRs, etpm.TpmSealedDiskPrivHdl, etpm.TpmSealedDiskPubHdl, true) if err != nil { log.Errorf("Failed to Seal key in TPM %v", err) return diff --git a/pkg/pillar/evetpm/tpm.go b/pkg/pillar/evetpm/tpm.go index 9e70602b7c..1410bce26d 100644 --- a/pkg/pillar/evetpm/tpm.go +++ b/pkg/pillar/evetpm/tpm.go @@ -643,8 +643,8 @@ func FetchSealedVaultKey(log *base.LogObject) ([]byte, error) { } //gain some knowledge about existing environment - sealedKeyPresent := isSealedKeyPresent() - legacyKeyPresent := isLegacyKeyPresent() + sealedKeyPresent := isSealedDiskKeyPresent() + legacyKeyPresent := isLegacyDiskKeyPresent() if !sealedKeyPresent && !legacyKeyPresent { log.Noticef("neither legacy nor sealed disk key present, generating a fresh key") @@ -669,7 +669,7 @@ func FetchSealedVaultKey(log *base.LogObject) ([]byte, error) { if err != nil { return nil, fmt.Errorf("GetRandom failed: %w", err) } - err = SealDiskKey(log, key, DiskKeySealingPCRs) + err = TpmSealData(log, key, DiskKeySealingPCRs, TpmSealedDiskPrivHdl, TpmSealedDiskPubHdl, true) if err != nil { return nil, fmt.Errorf("sealing the fresh disk key failed: %w", err) } @@ -696,7 +696,7 @@ func FetchSealedVaultKey(log *base.LogObject) ([]byte, error) { log.Noticef("try to convert the legacy key into a sealed key") - err = SealDiskKey(log, key, DiskKeySealingPCRs) + err = TpmSealData(log, key, DiskKeySealingPCRs, TpmSealedDiskPrivHdl, TpmSealedDiskPubHdl, true) if err != nil { return nil, fmt.Errorf("sealing the legacy disk key into TPM failed: %w", err) } @@ -707,7 +707,7 @@ func FetchSealedVaultKey(log *base.LogObject) ([]byte, error) { log.Noticef("sealed disk key present int TPM, about to unseal it") } //By this, we have a key sealed into TPM - key, err := UnsealDiskKey(DiskKeySealingPCRs) + key, err := TpmUnsealData(DiskKeySealingPCRs, TpmSealedDiskPrivHdl, TpmSealedDiskPubHdl, true) if err == nil { // be more verbose, lets celebrate log.Noticef("successfully unsealed the disk key from TPM") @@ -716,8 +716,8 @@ func FetchSealedVaultKey(log *base.LogObject) ([]byte, error) { return key, err } -// SealDiskKey seals key into TPM2.0, with provided PCRs -func SealDiskKey(log *base.LogObject, key []byte, pcrSel tpm2.PCRSelection) error { +// TpmSealData seals private date (a key) into TPM2.0, with provided PCRs +func TpmSealData(log *base.LogObject, key []byte, pcrSel tpm2.PCRSelection, privHdl, pubHdl tpmutil.Handle, saveTpmLogs bool) error { rw, err := tpm2.OpenTPM(TpmDevicePath) if err != nil { return err @@ -725,10 +725,10 @@ func SealDiskKey(log *base.LogObject, key []byte, pcrSel tpm2.PCRSelection) erro defer rw.Close() tpm2.NVUndefineSpace(rw, EmptyPassword, - tpm2.HandleOwner, TpmSealedDiskPubHdl) + tpm2.HandleOwner, pubHdl) tpm2.NVUndefineSpace(rw, EmptyPassword, - tpm2.HandleOwner, TpmSealedDiskPrivHdl) + tpm2.HandleOwner, privHdl) //Note on any abrupt power failure at this point, and the result of it //We should be ok, since the key supplied here can be @@ -759,68 +759,70 @@ func SealDiskKey(log *base.LogObject, key []byte, pcrSel tpm2.PCRSelection) erro // Define space in NV storage and clean up afterwards or subsequent runs will fail. if err := tpm2.NVDefineSpace(rw, tpm2.HandleOwner, - TpmSealedDiskPrivHdl, + privHdl, EmptyPassword, EmptyPassword, nil, tpm2.AttrOwnerWrite|tpm2.AttrOwnerRead, uint16(len(priv)), ); err != nil { - return fmt.Errorf("NVDefineSpace %v failed: %w", TpmSealedDiskPrivHdl, err) + return fmt.Errorf("NVDefineSpace %v failed: %w", privHdl, err) } // Write the private data - if err := tpm2.NVWrite(rw, tpm2.HandleOwner, TpmSealedDiskPrivHdl, + if err := tpm2.NVWrite(rw, tpm2.HandleOwner, privHdl, EmptyPassword, priv, 0); err != nil { - return fmt.Errorf("NVWrite %v failed: %w", TpmSealedDiskPrivHdl, err) + return fmt.Errorf("NVWrite %v failed: %w", privHdl, err) } // Define space in NV storage if err := tpm2.NVDefineSpace(rw, tpm2.HandleOwner, - TpmSealedDiskPubHdl, + pubHdl, EmptyPassword, EmptyPassword, nil, tpm2.AttrOwnerWrite|tpm2.AttrOwnerRead, uint16(len(public)), ); err != nil { - return fmt.Errorf("NVDefineSpace %v failed: %w", TpmSealedDiskPubHdl, err) + return fmt.Errorf("NVDefineSpace %v failed: %w", pubHdl, err) } // Write the public data - if err := tpm2.NVWrite(rw, tpm2.HandleOwner, TpmSealedDiskPubHdl, + if err := tpm2.NVWrite(rw, tpm2.HandleOwner, pubHdl, EmptyPassword, public, 0); err != nil { - return fmt.Errorf("NVWrite %v failed: %w", TpmSealedDiskPubHdl, err) + return fmt.Errorf("NVWrite %v failed: %w", pubHdl, err) } - // save a snapshot of current PCR values - if err := saveDiskKeySealingPCRs(); err != nil { - log.Warnf("saving snapshot of sealing PCRs failed: %s", err) - } + if saveTpmLogs { + // save a snapshot of current PCR values + if err := saveDiskKeySealingPCRs(); err != nil { + log.Warnf("saving snapshot of sealing PCRs failed: %s", err) + } - // In order to not lose the ability to diff and diagnose the issue, - // first backup the previous pair of logs (if any). This is needed because - // once the failing devices get connected to the controller to fetch the - // backup key, we end up here again and it'll override the MeasurementLogSealSuccess - // file content with current tpm measurement logs (which is same as the - // content of MeasurementLogSealFail). - if err := backupCopiedMeasurementLogs(); err != nil { - log.Warnf("copying previous snapshot of TPM event log failed: %s", err) - } + // In order to not lose the ability to diff and diagnose the issue, + // first backup the previous pair of logs (if any). This is needed because + // once the failing devices get connected to the controller to fetch the + // backup key, we end up here again and it'll override the MeasurementLogSealSuccess + // file content with current tpm measurement logs (which is same as the + // content of MeasurementLogSealFail). + if err := backupCopiedMeasurementLogs(); err != nil { + log.Warnf("copying previous snapshot of TPM event log failed: %s", err) + } - // fresh start, remove old copies of measurement logs. - removeCopiedMeasurementLogs() + // fresh start, remove old copies of measurement logs. + removeCopiedMeasurementLogs() - // save a copy of the current measurement log, this is also called - // if unseal fails to have copy when we fail to unlock the vault. - if err := copyMeasurementLog(measurementLogSealSuccess); err != nil { - log.Warnf("copying current TPM measurement log failed: %s", err) + // save a copy of the current measurement log, this is also called + // if unseal fails to have copy when we fail to unlock the vault. + if err := copyMeasurementLog(measurementLogSealSuccess); err != nil { + log.Warnf("copying current TPM measurement log failed: %s", err) + } } return nil } -func isSealedKeyPresent() bool { +func isSealedDiskKeyPresent() bool { rw, err := tpm2.OpenTPM(TpmDevicePath) if err != nil { return false @@ -832,13 +834,13 @@ func isSealedKeyPresent() bool { return err == nil } -func isLegacyKeyPresent() bool { +func isLegacyDiskKeyPresent() bool { _, err := readDiskKey() return err == nil } -// UnsealDiskKey unseals key from TPM2.0 -func UnsealDiskKey(pcrSel tpm2.PCRSelection) ([]byte, error) { +// TpmUnsealData unseals private data (a key) from TPM2.0 +func TpmUnsealData(pcrSel tpm2.PCRSelection, privHdl, pubHdl tpmutil.Handle, saveTpmLogs bool) ([]byte, error) { rw, err := tpm2.OpenTPM(TpmDevicePath) if err != nil { return nil, err @@ -846,16 +848,16 @@ func UnsealDiskKey(pcrSel tpm2.PCRSelection) ([]byte, error) { defer rw.Close() // Read all of the data with NVReadEx - priv, err := tpm2.NVReadEx(rw, TpmSealedDiskPrivHdl, + priv, err := tpm2.NVReadEx(rw, privHdl, tpm2.HandleOwner, EmptyPassword, 0) if err != nil { - return nil, fmt.Errorf("NVReadEx %v failed: %w", TpmSealedDiskPrivHdl, err) + return nil, fmt.Errorf("NVReadEx %v failed: %w", privHdl, err) } // Read all of the data with NVReadEx - pub, err := tpm2.NVReadEx(rw, TpmSealedDiskPubHdl, + pub, err := tpm2.NVReadEx(rw, pubHdl, tpm2.HandleOwner, EmptyPassword, 0) if err != nil { - return nil, fmt.Errorf("NVReadEx %v failed: %w", TpmSealedDiskPubHdl, err) + return nil, fmt.Errorf("NVReadEx %v failed: %w", pubHdl, err) } sealedObjHandle, _, err := tpm2.Load(rw, TpmSRKHdl, "", pub, priv) @@ -872,13 +874,18 @@ func UnsealDiskKey(pcrSel tpm2.PCRSelection) ([]byte, error) { key, err := tpm2.UnsealWithSession(rw, session, sealedObjHandle, EmptyPassword) if err != nil { - // We get here mostly because of RCPolicyFail error, so first try to save - // a copy of TPM measurement log, it comes handy for diagnosing the issue. - evtLogStat := "copied (failed unseal) TPM measurement log" - if errEvtLog := copyMeasurementLog(measurementLogUnsealFail); errEvtLog != nil { - // just report the failure, still give findMismatchingPCRs a chance so - // we can at least have some partial information about why unseal failed. - evtLogStat = fmt.Sprintf("copying (failed unseal) TPM measurement log failed: %v", errEvtLog) + var evtLogStat string + if !saveTpmLogs { + evtLogStat = "TPM measurement log not copied (saveTpmLogs=false)" + } else { + // We get here mostly because of RCPolicyFail error, so first try to save + // a copy of TPM measurement log, it comes handy for diagnosing the issue. + evtLogStat = "copied (failed unseal) TPM measurement log" + if errEvtLog := copyMeasurementLog(measurementLogUnsealFail); errEvtLog != nil { + // just report the failure, still give findMismatchingPCRs a chance so + // we can at least have some partial information about why unseal failed. + evtLogStat = fmt.Sprintf("copying (failed unseal) TPM measurement log failed: %v", errEvtLog) + } } // try to find out the mismatching PCR index @@ -926,7 +933,7 @@ func PolicyPCRSession(rw io.ReadWriteCloser, pcrSel tpm2.PCRSelection) (tpmutil. // CompareLegacyandSealedKey compares legacy and sealed keys // to record if we are using a new key for sealed vault func CompareLegacyandSealedKey() SealedKeyType { - if !isSealedKeyPresent() { + if !isSealedDiskKeyPresent() { return SealedKeyTypeUnprotected } legacyKey, err := readDiskKey() @@ -934,7 +941,7 @@ func CompareLegacyandSealedKey() SealedKeyType { //no cloning case, return SealedKeyTypeNew return SealedKeyTypeNew } - unsealedKey, err := UnsealDiskKey(DiskKeySealingPCRs) + unsealedKey, err := TpmUnsealData(DiskKeySealingPCRs, TpmSealedDiskPrivHdl, TpmSealedDiskPubHdl, true) if err != nil { //key is present but can't unseal it //but legacy key is present diff --git a/pkg/pillar/evetpm/tpm_test.go b/pkg/pillar/evetpm/tpm_test.go index e6e7bcebbc..4b8d2ea5ec 100644 --- a/pkg/pillar/evetpm/tpm_test.go +++ b/pkg/pillar/evetpm/tpm_test.go @@ -50,7 +50,7 @@ func TestMain(m *testing.M) { func waitForTpmReadyState() error { for i := 0; i < 10; i++ { - if err := SealDiskKey(log, []byte("secret"), DiskKeySealingPCRs); err != nil { + if err := TpmSealData(log, []byte("secret"), DiskKeySealingPCRs, TpmSealedDiskPrivHdl, TpmSealedDiskPubHdl, true); err != nil { // this is RCRetry, so retry if strings.Contains(err.Error(), "code 0x22") { time.Sleep(100 * time.Millisecond) @@ -73,11 +73,11 @@ func TestSealUnseal(t *testing.T) { } dataToSeal := []byte("secret") - if err := SealDiskKey(log, dataToSeal, DiskKeySealingPCRs); err != nil { + if err := TpmSealData(log, dataToSeal, DiskKeySealingPCRs, TpmSealedDiskPrivHdl, TpmSealedDiskPubHdl, true); err != nil { t.Fatalf("Seal operation failed with err: %v", err) } - unsealedData, err := UnsealDiskKey(DiskKeySealingPCRs) + unsealedData, err := TpmUnsealData(DiskKeySealingPCRs, TpmSealedDiskPrivHdl, TpmSealedDiskPubHdl, true) if err != nil { t.Fatalf("Unseal operation failed with err: %v", err) } @@ -99,7 +99,7 @@ func TestSealUnsealMismatchReport(t *testing.T) { defer rw.Close() dataToSeal := []byte("secret") - if err := SealDiskKey(log, dataToSeal, DiskKeySealingPCRs); err != nil { + if err := TpmSealData(log, dataToSeal, DiskKeySealingPCRs, TpmSealedDiskPrivHdl, TpmSealedDiskPubHdl, true); err != nil { t.Fatalf("Seal operation failed with err: %v", err) } @@ -111,7 +111,7 @@ func TestSealUnsealMismatchReport(t *testing.T) { } } - _, err = UnsealDiskKey(DiskKeySealingPCRs) + _, err = TpmUnsealData(DiskKeySealingPCRs, TpmSealedDiskPrivHdl, TpmSealedDiskPubHdl, true) if err == nil { t.Fatalf("Expected error from UnsealDiskKey, got nil") } @@ -135,7 +135,7 @@ func TestSealUnsealTpmEventLogCollect(t *testing.T) { // this should write tpm event log to measurementLogSealSuccess file dataToSeal := []byte("secret") - if err := SealDiskKey(log, dataToSeal, DiskKeySealingPCRs); err != nil { + if err := TpmSealData(log, dataToSeal, DiskKeySealingPCRs, TpmSealedDiskPrivHdl, TpmSealedDiskPubHdl, true); err != nil { t.Fatalf("Seal operation failed with err: %v", err) } @@ -146,7 +146,7 @@ func TestSealUnsealTpmEventLogCollect(t *testing.T) { } // this should fail and result in saving creating measurementLogUnsealFail - _, err = UnsealDiskKey(DiskKeySealingPCRs) + _, err = TpmUnsealData(DiskKeySealingPCRs, TpmSealedDiskPrivHdl, TpmSealedDiskPubHdl, true) if err == nil { t.Fatalf("Expected error from UnsealDiskKey, got nil") } @@ -159,7 +159,7 @@ func TestSealUnsealTpmEventLogCollect(t *testing.T) { } // this should trigger backing up previously saved tpm event logs - if err := SealDiskKey(log, dataToSeal, DiskKeySealingPCRs); err != nil { + if err := TpmSealData(log, dataToSeal, DiskKeySealingPCRs, TpmSealedDiskPrivHdl, TpmSealedDiskPubHdl, true); err != nil { t.Fatalf("Seal operation failed with err: %v", err) }