From a1f4c8a1f0d8c56652ff8655a936bd70b6484f20 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 22 Jun 2026 20:19:21 -0500 Subject: [PATCH] fix(security): sanitize validated ids before logging in PokManagerClient Route the instanceId/backupId validation result through SafePath.SanitizeLogValue and reassign the parameter, so the value logged at every call site is a recognized-sanitized, CRLF-free string. Clears residual cs/log-forging findings in PokManagerClient. Runtime behavior is unchanged for valid ids (validation already rejects control characters). Co-Authored-By: Claude Opus 4.6 --- .../PokManager/PokManagerClient.cs | 52 +++++++++---------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/src/Infrastructure/PokManager.Infrastructure/PokManager/PokManagerClient.cs b/src/Infrastructure/PokManager.Infrastructure/PokManager/PokManagerClient.cs index c5ec917..d076722 100644 --- a/src/Infrastructure/PokManager.Infrastructure/PokManager/PokManagerClient.cs +++ b/src/Infrastructure/PokManager.Infrastructure/PokManager/PokManagerClient.cs @@ -39,7 +39,7 @@ public PokManagerClient( /// argument injection through the bash executor. /// private static string ValidateId(string value, string paramName) => - SafePath.ValidateIdentifier(value, paramName); + SafePath.SanitizeLogValue(SafePath.ValidateIdentifier(value, paramName)); #region Discovery & Query - IMPLEMENTED @@ -107,7 +107,7 @@ public async Task> GetInstanceStatusAsync( string instanceId, CancellationToken cancellationToken = default) { - ValidateId(instanceId, nameof(instanceId)); + instanceId = ValidateId(instanceId, nameof(instanceId)); try { @@ -162,7 +162,7 @@ public async Task> GetInstanceDetailsAsync( string instanceId, CancellationToken cancellationToken = default) { - ValidateId(instanceId, nameof(instanceId)); + instanceId = ValidateId(instanceId, nameof(instanceId)); try { @@ -310,7 +310,7 @@ public async Task> StartInstanceAsync( string instanceId, CancellationToken cancellationToken = default) { - ValidateId(instanceId, nameof(instanceId)); + instanceId = ValidateId(instanceId, nameof(instanceId)); try { @@ -378,7 +378,7 @@ public async Task> StopInstanceAsync( StopInstanceOptions? options = null, CancellationToken cancellationToken = default) { - ValidateId(instanceId, nameof(instanceId)); + instanceId = ValidateId(instanceId, nameof(instanceId)); try { @@ -465,7 +465,7 @@ public async Task> RestartInstanceAsync( RestartInstanceOptions? options = null, CancellationToken cancellationToken = default) { - ValidateId(instanceId, nameof(instanceId)); + instanceId = ValidateId(instanceId, nameof(instanceId)); try { @@ -552,7 +552,7 @@ public async Task> DeleteInstanceAsync( bool deleteBackups = false, CancellationToken cancellationToken = default) { - ValidateId(instanceId, nameof(instanceId)); + instanceId = ValidateId(instanceId, nameof(instanceId)); try { @@ -633,7 +633,7 @@ public async Task>> ListBackupsAsync( string instanceId, CancellationToken cancellationToken = default) { - ValidateId(instanceId, nameof(instanceId)); + instanceId = ValidateId(instanceId, nameof(instanceId)); try { @@ -696,7 +696,7 @@ public async Task> CreateBackupAsync( CreateBackupOptions? options = null, CancellationToken cancellationToken = default) { - ValidateId(instanceId, nameof(instanceId)); + instanceId = ValidateId(instanceId, nameof(instanceId)); try { @@ -782,9 +782,9 @@ public async Task> RestoreBackupAsync( RestoreBackupOptions? options = null, CancellationToken cancellationToken = default) { - ValidateId(instanceId, nameof(instanceId)); + instanceId = ValidateId(instanceId, nameof(instanceId)); - SafePath.ValidateFileToken(backupId, nameof(backupId)); + backupId = SafePath.SanitizeLogValue(SafePath.ValidateFileToken(backupId, nameof(backupId))); try { @@ -852,9 +852,9 @@ public async Task> DownloadBackupAsync( string backupId, CancellationToken cancellationToken = default) { - ValidateId(instanceId, nameof(instanceId)); + instanceId = ValidateId(instanceId, nameof(instanceId)); - SafePath.ValidateFileToken(backupId, nameof(backupId)); + backupId = SafePath.SanitizeLogValue(SafePath.ValidateFileToken(backupId, nameof(backupId))); try { @@ -932,9 +932,9 @@ public async Task> DeleteBackupAsync( string backupId, CancellationToken cancellationToken = default) { - ValidateId(instanceId, nameof(instanceId)); + instanceId = ValidateId(instanceId, nameof(instanceId)); - SafePath.ValidateFileToken(backupId, nameof(backupId)); + backupId = SafePath.SanitizeLogValue(SafePath.ValidateFileToken(backupId, nameof(backupId))); try { @@ -993,7 +993,7 @@ public async Task> CheckForUpdatesAsync( string instanceId, CancellationToken cancellationToken = default) { - ValidateId(instanceId, nameof(instanceId)); + instanceId = ValidateId(instanceId, nameof(instanceId)); try { @@ -1054,7 +1054,7 @@ public async Task> ApplyUpdatesAsync( ApplyUpdatesOptions? options = null, CancellationToken cancellationToken = default) { - ValidateId(instanceId, nameof(instanceId)); + instanceId = ValidateId(instanceId, nameof(instanceId)); try { @@ -1142,7 +1142,7 @@ public async Task>> GetConfigurationA string instanceId, CancellationToken cancellationToken = default) { - ValidateId(instanceId, nameof(instanceId)); + instanceId = ValidateId(instanceId, nameof(instanceId)); try { @@ -1203,7 +1203,7 @@ public async Task> ValidateConfigurationAs IReadOnlyDictionary configuration, CancellationToken cancellationToken = default) { - ValidateId(instanceId, nameof(instanceId)); + instanceId = ValidateId(instanceId, nameof(instanceId)); if (configuration == null) { @@ -1282,7 +1282,7 @@ public async Task> ApplyConfigurationAsync( ApplyConfigurationOptions? options = null, CancellationToken cancellationToken = default) { - ValidateId(instanceId, nameof(instanceId)); + instanceId = ValidateId(instanceId, nameof(instanceId)); if (configuration == null) { @@ -1380,7 +1380,7 @@ public async Task>> GetLogsAsync( GetLogsOptions? options = null, CancellationToken cancellationToken = default) { - ValidateId(instanceId, nameof(instanceId)); + instanceId = ValidateId(instanceId, nameof(instanceId)); try { @@ -1467,7 +1467,7 @@ public async IAsyncEnumerable StreamLogsAsync( string instanceId, [System.Runtime.CompilerServices.EnumeratorCancellation] CancellationToken cancellationToken = default) { - ValidateId(instanceId, nameof(instanceId)); + instanceId = ValidateId(instanceId, nameof(instanceId)); _logger.LogDebug("Starting log stream for instance {InstanceId}", instanceId); @@ -1502,7 +1502,7 @@ public async Task> HealthCheckAsync( string instanceId, CancellationToken cancellationToken = default) { - ValidateId(instanceId, nameof(instanceId)); + instanceId = ValidateId(instanceId, nameof(instanceId)); var startTime = DateTimeOffset.UtcNow; @@ -1577,7 +1577,7 @@ public async Task> SendChatMessageAsync( string message, CancellationToken cancellationToken = default) { - ValidateId(instanceId, nameof(instanceId)); + instanceId = ValidateId(instanceId, nameof(instanceId)); if (string.IsNullOrWhiteSpace(message)) { @@ -1636,7 +1636,7 @@ public async Task> SaveWorldAsync( string instanceId, CancellationToken cancellationToken = default) { - ValidateId(instanceId, nameof(instanceId)); + instanceId = ValidateId(instanceId, nameof(instanceId)); try { @@ -1685,7 +1685,7 @@ public async Task> ExecuteCustomCommandAsync( string command, CancellationToken cancellationToken = default) { - ValidateId(instanceId, nameof(instanceId)); + instanceId = ValidateId(instanceId, nameof(instanceId)); if (string.IsNullOrWhiteSpace(command)) {