From c1dadc0c807c5281aa55a416a689953037318999 Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Sat, 14 Mar 2026 19:17:19 -0700 Subject: [PATCH 1/4] bumping pyJWT for security --- pyproject.toml | 2 +- requirements.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 840c470693..8efc636612 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -44,7 +44,7 @@ rq = {version = "*", optional = true} orjson = {version = "^3.9.7", optional = true} apscheduler = {version = "^3.10.4", optional = true} fastapi-sso = { version = "^0.16.0", optional = true } -PyJWT = { version = "^2.10.1", optional = true, python = ">=3.9" } +PyJWT = { version = "^2.12.0", optional = true, python = ">=3.9" } python-multipart = { version = ">=0.0.20", optional = true} cryptography = {version = "*", optional = true} prisma = {version = "^0.11.0", optional = true} diff --git a/requirements.txt b/requirements.txt index bf2bf2c47a..2bdafda612 100644 --- a/requirements.txt +++ b/requirements.txt @@ -40,7 +40,7 @@ orjson==3.11.7 # fast /embedding responses polars==1.31.0 # for data processing apscheduler==3.10.4 # for resetting budget in background fastapi-sso==0.19.0 # admin UI, SSO -pyjwt[crypto]==2.10.1 ; python_version >= "3.9" +pyjwt[crypto]==2.12.0 ; python_version >= "3.9" python-multipart>=0.0.20 # admin UI jaraco.context>=6.1.0 azure-ai-contentsafety==1.0.0 # for azure content safety From 188a864a7873b4609238f69d035c8014ee39d1cc Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Sat, 14 Mar 2026 19:21:50 -0700 Subject: [PATCH 2/4] updating poetry lock --- poetry.lock | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/poetry.lock b/poetry.lock index 5f932a1b18..591d0c270e 100644 --- a/poetry.lock +++ b/poetry.lock @@ -5338,24 +5338,25 @@ windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pyjwt" -version = "2.10.1" +version = "2.12.1" description = "JSON Web Token implementation in Python" optional = false python-versions = ">=3.9" groups = ["main", "dev", "proxy-dev"] files = [ - {file = "PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb"}, - {file = "pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953"}, + {file = "pyjwt-2.12.1-py3-none-any.whl", hash = "sha256:28ca37c070cad8ba8cd9790cd940535d40274d22f80ab87f3ac6a713e6e8454c"}, + {file = "pyjwt-2.12.1.tar.gz", hash = "sha256:c74a7a2adf861c04d002db713dd85f84beb242228e671280bf709d765b03672b"}, ] [package.dependencies] cryptography = {version = ">=3.4.0", optional = true, markers = "extra == \"crypto\""} +typing_extensions = {version = ">=4.0", markers = "python_version < \"3.11\""} [package.extras] crypto = ["cryptography (>=3.4.0)"] -dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx", "sphinx-rtd-theme", "zope.interface"] +dev = ["coverage[toml] (==7.10.7)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=8.4.2,<9.0.0)", "sphinx", "sphinx-rtd-theme", "zope.interface"] docs = ["sphinx", "sphinx-rtd-theme", "zope.interface"] -tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] +tests = ["coverage[toml] (==7.10.7)", "pytest (>=8.4.2,<9.0.0)"] [[package]] name = "pynacl" @@ -7993,4 +7994,4 @@ utils = ["numpydoc"] [metadata] lock-version = "2.1" python-versions = ">=3.9,<4.0" -content-hash = "1ade5dee030fd878c907a20b88a6a52ca26ee4ecbed15ecb045f9ae1d4b8b714" +content-hash = "1f3bbf967451633fb6290ba88980bdf4fbf83420024b14e862d1da717d903684" From 1f485007fb0c49fd318c43ce861dec48aa193585 Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Sat, 14 Mar 2026 19:53:52 -0700 Subject: [PATCH 3/4] fix: update PyJWT pin in Dockerfile.non_root to 2.12.0 The wheels directory contains 2.12.0 after the pyproject.toml bump, so the hardcoded 2.10.1 pin fails at build time. Co-Authored-By: Claude Opus 4.6 --- docker/Dockerfile.non_root | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/Dockerfile.non_root b/docker/Dockerfile.non_root index fbc16e4f87..c9684eb8bd 100644 --- a/docker/Dockerfile.non_root +++ b/docker/Dockerfile.non_root @@ -198,7 +198,7 @@ RUN sed -i 's/\r$//' docker/entrypoint.sh && \ chown -R nobody:nogroup /app /var/lib/litellm/ui /var/lib/litellm/assets /nonexistent /.npm && \ pip uninstall jwt -y || true && \ pip uninstall PyJWT -y || true && \ - pip install --no-index --find-links=/wheels/ PyJWT==2.10.1 --no-cache-dir && \ + pip install --no-index --find-links=/wheels/ PyJWT==2.12.0 --no-cache-dir && \ rm -rf /wheels && \ PRISMA_PATH=$(python -c "import os, prisma; print(os.path.dirname(prisma.__file__))") && \ chown -R nobody:nogroup $PRISMA_PATH && \ From d3587b1d8eb98b43faf48da837bf1e76bcf94993 Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Sat, 14 Mar 2026 19:54:54 -0700 Subject: [PATCH 4/4] fix: bump PyJWT to 2.12.0 in all Dockerfiles and tar to 7.5.11 All Dockerfiles were pinning PyJWT 2.9.0 (Dockerfile, Dockerfile.database, Dockerfile.dev) or had a stale wheel build for 2.9.0 (Dockerfile.non_root). Updated to 2.12.0 to match pyproject.toml. Also bumps tar to 7.5.11 in Dockerfile.non_root for security. Co-Authored-By: Claude Opus 4.6 --- Dockerfile | 2 +- docker/Dockerfile.database | 2 +- docker/Dockerfile.dev | 2 +- docker/Dockerfile.non_root | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Dockerfile b/Dockerfile index 4c6f22a95b..7bda32acf2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -39,7 +39,7 @@ RUN pip wheel --no-cache-dir --wheel-dir=/wheels/ -r requirements.txt # ensure pyjwt is used, not jwt RUN pip uninstall jwt -y RUN pip uninstall PyJWT -y -RUN pip install PyJWT==2.9.0 --no-cache-dir +RUN pip install PyJWT==2.12.0 --no-cache-dir # Runtime stage FROM $LITELLM_RUNTIME_IMAGE AS runtime diff --git a/docker/Dockerfile.database b/docker/Dockerfile.database index b69dc049ce..3e1c55a75a 100644 --- a/docker/Dockerfile.database +++ b/docker/Dockerfile.database @@ -112,7 +112,7 @@ RUN sed -i 's/\r$//' docker/install_auto_router.sh && chmod +x docker/install_au # ensure pyjwt is used, not jwt RUN pip uninstall jwt -y RUN pip uninstall PyJWT -y -RUN pip install PyJWT==2.9.0 --no-cache-dir +RUN pip install PyJWT==2.12.0 --no-cache-dir # Build Admin UI (runtime stage) # Convert Windows line endings to Unix and make executable diff --git a/docker/Dockerfile.dev b/docker/Dockerfile.dev index 17fb3733b1..e3e7ac0e0d 100644 --- a/docker/Dockerfile.dev +++ b/docker/Dockerfile.dev @@ -31,7 +31,7 @@ RUN --mount=type=cache,target=/root/.cache/pip \ # Fix JWT dependency conflicts early RUN pip uninstall jwt -y || true && \ pip uninstall PyJWT -y || true && \ - pip install PyJWT==2.9.0 --no-cache-dir + pip install PyJWT==2.12.0 --no-cache-dir # Copy only necessary files for build COPY pyproject.toml README.md schema.prisma poetry.lock ./ diff --git a/docker/Dockerfile.non_root b/docker/Dockerfile.non_root index c9684eb8bd..db3981fb7e 100644 --- a/docker/Dockerfile.non_root +++ b/docker/Dockerfile.non_root @@ -32,7 +32,7 @@ RUN for i in 1 2 3; do \ # Cache Python dependencies COPY requirements.txt . RUN pip wheel --no-cache-dir --wheel-dir=/wheels/ -r requirements.txt \ - && pip wheel --no-cache-dir --wheel-dir=/wheels/ "semantic_router==0.1.11" "aurelio-sdk==0.0.19" "PyJWT==2.9.0" + && pip wheel --no-cache-dir --wheel-dir=/wheels/ "semantic_router==0.1.11" "aurelio-sdk==0.0.19" "PyJWT==2.12.0" # Copy source after dependency layers COPY . . @@ -106,7 +106,7 @@ RUN for i in 1 2 3; do \ apk add --no-cache python3 py3-pip bash openssl tzdata nodejs npm supervisor && break || sleep 5; \ done \ && apk upgrade --no-cache nodejs \ - && npm install -g npm@latest tar@7.5.10 glob@11.1.0 @isaacs/brace-expansion@5.0.1 minimatch@10.2.4 diff@8.0.3 \ + && npm install -g npm@latest tar@7.5.11 glob@11.1.0 @isaacs/brace-expansion@5.0.1 minimatch@10.2.4 diff@8.0.3 \ && GLOBAL="$(npm root -g)" \ && find "$GLOBAL/npm" -type d -name "tar" -path "*/node_modules/tar" | while read d; do \ rm -rf "$d" && cp -rL "$GLOBAL/tar" "$d"; \