Characterizing Contention-Induced Reliability Collapse in KV-Cache Timing Side Channels for Multi-Tenant LLM Serving
Abstract
Shared key--value (KV) cache reuse improves large language model (LLM) serving, but it can also create a timing side channel that reveals whether a prefix is already cached. Previous work shows that such attacks are possible, but their reliability under realistic multi-tenant contention is less understood. We study this problem through seven experiments on live shared LLM-serving systems. On a vLLM server running DeepSeek-R1-Distill-Llama-8B on NVIDIA GB10, mean Cohen's d drops from 0.7789 with no synthetic workers to 0.2109 with two workers (t=8.412), while higher worker counts cause no statistically detectable further loss. A 120-run sparse-overlap experiment places the best breakpoint at the boundary of the measured range (tau=0, 95% CI [0.000,0.113]), supporting an ambient-versus-loaded regime change rather than an internal physical threshold. AUROC falls from 0.650 at ambient to 0.531 near 61% overlap and partially recovers to 0.574 at saturation. Concurrency-depth variance is the strongest measured correlate of effect size (r=-0.416) and hit consistency (r=-0.637). An interleaved control preserves the same non-monotonic ordering. The main collapse is also reproduced on a real two-node, two-GPU tensor-parallel vLLM setup, where mean d falls from 3.418 to 0.511 (p<0.01). Two SGLang pilots are statistically inconclusive. Overall, KV-cache timing reliability depends strongly on the load regime and serving stack, and measurements on quiet systems can overestimate operational attack reliability.
Figures & tables
| Study | Runs | Controlled factor | Primary measurement | Main purpose / result |
|---|---|---|---|---|
| 1 | 10 | Ambient vs. 4 workers | , | Pilot establishes a large first-order loss when sustained synthetic contention is introduced. |
| 2 | 48 | 0/2/4/8 workers | , , Welch tests | Dose response shows the dominant transition is 0 2 workers; higher worker counts add no statistically detectable monotonic loss. |
| 3 | 36 | Worker count and output length | , | Disentangles filler shape and exposes the unusually high variance of one short-output worker. |
| 4 | 20 | Workload shape with interval logging | , , | Shows request-overlap fraction rapidly saturates and cannot explain residual loaded-regime variance. |
| 5 | 120 | Sparse measured overlap across | AUROC, , , , breakpoint | Tests the missing transition region, rejects an interior threshold, and identifies concurrency-depth variance as the strongest measured correlate. |
| 6 | 45 | Interleaved 0/40/100% conditions | vs. round/order | Rechecks the non-monotonic ordering while reducing long-timescale time-of-day confounding. |
| Condition | Mean [95% CI] | Std. dev. | Mean [95% CI] |
|---|---|---|---|
| Ambient | 1.126 [0.923, 1.329] | 0.269 | 88.0% [83.2, 92.8] |
| workers | 0.213 [0.152, 0.298] | 0.096 | 63.2% [53.6, 72.8] |
| Workers | Mean [95% CI] | Std. dev. | Mean [95% CI] |
|---|---|---|---|
| 0 | 0.7789 [0.713, 0.845] | 0.1241 | 79.0% [78.0, 80.2] |
| 2 | 0.2109 [0.107, 0.318] | 0.1982 | 63.3% [57.7, 68.8] |
| 4 | 0.1399 [0.016, 0.262] | 0.2250 | 61.0% [53.8, 67.7] |
| 8 | 0.0820 [ 0.028, 0.201] | 0.2093 | 58.7% [49.3, 67.7] |
| Comparison | Welch df | |
|---|---|---|
| 0 vs. 2 workers | 8.412 | 18.5 |
| 2 vs. 4 workers | 0.820 | 21.7 |
| 4 vs. 8 workers | 0.652 | 21.9 |
| Condition | Workers | Max tok. | Mean [95% CI] | Std. | Mean [95% CI] |
|---|---|---|---|---|---|
| 1w_small16 | 1 | 16 | 0.0568 [ 0.317, 0.448] | 0.7112 | 57.8% [46.7, 69.2] |
| 1w_big128 | 1 | 128 | 0.0854 [0.023, 0.156] | 0.1207 | 62.3% [57.5, 66.7] |
| 2w_tiny4 | 2 | 4 | 0.1089 [0.068, 0.147] | 0.0727 | 61.8% [60.3, 63.5] |
| Condition | Measured synthetic overlap | range | Mean [95% CI] | Mean [95% CI] |
|---|---|---|---|---|
| ambient | 0.0000 in all four runs | 0.34–0.79 | 0.496 [0.364, 0.700] | 75.5% [73.0, 78.5] |
| 1w_small16 | 0.965–0.997 | –0.79 | 0.124 [ 0.551, 0.658] | 53.5% [36.5, 70.0] |
| 2w_16 | 0.970–1.000 | 0.17–0.41 | 0.281 [0.174, 0.388] | 73.5% [69.0, 78.0] |
| 1w_big128 | 0.760–0.930 | –0.22 | 0.099 [ 0.049, 0.202] | 69.5% [67.0, 72.5] |
| 2w_tiny4 | 0.990–1.000 | 0.12–0.18 | 0.151 [0.131, 0.168] | 67.5% [60.5, 74.0] |
| Bin | Mean | AUROC | 95% CI | |||||
|---|---|---|---|---|---|---|---|---|
| 0% | 0.000 | 0.650 | [0.628, 0.675] | 0.695 | 0.695 | 0.777 | 0.830 | 0.895 |
| 5% | 0.076 | 0.619 | [0.595, 0.644] | 0.648 | 0.648 | 0.716 | 0.762 | 0.825 |
| 10% | 0.096 | 0.628 | [0.602, 0.652] | 0.652 | 0.652 | 0.721 | 0.768 | 0.832 |
| 20% | 0.184 | 0.586 | [0.564, 0.611] | 0.639 | 0.639 | 0.703 | 0.747 | 0.809 |
| 40% | 0.392 | 0.564 | [0.541, 0.587] | 0.575 | 0.575 | 0.611 | 0.638 | 0.678 |
| 60% | 0.613 | 0.531 | [0.507, 0.556] | 0.525 | 0.525 | 0.538 | 0.547 | 0.562 |
| Metric | with | with |
|---|---|---|
| Measured overlap | ||
| Mean binary overlap | ||
| Mean concurrency depth | ||
| Max concurrency depth | ||
| Concurrency-depth variance |
| Bin | Mean | Std. | corr( ,round) |
|---|---|---|---|
| 0% | 0.0778 | ||
| 40% | 0.0584 | ||
| 100% | 0.0642 |
| Bin | Study 5 (sequential) | Study 6 (interleaved) |
|---|---|---|
| 0% | ||
| 40% | ||
| 100% |
| Deployment | Framework | GPUs | Ambient | Loaded | Welch | Inference |
|---|---|---|---|---|---|---|
| Primary node, Study 1 | vLLM 0.28.0 | 1 | – | collapse | ||
| Independent physical node | vLLM 0.27.1 | 1 | – | – | ambient replicated | |
| MPS co-resident pilot | SGLang 0.5.17 | 1 | 1.50 (NS) | inconclusive | ||
| Two-node tensor parallel | SGLang 0.5.17 | 2 | 0.91 (NS) | inconclusive | ||
| Two-node tensor parallel | vLLM 0.26.0 | 2 | collapse, |
LLM Security
Large language model (LLM) security studies attacks, privacy risks, and defenses across model training, inference, and deployment.
See all 327 papers