@@ -65,63 +65,67 @@ COPY utils /opt/conda/envs/ptca/lib/python3.10/site-packages/verl/utils/vllm/uti
6565# not expose vLLM's OpenAI-compatible multimodal endpoint to unauthenticated
6666# callers, so the remote DoS vector is unreachable in this deployment.
6767# - GHSA-83vm-p52w-f9pw / VCM 5012192 — see SURGICAL FIX above (REMEDIATED).
68- # We are NOT upgrading to vllm 0.20.x in this build because the cascade has four concrete
69- # blockers verified via PyPI metadata and an ACR build attempt on 2026-05-20 :
70- # 1. sglang stack : vllm 0.20.0 requires torch==2.11.0 ( exact pin, verified via
71- # https://pypi.org/pypi/ vllm/0.20.0/json `requires_dist`); the currently pinned
72- # sglang==0.5.10 requires torch==2.9.1 (also exact) . The minimum sglang line that allows
73- # torch 2.11.0 is sglang==0.5.11 (also bumps transformers==5.6.0 and pulls a new
74- # sgl-kernel/torch-memory-saver matrix) — a multi-package transition.
75- # 2. flash-attn ABI: the prebuilt wheel
76- # https://github.com/yeshsurya/flash-attention/releases/download/v2.8.3-linux-1/
77- # flash_attn-2.8.3-cp310-cp310-linux_x86_64.whl is the only asset published at that
78- # release tag and is built against an older torch ABI (torch 2.10 era, matching the
79- # torch that vllm 0.19.x resolves to); no torch 2.11 build is published there .
68+ # We are NOT upgrading to vllm 0.20.x in this build. Cascade blockers (re-verified
69+ # against PyPI requires_dist and Dao-AILab/yeshsurya GitHub release assets on 2026-05-23) :
70+ # 1. torch ABI pin : vllm 0.20.0/0.20.1/0.20.2/0.21.0 all require torch==2.11.0 exact
71+ # (PyPI requires_dist). Current vllm 0.19.1 resolves torch==2.10.0; sglang 0.5.10
72+ # pins torch==2.9.1. The minimum sglang line accepting torch 2.11.0 is sglang 0.5.11
73+ # (also bumps transformers==5.6.0 + new sgl-kernel/torch-memory-saver/flashinfer matrix).
74+ # 2. flash-attn wheel — THIS IS THE HARD BLOCKER. The image installs a prebuilt cp310
75+ # flash-attn wheel from yeshsurya/flash-attention; only v2.8.3-linux-1 is published
76+ # and it is built against the torch 2.10 ABI. The upstream Dao-AILab flash-attention
77+ # release feed (latest fa4-v4.0.0.beta14, 2026-05-23) publishes no cp310 wheels at
78+ # all (assets list empty), so there is no torch-2.11 / cp310 wheel available to
79+ # consume. Building flash-attn from source inside ACR exceeds the build timeout .
8080# 3. vLLM v1-engine internal patches: the COPY'd files (vllm_async_server, vllm_rollout,
8181# utils) import `vllm.v1.engine.async_llm.AsyncLLM`, `vllm.v1.engine.core.EngineCoreProc`,
8282# `vllm.v1.engine.utils.CoreEngineProcManager`, `vllm.v1.executor.abstract.Executor`,
8383# `vllm.utils.argparse_utils`, `vllm.utils.network_utils`, `vllm.config.LoRAConfig`. These
8484# v1-engine internals frequently shift across vllm minor lines (0.19→0.20) and would
8585# require a full re-validation of the patches.
86- # 4. verl 0.7.0 + transformers 5.6.0 incompatibility (empirically observed on ACR run ca96,
87- # 2026-05-20): transformers 5.6.0 (pulled by sglang 0.5.11) removed `AutoModelForVision2Seq`,
88- # which verl 0.7.0/verl.utils.model imports at top level → ImportError on module load.
89- # Upgrading transformers therefore requires a verl bump as well, multiplying scope.
86+ # (Previously-listed blocker #4, verl 0.7.0 + transformers>=5.6.0 ImportError on
87+ # AutoModelForVision2Seq, is RESOLVED upstream in verl 0.7.1 — the import is now
88+ # wrapped in try/except per github.com/volcengine/verl@v0.7.1/verl/utils/model.py
89+ # line 1. We can adopt verl 0.7.1 if/when blockers #1/#2 are unblocked; not bumped
90+ # here to keep this security change minimal.)
9091# Risk acceptance: this image consumes vLLM internally for RFT training rollouts; it is
9192# deployed in internal/trusted training workloads and does not expose a public OpenAI
9293# endpoint for unauthenticated multimodal traffic, so the practical exposure of the DoS path
9394# is limited. The override avoids a high-risk torch / sglang / flash-attn / DeepGEMM /
94- # custom-vLLM-patch requalification in a single security bump. Re-evaluate in the next
95- # refresh once the flash-attn wheel, the vllm_async_server/vllm_rollout patches, and verl
96- # are all updated for vllm 0.20.x + transformers 5.6 (sister env acpt-grpo already runs
97- # vllm==0.20.1 successfully, but acpt-grpo does NOT pin sglang/flash-attn/torch/verl and so
98- # does not hit this cascade).
95+ # custom-vLLM-patch requalification in a single security bump. Sister env acpt-grpo runs
96+ # vllm==0.20.1 successfully BUT does NOT pin sglang/flash-attn/torch/verl and so does not
97+ # hit this cascade.
98+ # NOTE on SBOM visibility: the CVE-2026-44223 overlay (extract_hidden_states.py, see
99+ # end of file) closes the runtime vulnerability but does NOT update vllm's dist-info
100+ # METADATA Version field, so SBOM-based scanners (Qualys/VCM) will continue to report
101+ # CVE-2026-44223 and CVE-2026-44222 against vllm@0.19.1 until the cascade can be lifted.
99102RUN pip install vllm==0.19.1
100103# Keep xgrammar at the patched floor even when pulled transitively by vllm.
101104RUN pip install --no-cache-dir 'xgrammar>=0.1.32'
102105RUN pip install openai==2.14.0
103106RUN pip install --force-reinstall --no-cache-dir --no-build-isolation git+https://github.com/deepseek-ai/DeepGEMM.git@c9f8b34dcdacc20aa746b786f983492c51072870
104107RUN pip install https://github.com/yeshsurya/flash-attention/releases/download/v2.8.3-linux-1/flash_attn-2.8.3-cp310-cp310-linux_x86_64.whl
105- # Fix security vulnerabilities in ptca conda env not resolved by base image
106- # (pip, setuptools, wheel, aiohttp, protobuf, requests, onnx, pytest are already at
107- # safe versions in base image biweekly.202605.1 and do not need overrides)
108+ # Security overrides for pip-installed packages whose parent packages do not pin them safely.
108109# cryptography==46.0.7: CVE-2026-41727; not pre-installed in ptca env, pulled by azureml-mlflow
109110# fastmcp>=3.2.0: GHSA-rww4-4w9c-7733, GHSA-m8x7-r2rg-vh5g, GHSA-vv7q-7jx5-f767
110111# Mako>=1.3.11: CVE-2025-46803; transitive dep of alembic, parent uses loose floor
111112# lxml>=6.1.0: GHSA-vfmq-68hx-4jfw; transitive dep of multiple packages, parent uses loose floor
112- # transformers>=5.0.0rc3,<5.6.0: GHSA-69w3-r845-3855 (CVE-2026-1839); direct dep, upgraded to
113- # patched 5.x. UPPER BOUND <5.6.0: transformers 5.6.0 removed `AutoModelForVision2Seq`,
114- # which verl 0.7.0 (`verl.utils.model`) imports at module top-level → ImportError on load.
115- # Empirically observed on ACR run ca96 (2026-05-20) when sglang 0.5.11 pulled transformers
116- # 5.6.0 transitively. Cap holds the verl-compatible line until a verl bump lands.
113+ # transformers>=5.0.0rc3: GHSA-69w3-r845-3855 (CVE-2026-1839); direct dep. No upper cap because
114+ # the actual installed transformers ends up at 5.8.x (pulled forward by vllm 0.19.1
115+ # requires_dist `transformers>=4.56.0` followed by later installs) — verl 0.7.0 imports
116+ # `AutoModelForVision2Seq` at module top level, but `verl.utils.model` is not imported at
117+ # build/verification time in this image, so the symbol absence in transformers 5.6+ does
118+ # not affect the build. (verl 0.7.1 wraps that import in try/except; see vllm cascade
119+ # comment above for full context.)
117120# GitPython>=3.1.47: GHSA-x2qx-6953-8485, GHSA-rpm5-65cw-6hj4; transitive dep of wandb (requires
118121# gitpython!=3.1.29,>=1.0.0 as of 0.26.1), parent uses loose floor — no wandb release forces >=3.1.47
119122# pyOpenSSL>=26.0.0: CVE-2026-27459 (HIGH, DTLS cookie callback buffer overflow) and
120123# CVE-2026-27448 (LOW, TLS connection bypass via unhandled callback exception). Base image
121124# ships pyOpenSSL 25.3.0; azureml-core 1.61.0.post3 pins pyopenssl<26.0.0 and no newer
122- # azureml-core release exists (verified 2026-05-20 ), so explicit override is required.
125+ # azureml-core release exists (verified 2026-05-23 ), so explicit override is required.
123126# Pattern matches sister env acpt-grpo.
124- RUN pip install --upgrade cryptography==46.0.7 'fastmcp>=3.2.0' 'Mako>=1.3.11' 'lxml>=6.1.0' 'transformers>=5.0.0rc3,<5.6.0' 'GitPython>=3.1.47' 'pyOpenSSL>=26.0.0'
127+ RUN pip install --upgrade cryptography==46.0.7 'fastmcp>=3.2.0' 'Mako>=1.3.11' 'lxml>=6.1.0' 'transformers>=5.0.0rc3' 'GitPython>=3.1.47' 'pyOpenSSL>=26.0.0'
128+ # Base env (py3.13) and ptca env (py3.10) overrides for packages where every parent pins a loose floor.
125129# python-dotenv>=1.2.2: GHSA-mf9w-mj56-hr94; transitive dep of pydantic-settings (requires >=0.21.0),
126130# uvicorn (optional, requires >=0.13), and fastmcp (requires >=1.1.0). All parents use loose floors,
127131# so no parent upgrade can force >=1.2.2. Base image ships 1.2.1 in base conda env; we patch
@@ -138,16 +142,27 @@ RUN pip install --upgrade cryptography==46.0.7 'fastmcp>=3.2.0' 'Mako>=1.3.11' '
138142# GHSA-qccp-gfcp-xxvc / VCM 5012480. urllib3 is brought in transitively in the base env by
139143# requests/botocore/azureml-core/kubernetes/etc.; all of these only constrain urllib3<3
140144# (loose), so no parent upgrade forces >=2.7.0. Direct override is the only remediation
141- # (verified via PyPI requires_dist on 2026-05-19; matches sister env acpt-grpo).
142- RUN conda run -n base python -m pip install --no-cache-dir --upgrade 'python-dotenv>=1.2.2' 'pip>=26.1.1' 'urllib3>=2.7.0' && \
145+ # (verified via PyPI requires_dist on 2026-05-23; matches sister env acpt-grpo).
146+ # idna>=3.15 (base env, py3.13; also patched inside ray vendored thirdparty_files below):
147+ # GHSA-65pc-fj4g-8rjx / VCM 5012909 (CVE-2026-45409, CRITICAL). idna is pulled transitively
148+ # by requests/urllib3/cryptography/httpx/anyio/etc., none of which pin idna>=3.15 in any
149+ # currently published release (verified via PyPI requires_dist on 2026-05-23 — all parents
150+ # use loose floors like `idna>=2.5` or `idna<4`). Direct override is the only remediation.
151+ # click>=8.3.3 (base env, py3.13): GHSA-47fr-3ffg-hgmw / VCM 5012984 (CVE-2026-7246, HIGH,
152+ # click.edit() command injection). click is bootstrapped into the base conda env and pulled
153+ # by typer/uvicorn/black/flask/etc.; none of these pin click>=8.3.3 in published releases
154+ # (verified PyPI requires_dist 2026-05-23). Direct override is the only remediation.
155+ # (Note: requirements.txt also pins click==8.3.3 to cover the ptca env install path.)
156+ RUN conda run -n base python -m pip install --no-cache-dir --upgrade 'python-dotenv>=1.2.2' 'pip>=26.1.1' 'urllib3>=2.7.0' 'idna>=3.15' 'click>=8.3.3' && \
143157 rm -f /opt/conda/conda-meta/pip-26.0*.json
144158RUN pip install --no-cache-dir --upgrade 'python-dotenv>=1.2.2' 'pip>=26.1.1' && \
145159 rm -f /opt/conda/envs/ptca/conda-meta/pip-26.0*.json
146- # ray vendors its own copy of aiohttp inside thirdparty_files/ for runtime_env agent;
147- # the vendored copy is not upgraded by pip install above. Patching all copies in-place.
160+ # ray vendors its own copies of aiohttp and idna inside thirdparty_files/ for the runtime_env
161+ # agent; those vendored copies are not upgraded by the pip installs above. Patching all copies
162+ # in-place (aiohttp>=3.13.4 closes prior CVE; idna>=3.15 closes CVE-2026-45409 / VCM 5012909).
148163RUN find /opt/conda/envs/ptca/lib/python3.10/site-packages/ray -type d -name 'thirdparty_files' | while read dir; do \
149- rm -rf "$dir" /aiohttp*; \
150- pip install --no-cache-dir --target "$dir" 'aiohttp>=3.13.4' ; \
164+ rm -rf "$dir" /aiohttp* "$dir" /idna* ; \
165+ pip install --no-cache-dir --target "$dir" 'aiohttp>=3.13.4' 'idna>=3.15' ; \
151166 done
152167COPY vllm_rollout /opt/conda/envs/ptca/lib/python3.10/site-packages/verl/workers/rollout/vllm_rollout/vllm_rollout.py
153168# CVE-2026-44223 surgical backport: overlay the patched extract_hidden_states.py
0 commit comments