From a0e0026df0758dfa4ff8d53b1ba60509a72c925f Mon Sep 17 00:00:00 2001 From: Yuta Saito Date: Tue, 13 Jan 2026 10:09:23 +0900 Subject: [PATCH 1/6] chore: document temporary grype ignore for CVE-2019-1010022 --- ci_cd/.grype.yaml | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 ci_cd/.grype.yaml diff --git a/ci_cd/.grype.yaml b/ci_cd/.grype.yaml new file mode 100644 index 0000000000..e1068de8e3 --- /dev/null +++ b/ci_cd/.grype.yaml @@ -0,0 +1,3 @@ +ignore: + - vulnerability: CVE-2019-1010022 + reason: no fixed glibc package is available yet in the Wolfi repositories, so this is ignored temporarily until an upstream release exists From 54b21cabf7ab95189027bbe8ff23590c381d6f90 Mon Sep 17 00:00:00 2001 From: Yuta Saito Date: Tue, 13 Jan 2026 10:19:12 +0900 Subject: [PATCH 2/6] chore: add config option --- ci_cd/security_scans.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ci_cd/security_scans.sh b/ci_cd/security_scans.sh index be9167adda..eeaaddd3e1 100755 --- a/ci_cd/security_scans.sh +++ b/ci_cd/security_scans.sh @@ -101,12 +101,12 @@ run_grype_scans() { # Build and scan Dockerfile.database echo "Building and scanning Dockerfile.database..." docker build --no-cache -t litellm-database:latest -f ./docker/Dockerfile.database . - grype litellm-database:latest --fail-on critical + grype litellm-database:latest --config ci_cd/.grype.yaml --fail-on critical # Build and scan main Dockerfile echo "Building and scanning main Dockerfile..." docker build --no-cache -t litellm:latest . - grype litellm:latest --fail-on critical + grype litellm:latest --config ci_cd/.grype.yaml --fail-on critical # Restore original .dockerignore echo "Restoring original .dockerignore..." From 4daac9e3328a73135691b8fe6c454f588fe347e7 Mon Sep 17 00:00:00 2001 From: Yuta Saito Date: Tue, 13 Jan 2026 10:30:34 +0900 Subject: [PATCH 3/6] chore: add ALLOWED_CVES --- ci_cd/security_scans.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ci_cd/security_scans.sh b/ci_cd/security_scans.sh index eeaaddd3e1..17cf4c1817 100755 --- a/ci_cd/security_scans.sh +++ b/ci_cd/security_scans.sh @@ -129,6 +129,11 @@ run_grype_scans() { "CVE-2025-13836" # Python 3.13 HTTP response reading OOM/DoS - no fix available in base image "CVE-2025-12084" # Python 3.13 xml.dom.minidom quadratic algorithm - no fix available in base image "CVE-2025-60876" # BusyBox wget HTTP request splitting - no fix available in Chainguard Wolfi base image + "CVE-2010-4756" # glibc glob DoS - awaiting patched Wolfi glibc build + "CVE-2019-1010022" # glibc stack guard bypass - awaiting patched Wolfi glibc build + "CVE-2019-1010023" # glibc ldd remap issue - awaiting patched Wolfi glibc build + "CVE-2019-1010024" # glibc ASLR mitigation bypass - awaiting patched Wolfi glibc build + "CVE-2019-1010025" # glibc pthread heap address leak - awaiting patched Wolfi glibc build ) # Build JSON array of allowlisted CVE IDs for jq From 7d468bc9e3fa4fac7b3c2dd7c72419e5d38e021d Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Mon, 12 Jan 2026 17:31:37 -0800 Subject: [PATCH 4/6] refetch after key create --- .../src/app/(dashboard)/hooks/keys/useKeys.ts | 2 +- .../src/components/organisms/create_key_button.test.tsx | 4 ++-- .../src/components/organisms/create_key_button.tsx | 8 ++++++++ 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/ui/litellm-dashboard/src/app/(dashboard)/hooks/keys/useKeys.ts b/ui/litellm-dashboard/src/app/(dashboard)/hooks/keys/useKeys.ts index 8ae4d76ff5..cd3df1a382 100644 --- a/ui/litellm-dashboard/src/app/(dashboard)/hooks/keys/useKeys.ts +++ b/ui/litellm-dashboard/src/app/(dashboard)/hooks/keys/useKeys.ts @@ -4,7 +4,7 @@ import { keyListCall } from "@/components/networking"; import { KeyResponse } from "@/components/key_team_helpers/key_list"; import useAuthorized from "@/app/(dashboard)/hooks/useAuthorized"; -const keyKeys = createQueryKeys("keys"); +export const keyKeys = createQueryKeys("keys"); export interface KeysResponse { keys: KeyResponse[]; diff --git a/ui/litellm-dashboard/src/components/organisms/create_key_button.test.tsx b/ui/litellm-dashboard/src/components/organisms/create_key_button.test.tsx index 08c05f5fad..bd5e0ee1cb 100644 --- a/ui/litellm-dashboard/src/components/organisms/create_key_button.test.tsx +++ b/ui/litellm-dashboard/src/components/organisms/create_key_button.test.tsx @@ -1,5 +1,5 @@ -import { render, screen } from "@testing-library/react"; import { beforeEach, describe, expect, it, vi } from "vitest"; +import { renderWithProviders, screen } from "../../../tests/test-utils"; import CreateKey from "./create_key_button"; const mockKeyCreateCall = vi.fn().mockResolvedValue({ @@ -58,7 +58,7 @@ describe("CreateKey", () => { }); it("should render the CreateKey component", () => { - render(); + renderWithProviders(); expect(screen.getByRole("button", { name: /create new key/i })).toBeInTheDocument(); }); }); diff --git a/ui/litellm-dashboard/src/components/organisms/create_key_button.tsx b/ui/litellm-dashboard/src/components/organisms/create_key_button.tsx index 3cd8a04e06..8ad1555dd8 100644 --- a/ui/litellm-dashboard/src/components/organisms/create_key_button.tsx +++ b/ui/litellm-dashboard/src/components/organisms/create_key_button.tsx @@ -7,6 +7,8 @@ import { Button as Button2, Form, Input, Modal, Radio, Select, Switch, Tooltip } import debounce from "lodash/debounce"; import React, { useCallback, useEffect, useState } from "react"; import { CopyToClipboard } from "react-copy-to-clipboard"; +import { useQueryClient } from "@tanstack/react-query"; +import { createQueryKeys } from "@/app/(dashboard)/hooks/common/queryKeysFactory"; import { rolesWithWriteAccess } from "../../utils/roles"; import AgentSelector from "../agent_management/AgentSelector"; import { mapDisplayToInternalNames } from "../callback_info_helpers"; @@ -36,6 +38,7 @@ import { } from "../networking"; import NumericalInput from "../shared/numerical_input"; import VectorStoreSelector from "../vector_store_management/VectorStoreSelector"; +import { keyKeys } from "@/app/(dashboard)/hooks/keys/useKeys"; const { Option } = Select; @@ -136,6 +139,7 @@ export const fetchUserModels = async ( */ const CreateKey: React.FC = ({ team, teams, data, addKey }) => { const { accessToken, userId: userID, userRole, premiumUser } = useAuthorized(); + const queryClient = useQueryClient(); const [form] = Form.useForm(); const [isModalVisible, setIsModalVisible] = useState(false); const [apiKey, setApiKey] = useState(null); @@ -392,6 +396,10 @@ const CreateKey: React.FC = ({ team, teams, data, addKey }) => { // Also directly update the keys list in VirtualKeysTable without an API call addKey(response); + // Invalidate and refetch all keys list queries to update the table + // This will trigger a refetch of all key list queries regardless of pagination + queryClient.invalidateQueries({ queryKey: keyKeys.lists() }); + setApiKey(response["key"]); setSoftBudget(response["soft_budget"]); NotificationsManager.success("Virtual Key Created"); From a57f1e2e08bf6e70dd251f542ba69e1ef74bae5b Mon Sep 17 00:00:00 2001 From: Yuta Saito Date: Tue, 13 Jan 2026 10:34:01 +0900 Subject: [PATCH 5/6] test: remove flaky azure oidc embedding test --- tests/local_testing/test_embedding.py | 28 --------------------------- 1 file changed, 28 deletions(-) diff --git a/tests/local_testing/test_embedding.py b/tests/local_testing/test_embedding.py index 4855932ca9..d46def7f3a 100644 --- a/tests/local_testing/test_embedding.py +++ b/tests/local_testing/test_embedding.py @@ -317,34 +317,6 @@ def test_openai_azure_embedding(): pytest.fail(f"Error occurred: {e}") -@pytest.mark.skipif( - os.environ.get("CIRCLE_OIDC_TOKEN") is None, - reason="Cannot run without being in CircleCI Runner", -) -def test_aaaaaa_openai_azure_embedding_with_oidc_and_cf(): - # TODO: Switch to our own Azure account, currently using ai.moda's account - os.environ["AZURE_TENANT_ID"] = "17c0a27a-1246-4aa1-a3b6-d294e80e783c" - os.environ["AZURE_CLIENT_ID"] = "4faf5422-b2bd-45e8-a6d7-46543a38acd0" - - old_key = os.environ["AZURE_API_KEY"] - os.environ.pop("AZURE_API_KEY", None) - - try: - response = embedding( - model="azure/text-embedding-ada-002", - input=["Hello"], - azure_ad_token="oidc/circleci/", - api_base="https://eastus2-litellm.openai.azure.com/", - api_version="2024-06-01", - ) - print(response) - - except Exception as e: - pytest.fail(f"Error occurred: {e}") - finally: - os.environ["AZURE_API_KEY"] = old_key - - from openai.types.embedding import Embedding From b610dad3b8b37b2cc8e0ce151aef65b67fe432ff Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Mon, 12 Jan 2026 17:34:47 -0800 Subject: [PATCH 6/6] fixing build --- .../src/components/organisms/create_key_button.tsx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/ui/litellm-dashboard/src/components/organisms/create_key_button.tsx b/ui/litellm-dashboard/src/components/organisms/create_key_button.tsx index 8ad1555dd8..f05f1c4183 100644 --- a/ui/litellm-dashboard/src/components/organisms/create_key_button.tsx +++ b/ui/litellm-dashboard/src/components/organisms/create_key_button.tsx @@ -1,14 +1,14 @@ "use client"; +import { keyKeys } from "@/app/(dashboard)/hooks/keys/useKeys"; import useAuthorized from "@/app/(dashboard)/hooks/useAuthorized"; import { formatNumberWithCommas } from "@/utils/dataUtils"; import { InfoCircleOutlined } from "@ant-design/icons"; +import { useQueryClient } from "@tanstack/react-query"; import { Accordion, AccordionBody, AccordionHeader, Button, Col, Grid, Text, TextInput, Title } from "@tremor/react"; import { Button as Button2, Form, Input, Modal, Radio, Select, Switch, Tooltip } from "antd"; import debounce from "lodash/debounce"; import React, { useCallback, useEffect, useState } from "react"; import { CopyToClipboard } from "react-copy-to-clipboard"; -import { useQueryClient } from "@tanstack/react-query"; -import { createQueryKeys } from "@/app/(dashboard)/hooks/common/queryKeysFactory"; import { rolesWithWriteAccess } from "../../utils/roles"; import AgentSelector from "../agent_management/AgentSelector"; import { mapDisplayToInternalNames } from "../callback_info_helpers"; @@ -38,7 +38,6 @@ import { } from "../networking"; import NumericalInput from "../shared/numerical_input"; import VectorStoreSelector from "../vector_store_management/VectorStoreSelector"; -import { keyKeys } from "@/app/(dashboard)/hooks/keys/useKeys"; const { Option } = Select;