From 70ba65cb9af0b10df3a0e931ed203391f22a34fa Mon Sep 17 00:00:00 2001 From: AIalliAI <285906080+AIalliAI@users.noreply.github.com> Date: Wed, 8 Jul 2026 03:47:08 +0000 Subject: [PATCH 1/2] fix(security): bump starlette 1.0.1 -> 1.3.1 for GHSA-82w8-qh3p-5jfq, GHSA-jp82-jpqv-5vv3 starlette 1.0.1 is vulnerable to: - GHSA-82w8-qh3p-5jfq: request.form() limits silently ignored, enabling DoS (CVSS 7.5) - GHSA-jp82-jpqv-5vv3: unvalidated request path poisons url.hostname (CVSS 5.3) - GHSA-x746-7m8f-x49c: StaticFiles SSRF via UNC paths on Windows (CVSS 7.5) - GHSA-wqp7-x3pw-xc5r: Arbitrary HTTP method dispatch via getattr (CVSS 5.3) All fixed in starlette 1.3.1. Bumped in dev, mcp, computer-use, and web extras. fastapi 0.133.1 remains compatible. --- pyproject.toml | 10 +++++----- uv.lock | 14 +++++++------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index b52c289ac3298..8ce50426e49dc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -157,7 +157,7 @@ edge-tts = ["edge-tts==7.2.7"] modal = ["modal==1.3.4"] daytona = ["daytona==0.155.0"] hindsight = ["hindsight-client==0.6.1"] -dev = ["debugpy==1.8.20", "pytest==9.0.2", "pytest-asyncio==1.3.0", "mcp==1.26.0", "starlette==1.0.1", "ty==0.0.21", "ruff==0.15.10", "setuptools==81.0.0"] # starlette: CVE-2026-48710; setuptools: latest <82 (torch >=2.11 caps setuptools<82) +dev = ["debugpy==1.8.20", "pytest==9.0.2", "pytest-asyncio==1.3.0", "mcp==1.26.0", "starlette==1.3.1", "ty==0.0.21", "ruff==0.15.10", "setuptools==81.0.0"] # starlette: CVE-2026-48710, GHSA-82w8-qh3p-5jfq, GHSA-jp82-jpqv-5vv3; setuptools: latest <82 (torch >=2.11 caps setuptools<82) messaging = ["python-telegram-bot[webhooks]==22.6", "discord.py[voice]==2.7.1", "aiohttp==3.14.1", "brotlicffi==1.2.0.1", "slack-bolt==1.27.0", "slack-sdk==3.40.1", "qrcode==7.4.2"] # aiohttp 3.14.1: CVE-2026-34513/34518/34519/34520/34525 + 34993(RCE)/47265 cron = [] # croniter is now a core dependency; this extra kept for back-compat slack = ["slack-bolt==1.27.0", "slack-sdk==3.40.1", "aiohttp==3.14.1"] @@ -204,7 +204,7 @@ vision = [] # `request.url` can be bypassed. We pin a patched Starlette directly in every # extra that exposes a Starlette-backed server surface so pip/uv can't resolve # a vulnerable pre-1.0.1 transitive. Bump in lockstep with uv.lock. -mcp = ["mcp==1.26.0", "starlette==1.0.1"] # starlette: CVE-2026-48710 +mcp = ["mcp==1.26.0", "starlette==1.3.1"] # starlette: CVE-2026-48710, GHSA-82w8-qh3p-5jfq, GHSA-jp82-jpqv-5vv3 nemo-relay = ["nemo-relay==0.3"] homeassistant = ["aiohttp==3.14.1"] sms = ["aiohttp==3.14.1"] @@ -213,7 +213,7 @@ teams = ["microsoft-teams-apps==2.0.13.4", "aiohttp==3.14.1"] # aiohttp 3.14.1: # The cua-driver binary itself is installed via `hermes tools` post-setup # (curl install script); this extra just pins the MCP client used to talk # to it, which is already provided by the `mcp` extra. -computer-use = ["mcp==1.26.0", "starlette==1.0.1"] # starlette: CVE-2026-48710 +computer-use = ["mcp==1.26.0", "starlette==1.3.1"] # starlette: CVE-2026-48710, GHSA-82w8-qh3p-5jfq, GHSA-jp82-jpqv-5vv3 acp = ["agent-client-protocol==0.9.0"] # mistral: Voxtral STT + TTS. Pinned to an exact verified-clean version. # The `mistralai` PyPI project was quarantined 2026-05-12 after the malicious @@ -267,9 +267,9 @@ youtube = [ "youtube-transcript-api==1.2.4", ] # `hermes dashboard` (localhost SPA + API). Not in core to keep the default install lean. -# starlette==1.0.1 pinned for CVE-2026-48710 (BadHost) — fastapi pulls Starlette +# starlette==1.3.1 pinned for CVE-2026-48710, GHSA-82w8-qh3p-5jfq (DoS), GHSA-jp82-jpqv-5vv3 (Host poisoning) — fastapi pulls Starlette # transitively and pre-1.0.1 is the vulnerable range. See the mcp extra above. -web = ["fastapi==0.133.1", "uvicorn[standard]==0.41.0", "starlette==1.0.1", "python-multipart==0.0.27"] +web = ["fastapi==0.133.1", "uvicorn[standard]==0.41.0", "starlette==1.3.1", "python-multipart==0.0.27"] all = [ # Policy (2026-05-12): `[all]` includes only extras that genuinely # CAN'T be lazy-installed via `tools/lazy_deps.py` — i.e. things every diff --git a/uv.lock b/uv.lock index 433ecd8d95755..1290a0d7d350f 100644 --- a/uv.lock +++ b/uv.lock @@ -1839,10 +1839,10 @@ requires-dist = [ { name = "slack-sdk", marker = "extra == 'messaging'", specifier = "==3.40.1" }, { name = "slack-sdk", marker = "extra == 'slack'", specifier = "==3.40.1" }, { name = "sounddevice", marker = "extra == 'voice'", specifier = "==0.5.5" }, - { name = "starlette", marker = "extra == 'computer-use'", specifier = "==1.0.1" }, - { name = "starlette", marker = "extra == 'dev'", specifier = "==1.0.1" }, - { name = "starlette", marker = "extra == 'mcp'", specifier = "==1.0.1" }, - { name = "starlette", marker = "extra == 'web'", specifier = "==1.0.1" }, + { name = "starlette", marker = "extra == 'computer-use'", specifier = "==1.3.1" }, + { name = "starlette", marker = "extra == 'dev'", specifier = "==1.3.1" }, + { name = "starlette", marker = "extra == 'mcp'", specifier = "==1.3.1" }, + { name = "starlette", marker = "extra == 'web'", specifier = "==1.3.1" }, { name = "supermemory", marker = "extra == 'supermemory'", specifier = "==3.50.0" }, { name = "tenacity", specifier = "==9.1.4" }, { name = "ty", marker = "extra == 'dev'", specifier = "==0.0.21" }, @@ -3991,15 +3991,15 @@ wheels = [ [[package]] name = "starlette" -version = "1.0.1" +version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/08/a3/84e821cc54b4ab50ae6dbc6ac3800a651b65ec35f045cc73785380654057/starlette-1.0.1.tar.gz", hash = "sha256:512399c5f1de7fac99c88572212ded9ddeddef2fb32afa82d724000e88b38f4f", size = 2659596, upload-time = "2026-05-21T21:58:58.433Z" } +sdist = { url = "https://files.pythonhosted.org/packages/eb/e3/7c1dc7381d9f8ab7d854328ebfa884e62cb3f3d8549ddfd37c7814f42afa/starlette-1.3.1.tar.gz", hash = "sha256:05d0213193f2fbaae60e2ecb593b4add4262ad4e46536b54abe36f11a71724e0", size = 2703240, upload-time = "2026-06-12T09:23:11.602Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/e1/b2df4bc09a1e51ff664c1e17018a4274b42e5e9352e4a478ea540512dc88/starlette-1.0.1-py3-none-any.whl", hash = "sha256:7c0e69b2ee1c848bd54669d908500117a3ee13de603a21427e5c6fc1adf98dcd", size = 72802, upload-time = "2026-05-21T21:58:56.551Z" }, + { url = "https://files.pythonhosted.org/packages/ec/bb/2799cc2ede3ed41131f8975621e7213dfc7ef4acbbaadfa440f32500c370/starlette-1.3.1-py3-none-any.whl", hash = "sha256:c7372aae11c3c3f26a42df7bd626cec2f47d03483d261d369516a615a53714c6", size = 73632, upload-time = "2026-06-12T09:23:10.017Z" }, ] [[package]] From bdbb5f5f209b72537c2a7871b1c14316aeacccd2 Mon Sep 17 00:00:00 2001 From: AIalliAI <285906080+AIalliAI@users.noreply.github.com> Date: Wed, 8 Jul 2026 04:50:19 +0000 Subject: [PATCH 2/2] =?UTF-8?q?fix(security):=20bump=20starlette=20pin=201?= =?UTF-8?q?.0.1=E2=86=921.3.1=20in=20tools/lazy=5Fdeps.py=20to=20match=20p?= =?UTF-8?q?yproject.toml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CI caught pin mismatch between pyproject.toml (1.3.1) and lazy_deps.py (still 1.0.1). The CVE bump in #60676 updated pyproject.toml but missed the lazy_deps counterpart. Both dashboard and computer_use entries now match at 1.3.1. --- tests/tools/test_computer_use.py | 2 +- tools/lazy_deps.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/tools/test_computer_use.py b/tests/tools/test_computer_use.py index 9f4a6a5ca0513..24046a0c83fdc 100644 --- a/tests/tools/test_computer_use.py +++ b/tests/tools/test_computer_use.py @@ -1233,7 +1233,7 @@ def test_feature_registered_in_allowlist(self): from tools import lazy_deps assert lazy_deps.feature_specs("tool.computer_use") == ( "mcp==1.26.0", - "starlette==1.0.1", + "starlette==1.3.1", ) def test_start_lazy_installs_mcp(self): diff --git a/tools/lazy_deps.py b/tools/lazy_deps.py index 94cd069b8d33c..a51fbf2340e23 100644 --- a/tools/lazy_deps.py +++ b/tools/lazy_deps.py @@ -220,7 +220,7 @@ "tool.dashboard": ( "fastapi==0.133.1", "uvicorn[standard]==0.41.0", - "starlette==1.0.1", # CVE-2026-48710 (BadHost) — keep lazy-install in sync with pyproject [web] + "starlette==1.3.1", # CVE-2026-48710 (BadHost), GHSA-jp82-jpqv-5vv3 — keep lazy-install in sync with pyproject [web] "python-multipart==0.0.27", # FastAPI UploadFile/Form for streaming uploads (NS-501) ), # Vision image-resize recovery (Pillow). Pillow is now a CORE dependency @@ -236,7 +236,7 @@ # installs so computer_use never dead-ends on `No module named 'mcp'`. "tool.computer_use": ( "mcp==1.26.0", - "starlette==1.0.1", # CVE-2026-48710 — keep in sync with pyproject [computer-use] + "starlette==1.3.1", # CVE-2026-48710 — keep in sync with pyproject [computer-use] ), # HF Agent Trace Viewer upload (hermes trace upload / /upload-trace). "tool.trace_upload": ("huggingface-hub==1.2.3",),