LiteLLM SQL injection patch evidence fixed_commit=4dc416ee749122ca91e3bca095217478663419e7 commit 4dc416ee749122ca91e3bca095217478663419e7 Author: jayden AuthorDate: Thu Apr 9 20:10:40 2026 -0700 Commit: jayden CommitDate: Thu Apr 9 20:10:40 2026 -0700 fix(proxy): use parameterized query for combined_view token lookup diff --git a/litellm/proxy/utils.py b/litellm/proxy/utils.py index 635204f336..a62f34764d 100644 --- a/litellm/proxy/utils.py +++ b/litellm/proxy/utils.py @@ -2645,7 +2645,7 @@ class PrismaClient: raise e async def _query_first_with_cached_plan_fallback( - self, sql_query: str + self, sql_query: str, *args ) -> Optional[dict]: """ Execute a query with automatic fallback for PostgreSQL cached plan errors. @@ -2664,7 +2664,7 @@ class PrismaClient: Original exception if not a cached plan error """ try: - return await self.db.query_first(query=sql_query) + return await self.db.query_first(sql_query, *args) except Exception as e: error_str = str(e) if "cached plan must not change result type" in error_str: @@ -2679,7 +2679,7 @@ class PrismaClient: "retrying with fresh plan. This may occur during rolling deployments " "when schema changes are applied." ) - return await self.db.query_first(query=sql_query_retry) + return await self.db.query_first(sql_query_retry, *args) else: raise @@ -3016,11 +3016,11 @@ class PrismaClient: LEFT JOIN "LiteLLM_ProjectTable" AS p ON v.project_id = p.project_id LEFT JOIN "LiteLLM_OrganizationTable" AS o ON v.organization_id = o.organization_id LEFT JOIN "LiteLLM_BudgetTable" AS b2 ON o.budget_id = b2.budget_id - WHERE v.token = '{token}' + WHERE v.token = $1 """ response = await self._query_first_with_cached_plan_fallback( - sql_query + sql_query, hashed_token ) # If not found in main table, check deprecated keys (grace period)