Hackerbane
vLLM
Public research note

vLLM
translation file field

vLLM serves models with an OpenAI-shaped audio API. Transcription already 422s when file is a string. Translation uses the same field and did not. The patch is in PR 55618.

0Critical
0High
1Medium
0Low
0Info
DocumentHB-AR-2026.8  /  public source review, speech-to-text requests
What this isA research note and an opinion. The vLLM project did not hire Hackerbane for this.
Systemvllm-project/vllm, audio transcription and translation requests
ScopeTranscriptionRequest and TranslationRequest file validators
Review commitmain @ 6865e67
UpstreamPR 55618 (open)
Date7 September 2026
AuthorBarney Chambers, Hackerbane
hackerbane.com hello@hackerbane.com HB-AR-2026.8
Hackerbane · Assessment Report HB-AR-2026.8

Contents

  1. 1Executive summary
  2. 2Scope and method
  3. 3Findings summary
  4. 4MED-01: translation skips the transcription string-file check
  5. 5Remediation record
  6. 6Disclaimer

1   Executive summary

If you have not used vLLM: it is an inference server. The audio routes take a multipart file. Transcription already refuses a string in that field with HTTP 422. Translation did not.

On main at commit 6865e67:

# transcription
if isinstance(data.get("file"), str):
    raise HTTPException(status_code=422, detail="... not 'str'.")

# translation
# stream options and vllm_xargs only

I opened a patch that copies the transcription check. It is PR 55618. The vLLM project did not hire this review. The name on the cover names the project I read.

Their SECURITY.md lets moderate and low fixes land as public PRs. This is a validator miss, not remote code execution.

1.1   The thing to fix first

#IDActionStatus on 7 Sep 2026
1 MED-01 Use the same string-file 422 on translation that transcription already uses. Patch open. PR 55618.

2   Scope and method

This is not a full audit of vLLM. I split serving paths and read media URL allowlists, LoRA unload, MCP, and speech-to-text. Redirect re-validation and LoRA engine unload already have open PRs. The finding I can prove with a unit test on current main, and that was not already patched, is the translation file check.

In scope vllm/entrypoints/speech_to_text/transcription/protocol.py and translation/protocol.py. Test in tests/entrypoints/speech_to_text/test_audio_request_file_type.py.
Out of scope Attention kernels. Media-domain redirect hops (open PR 55539). LoRA engine unload (open PRs). SageMaker /adapters auth. Realtime WebSocket size units.
Method Compare the two model_validator methods. Add a parametrized model_validate({"file": "not-a-file.wav"}) case that fails on 6865e67 for translation and passes with the patch.
Retest pytest tests/entrypoints/speech_to_text/test_audio_request_file_type.py -q

3   Findings summary

IDSeverityTitleStatus
MED-01 Medium translation skips the transcription string-file check Patch open (PR 55618)

I called this Medium, not High, because a bad file still fails later. The miss is the sibling validator, not a silent success.

Hackerbane · Assessment Report MED-01

4   MED-01

MED-01   translation skips the transcription string-file check

Medium CWE-20

vllm/entrypoints/speech_to_text/translation/protocol.py · validate_stream_options

Transcription comments that file must be a file-like object, then 422s a string. Translation copies the stream-option half of that validator and skips the file check. After the patch both model_validate({"file": "not-a-file.wav"}) calls raise the same 422.

5   Remediation record

WhenWhat
7 Sep 2026 Review commit 6865e67. MED-01 confirmed. Translation missed the string-file 422.
7 Sep 2026 Opened PR 55618. Still open when this note was written.

To retest MED-01, run the command in section 2.

Hackerbane · Assessment Report 6 · Disclaimer

6   Disclaimer

Read this before you treat anything above as advice.

This file is a public research note. The vLLM project did not hire Hackerbane. There is no services agreement, statement of work, or client relationship behind it. The vLLM name on the cover names the project I read. It is not a partnership badge.

What you have is an opinion about the files and commits named in section 2. It is not a certificate. It is not an endorsement of vLLM or of the patch. It is not a claim that the rest of vLLM is safe, or that it is broken.

I am not telling you to merge, deploy, buy, or sell anything. This is not investment advice, legal advice, or a security guarantee. If you ship software, you own that risk. If you run vLLM audio routes, you own that risk.

Hackerbane and I accept no liability for how anyone uses this note, for bugs it does not name, or for loss that follows from relying on it. Findings can be wrong, incomplete, or already stale the day after the review commit. Code added after that commit was not reviewed. A retest covers only the checks it names.

You may share this file. Sharing it does not create a contract and does not make the reader a client.

This note is provided as-is, as available, with all faults. To the maximum extent the law allows, Hackerbane disclaims every warranty, express or implied, including merchantability, fitness for a particular purpose, title, and non-infringement. No promise that this text is accurate, complete, or free of error, or that any error will be fixed.

Nobody may rely on this note as a professional engagement. It is not financial, tax, legal, or regulatory advice. No third party is a beneficiary of it.

Severity words in this note

CriticalSomeone could steal funds or hurt people with what I looked at.
HighThe check you think you have does not work in the common case.
MediumA real miss, less common in the output I care about here.
LowReal, but limited, or it needs an unlikely setup.
InformationalOn the record. Not scored as a bug.

The coloured bars are labels. The word High or Medium is what counts.