From dd553690a1de1d9e7834e0b7fc919c12f6192161 Mon Sep 17 00:00:00 2001 From: "chenyoulong20g@ict.ac.cn" Date: Fri, 7 Nov 2025 20:22:20 +0800 Subject: [PATCH] fix API Request Parameters Logged Credential Masking in ApiServer --- .../main/java/com/cloud/api/ApiServer.java | 28 ++++++++++++++++--- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/server/src/main/java/com/cloud/api/ApiServer.java b/server/src/main/java/com/cloud/api/ApiServer.java index 5e962cdb382d..e144bc9a4837 100644 --- a/server/src/main/java/com/cloud/api/ApiServer.java +++ b/server/src/main/java/com/cloud/api/ApiServer.java @@ -42,6 +42,7 @@ import java.util.Map; import java.util.Set; import java.util.TimeZone; +import java.util.Arrays; import java.util.concurrent.ExecutorService; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; @@ -610,10 +611,29 @@ public String handleRequest(final Map params, final String responseType, final S logger.error("invalid request, no command sent"); if (logger.isTraceEnabled()) { logger.trace("dumping request parameters"); - for (final Object key : params.keySet()) { - final String keyStr = (String)key; - final String[] value = (String[])params.get(key); - logger.trace(" key: " + keyStr + ", value: " + ((value == null) ? "'null'" : value[0])); + + // define sensitive fields that need to be masked in the logs + Set sensitiveFields = new HashSet<>(Arrays.asList( + "password", "secretkey", "apikey", "token", + "sessionkey", "accesskey", "signature", + "authorization", "credential", "secret" + )); + + for (final Object key : params.keySet()) { + final String keyStr = (String) key; + final String[] value = (String[]) params.get(key); + + boolean isSensitive = sensitiveFields.stream() + .anyMatch(field -> keyStr.toLowerCase().contains(field)); + + String logValue; + if (isSensitive) { + logValue = "******"; // mask sensitive values + } else { + logValue = (value == null) ? "'null'" : value[0]; + } + + logger.trace(" key: " + keyStr + ", value: " + logValue); } } throw new ServerApiException(ApiErrorCode.UNSUPPORTED_ACTION_ERROR, "Invalid request, no command sent");