FlawOpen

flawopen.com/Teardowns/cve-2026-105752-vllm-harmony-cache-salt-omission

● CVE-2026-105752 · CVSS 3.1 · Rendah
Riset Keamanan · FlawOpen

CVE-2026-105752: cache_salt terlewat di vLLM

Kelanjutan alat GPT-OSS pada Responses vLLM dapat melewatkan cache_salt dan memakai namespace cache prefiks tanpa salt. Tingkatkan ke vLLM 0.30.0 atau lebih baru dan pertahankan salt per penyewa di setiap kelanjutan.[1], [5]

💡 Penjelasan Sederhana (ELI5)

Bayangkan dokumen setiap pelanggan disimpan di loker bertanda warna pribadi. Permintaan pertama membawa tanda yang benar, tetapi alat menghilangkannya saat mengembalikan dokumen untuk langkah berikutnya. Rak bersama dapat memberi petunjuk lewat cache hit apakah halaman tebakan sudah ada, tetapi tidak menyerahkan halaman itu.[1]

Konsep Kunci & Istilah

Prefix caching
Penggunaan ulang blok key/value model untuk prefiks yang sama.[6]
cache_salt
Nilai dalam hash blok pertama untuk memisahkan cache dengan salt berbeda.[6]
Harmony continuation
Input model berikutnya setelah respons Harmony, termasuk setelah alat dipanggil.[1]
Membership oracle
Sinyal keberadaan prefiks tebakan tanpa mengungkap isinya.[1]
CWE-524
Penggunaan cache berisi informasi sensitif; klasifikasi utama penasihat.[1]

Pemetaan kerangka kerja

  • Referensi CWE untuk kelemahan yang dijelaskan dalam panduan ini: CWE-524

Analisis Akar Masalah (Root Cause)

Penasihat vLLM menjelaskan jalur GPT-OSS Harmony pada POST /v1/responses. Input engine awal meneruskan request.cache_salt ke tokens_input; setelah alat bawaan atau MCP, kelanjutan memakai tokens_input(token_ids) tanpa salt. Helper hanya menyimpan salt jika diberikan. Pada deployment bersama dengan cache prefiks otomatis, kelanjutan memakai namespace tanpa salt. Penasihat mencantumkan versi sebelum 0.30.0, mengonfirmasi perilaku pada 0.25.1, dan menyatakan batas bawah belum ditetapkan. Dampaknya adalah sinyal keanggotaan cache melalui cached_tokens_per_turn, bukan pengungkapan langsung teks prompt sembarang. CWE-200 juga disebut sebagai klasifikasi dampak; di sini CWE-524 menjadi satu-satunya kelemahan utama.[1], [3], [4]

Alur Serangan Langkah demi Langkah

Langkah 1

Layanan bersama memenuhi prasyarat

Diperlukan versi terdampak, GPT-OSS Harmony Responses, cache prefiks, dan alat; korban menetapkan cache_salt lalu mencapai kelanjutan.[1]

Langkah 2

Input engine pertama memakai salt

Pemanggilan tokens_input pertama menyertakan request.cache_salt sehingga prefiks masuk ke namespace bersalt milik pemanggil.[1]

Langkah 3

Kelanjutan alat kehilangan salt

Setelah hasil alat, kelanjutan memanggil tokens_input(token_ids) tanpa salt awal; prefiks dapat masuk ke namespace bersama tanpa salt.[1]

Langkah 4

Jumlah cache dapat mengungkap keanggotaan

Penyewa lain yang menyusun ulang prefiks dapat memeriksa cached_tokens_per_turn untuk menyimpulkan keberadaannya, bukan mengambil teks prompt sembarang.[1]

Langkah 5

Renderer mempertahankan salt di setiap giliran

Refaktor renderer yang digabung mempertahankan cache_salt saat merender Harmony dan meneruskannya ke setiap input engine baru; tingkatkan ke 0.30.0+.[1], [3], [7]

Kode Sumber: Rentan vs Aman

Penasihat vLLM menjelaskan jalur GPT-OSS Harmony pada POST /v1/responses. Input engine awal meneruskan request.cache_salt ke tokens_input; setelah alat bawaan atau MCP, kelanjutan memakai tokens_input(token_ids) tanpa salt. Helper hanya menyimpan salt jika diberikan. Pada deployment bersama dengan cache prefiks otomatis, kelanjutan memakai namespace tanpa salt. Penasihat mencantumkan versi sebelum 0.30.0, mengonfirmasi perilaku pada 0.25.1, dan menyatakan batas bawah belum ditetapkan. Dampaknya adalah sinyal keanggotaan cache melalui cached_tokens_per_turn, bukan pengungkapan langsung teks prompt sembarang. CWE-200 juga disebut sebagai klasifikasi dampak; di sini CWE-524 menjadi satu-satunya kelemahan utama. Upstream excerpts, not a literal line-by-line diff.[1], [3], [4], [7]

Cuplikan sumber: renderer Harmony Responses vLLM (cuplikan dari revisi berbeda)

IMPLEMENTASI RENTAN
# Jalur permintaan awal menggunakan salt, tetapi kelanjutan setelah alat tidak.
engine_input = tokens_input(token_ids, cache_salt=request.cache_salt)

# Setelah hasil alat diterima, kelanjutan membangun ulang input seperti ini:
engine_input = tokens_input(token_ids)
PERBAIKAN AMAN & KUAT
# Pertahankan salt permintaan dalam konteks perenderan Harmony.
cache_salt = cast(str | None, engine_input.get("cache_salt"))
engine_input = self.online_renderer.render_responses_harmony_messages(
    context.messages,
    cache_salt=cache_salt,
    tok_params=tok_params,
)

# Perender menyediakan salt setiap kali membuat input untuk mesin.
engine_input = tokens_input(prompt["prompt_token_ids"], cache_salt=cache_salt)

Daftar Periksa Penguatan Sistem Rekayasa

Sumber