java-topology/whitepaper/outreach/vllm-0002.md
russell@unturf.com 652608142a feat: close outreach doc gap — 276 docs (batches 11-16)
All projects with patches now have outreach docs. 276 new docs covering
CWE-407, CWE-312, CWE-362 across C, C++, Java, Python, Go, Rust, C#,
PHP, Ruby, JavaScript, Dart, Erlang, R, and more.

Outreach gap: 276 -> 0.
2026-04-15 13:57:42 -04:00

2.5 KiB
Raw Permalink Blame History

vLLM — CWE-407 Disclosure Brief (vllm-0002)

2026-04-13 · Patch available — awaiting upstream merge

Finding

One O(N×V) defect in vLLM's Grok2 tokenizer. dict.values() membership tests perform linear scans for special token filtering during decode, firing per output token during streaming LLM inference. Patched.

The Defects

vllm-0002 (PATCHED — HIGH): vllm/tokenizers/grok2.py

# In decode() — fires per decode call:
ids = [
    token_id for token_id in ids
    if token_id not in self._special_tokens.values()  # O(V) per token
]

# In convert_ids_to_tokens() — same pattern:
if skip_special_tokens and token_id in self._special_tokens.values():  # O(V)

self._special_tokens is a dict[str, int]. dict.values() returns a view; in membership test on a view is O(V) linear scan where V = number of special tokens. Called per output token, producing O(N×V) total.

The Mistral tokenizer in the same codebase already fixes this correctly with _special_token_ids_set: frozenset[int].

Complexity Proof

vllm-0002: At N=2,048 tokens, V=200 special tokens:

  • Defective: 2,048 × 200 = 409,600 comparisons per request
  • Fixed: 2,048 × 1 = 2,048 frozenset lookups
  • ~200× op reduction per decode call. At 100 concurrent requests: 40M wasted comparisons per batch.

Impact

vLLM serves Grok-2 models in production. decode() fires per output token during streaming inference, the hottest path in LLM serving. With V=200 special tokens and sequences of 2,048+ tokens, the linear scan adds measurable overhead to every request across all Grok-2 serving deployments.

The Fix

vllm-0002: Cache special token IDs as a frozenset at init time:

# Before — O(V) per token
if token_id not in self._special_tokens.values():

# After — O(1) per token
self._special_token_ids: frozenset[int] = frozenset(self._special_tokens.values())
if token_id not in self._special_token_ids:

Patch

Fix available: defects/vllm-0002/patch/vllm-0002-grok2-special-token-values-scan.patch

Single-file patch in vllm/tokenizers/grok2.py.

What We Ask

A patch is ready for review.

  1. Confirm receipt and assign a GitHub issue reference (vllm-project/vllm).
  2. Assess severity — fires per output token during streaming Grok-2 inference.
  3. Coordinate a disclosure date — we are targeting 90 days from first contact.
  4. We will credit the vLLM team in the public disclosure. Preferred acknowledgment format welcome.

Contact: see cover email. This brief is confidential until coordinated disclosure.