flawopen.com/Teardowns/cve-2026-105752-vllm-harmony-cache-salt-omission
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]
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
Layanan bersama memenuhi prasyarat
Diperlukan versi terdampak, GPT-OSS Harmony Responses, cache prefiks, dan alat; korban menetapkan cache_salt lalu mencapai kelanjutan.[1]
Input engine pertama memakai salt
Pemanggilan tokens_input pertama menyertakan request.cache_salt sehingga prefiks masuk ke namespace bersalt milik pemanggil.[1]
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]
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]
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)
# 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)
# 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
- ✓Tingkatkan ke vLLM 0.30.0 atau lebih baru dan periksa versi yang berjalan.[1], [5]
- ✓Buat cache_salt yang sulit ditebak di gateway tepercaya dan kirim pada setiap permintaan serta kelanjutan.[6], [1]
- ✓Uji bahwa setiap kelanjutan Harmony setelah alat mempertahankan salt dan memisahkan penyewa.[7]
- ✓Untuk isolasi ketat, pisahkan penyewa berdasarkan proses atau deployment.[6]
- ✓Tinjau fitur bersama dan batasi akses ke metrik cached_tokens_per_turn.[1]
- ✓Jelaskan risiko sebagai inferensi prefiks, bukan pengungkapan prompt sembarang.[1]