From 38eace0342b9e3ebf3a50a4652918871434637cb Mon Sep 17 00:00:00 2001 From: Arnold Galovics Date: Fri, 18 Sep 2026 09:23:08 +0200 Subject: [PATCH] fix(tags): strip CR/LF from tag name before logging Redis failure CodeQL flagged this as a log-injection vector: the raw, admin-supplied tag name was interpolated into a warning log line. /key/update's equivalent path logs a hashed key, not raw user input, so this pattern did not exist there. --- .../proxy/management_endpoints/tag_management_endpoints.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/litellm/proxy/management_endpoints/tag_management_endpoints.py b/litellm/proxy/management_endpoints/tag_management_endpoints.py index f10f13d6663..e8091c1937e 100644 --- a/litellm/proxy/management_endpoints/tag_management_endpoints.py +++ b/litellm/proxy/management_endpoints/tag_management_endpoints.py @@ -485,10 +485,13 @@ async def update_tag( try: await spend_counter_cache.redis_cache.async_set_cache(key=counter_key, value=tag.spend, ttl=60) except Exception as redis_err: # noqa: BLE001 # best-effort refresh: a Redis failure must not fail the request + # tag.name is admin-supplied; strip CR/LF before it reaches the logs so it + # cannot forge additional log lines. + safe_counter_key: Final = counter_key.replace("\r", "").replace("\n", "") verbose_proxy_logger.warning( "Failed to update spend counter %s in Redis after tag spend update: %s. " "Budget checks may use stale value until counter expires.", - counter_key, + safe_counter_key, redis_err, )