Your GPU Neighbor Can Hear Your Model — Branislav Brzak, Stealthium

Read the talk

Your GPU Neighbor Can Hear Your Model

Branislav Brzak traces an H100 timing side channel from reads of an attacker’s own memory to model and workload fingerprints, then shows what changes across NVLink and what operators can observe.

From a talk by Branislav Brzak

At a glance

Ideas worth remembering

  • MIG partitions compute and memory, but GPU-wide memory barriers can still change the latency of another tenant’s reads of its own memory.

  • Token tempo reveals decoding speed; within-token timing structure adds architectural information when similar speeds make models hard to distinguish.

  • The demonstrated workload inference depends on speculative decoding: differing draft acceptance changes step timing without exposing the actual generated text.

  • The separate-GPU NVLink experiment preserves enough tempo information for a useful model fingerprint, although layer detail falls below the noise.

  • Tenant placement, inter-GPU communication requirements and monitoring of repeated GPU probes are separate operator decisions.

Separate memory still leaves a shared clock

A model can keep its prompts and answers inside its own GPU memory and still reveal something to a neighboring tenant. In Branislav Brzak’s H100 experiments at Stealthium, the neighbor watches timing: when inference runs, how quickly tokens arrive and which patterns repeat within their generation. The attacker needs neither root access nor a traditional software exploit.

The opening demonstration places the victim’s inference dashboard beside the attacker’s inferred model and workload. Brzak reports 97% accuracy for identifying model architecture and depth, and 99.3% accuracy for decoding speed. Timing also exposes busy periods and supports estimates of token counts and response length. These are reported results from the tested configurations, rather than guarantees for arbitrary shared deployments. The important limit is explicit: the attack does not recover the actual prompts, answers or their contents.

The first setup uses NVIDIA’s Multi-Instance GPU, or MIG, to divide an H100. Each slice has physical compute resources and dedicated VRAM. The victim receives a larger slice with 40 GB of VRAM; the attacker uses a smaller one with 10 GB. That division makes the experiment a test of what survives hardware isolation, rather than an attempt to read another tenant’s allocated memory.

0:010:31
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

0:01 · section reference included

A GPU-wide barrier slows reads in another slice

MIG isolates compute resources, memory capacity, bandwidth quotas and faults. It also partitions the L2 cache: one instance cannot evict another instance’s cache entries. The remaining connection is a GPU-wide memory barrier, or membar. A barrier issued by one instance affects every L2 partition on the card. Consequently, a tenant can experience slightly slower reads of its own memory while another tenant is busy.

The probe turns that slowdown into a repeated measurement: load from a small buffer owned by the attacker, time the load, and repeat every five microseconds. No step requires a read from the victim’s memory. Brzak credits the researchers behind Behind Bars at USENIX Security for both this probing primitive and the underlying MIG memory-barrier leak.

How much does the neighboring workload change the measurement? The slide shows medians of 715.9 ns idle and 719.1 ns while serving Qwen3-8B, labeling the gap about 3 ns; the spoken account says microseconds. That small shift is useful because the attacker records a time series, preserving when slowdowns occur and how they repeat. The signal comes from the structure of those measurements, beyond the difference between two medians.

The idle and Qwen3-8B traces have medians of 715.9 ns and 719.1 ns, about 3 ns apart; the traces show the time-varying measurements behind that small median shift.Open full source frame
The idle and Qwen3-8B traces have medians of 715.9 ns and 719.1 ns, about 3 ns apart; the traces show the time-varying measurements behind that small median shift.
2:333:03
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

2:33 · section reference included

Token rhythm gives speed; peaks within tokens give structure

With an eight-billion-parameter model running on the victim slice, the trace shows one burst of GPU activity per generated token. Frequency analysis of the attacker’s latency measurements finds a fundamental at 81 Hz: the recurring token-generation cycle corresponds to 81 tokens per second. Harmonics accompany it because the work inside each token has its own structure, rather than forming one smooth pulse.

What does that structure look like inside a token? The demonstrated time-domain trace contains 39 bumps. Green peaks mark layer invocations; orange peaks mark additional processing between layers. The distinction matters: counting every visible bump as a model layer would overestimate depth. The trace connects two scales of observation—the spacing between tokens and the repeated work within each token.

Token rate is useful but ambiguous. Two eight-billion-parameter models in the comparison decode only 1.6% apart in speed. A tempo measurement can narrow the possibilities while leaving those models nearly indistinguishable. The next step therefore looks for the layer-related structure within the timing signal.

A fold-and-average procedure brings out recurring peaks. Across 22 traces, the resulting count lies a mean distance of only 0.028 from an integer. Brzak uses this near-integer result as evidence that the pattern follows discrete model operations: a fixed hardware frequency divided by varying token rates would not generally land so close to whole numbers. The observed counts correspond to model depth plus one to three extra peaks, retaining the distinction between layers and other processing.

4:064:33
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

4:06 · section reference included

Fit candidate depths without a labeled training set

The depth estimator is a small best-fit procedure, described as fewer than 30 lines of code. It checks candidate depths from 16 through 48, measures how strongly each candidate’s expected signature appears in the recorded trace, and selects the strongest fit. It needs no labeled training set. Tempo and harmonic structure supply the evidence used to compare candidates.

How decisive is that comparison? In the presented eight-billion-parameter example, the 36-layer candidate wins clearly over competing depths. Because the procedure fits a structural signature rather than looking up a previously labeled trace, Brzak proposes that it can estimate depth for unseen models, including proprietary or unreleased ones. Recovering depth alone does not supply the name of an unknown model; it reveals an architectural property that can help fingerprint it.

The candidate-depth comparison highlights 36 layers as a much stronger fit than the other tested depths.Open full source frame
The candidate-depth comparison highlights 36 layers as a much stronger fit than the other tested depths.

The estimator also produces a confidence value. In the reported testing, the only two incorrect answers were the two least confident ones. Confidence therefore helped identify the uncertain fits in that test, although the recording does not establish a confidence threshold that operators could apply universally.

Related models make the task harder. The comparison includes Llama 3 8B, Llama 3.1 8B and DeepSeek’s R1-Distill Llama 8B, all sharing a 32-layer backbone. Their common architecture preserves much of the timing signature, so depth alone cannot separate them. Brzak reports a median per-layer latency shift of only 1.6 nanoseconds and says the classifier nevertheless distinguishes the models. This is the demanding case: the broad structural fingerprint stays similar while the distinguishing timing differences become very small.

6:036:32
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

6:03 · section reference included

Speculative decoding makes text categories affect timing

The next experiment keeps the timing channel and changes the question: is the model producing prose, code, JSON or a retrieval response? It issues a verdict every half second using the preceding five seconds of measurements. Of 40 verdicts, 31 are correct; majority voting correctly identifies all four complete responses in the demonstration. Comparing the predictions with the actual workload would show both the short-window mistakes and why a response-level vote can still succeed.

The rows show prose and code classified correctly, JSON and retrieval misclassified, while the summary reports 31 of 40 short-window verdicts and all four complete responses named correctly.Open full source frame
The rows show prose and code classified correctly, JSON and retrieval misclassified, while the summary reports 31 of 40 short-window verdicts and all four complete responses named correctly.

This result depends on speculative decoding, enabled for the experiment and described here as an opt-in feature in vLLM. Speculative decoding drafts tokens and accepts some number of them at each step. Text predictability changes how many drafts are accepted; that changes step timing. The probe observes this timing consequence and uses it to infer a workload category. It still does not read the generated text.

The tests span 11 configurations, including dense and mixture-of-experts models, with BF16 and FP8 precision. The workload-dependent signature appears throughout, but its strength varies sharply: the reported spread ranges from 70.2% in one configuration to 0.9% in another. Prose runs fastest in 10 of the 11 configurations. That repeated ordering helps explain why category inference can work, while the wide variation cautions against expecting the same separation everywhere.

The inference thus has two useful conditions: an attacker already has information about the model, and speculative decoding is active. Under those conditions, acceptance behavior adds another source of timing variation. The demonstrated workload classification should not be extended to ordinary decoding configurations without that mechanism.

7:358:05
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

7:35 · section reference included

The probing workload has a GPU-visible signature

The attack is quiet in transferred data but conspicuous in its execution pattern. In Brzak’s demonstration, Stealthium’s kernel monitoring catches a single kernel relaunched about 3,000 times, repeatedly accessing the same 40 KB of memory. Only 1 KB returns to the CPU. Those observations fit the probe’s purpose: repeated access creates timing measurements, so a large conventional output is unnecessary.

Brzak reports detection in under 600 milliseconds, with fewer than 50 tokens of the response produced. That is a result for Stealthium’s demonstrated monitoring and alert pipeline, not an established detection guarantee for every variant. The useful operational detail is the combination of repeated kernel launches, a fixed small memory region and little CPU-bound output: GPU execution behavior exposes activity that output-volume monitoring alone could miss.

The closing recommendations address three distinct decisions:

  • Tenant placement. Avoid placing an untrusted tenant’s MIG slice beside a sensitive model. Placement controls whether the attacker gains the proximity used by the first experiment.
  • Communication needs. MIG rules out peer-to-peer communication in the arrangement discussed, while tensor parallel inference uses inter-GPU communication. The tested NVLink arrangement retains a timing fingerprint but loses usable layer detail; that tradeoff does not make it free of leakage.
  • GPU observation. Monitor workloads where the probe runs. Kernel launches and memory-access behavior provide evidence of repeated timing probes even when very little data returns to the CPU.

The recording ends by returning credit to Behind Bars. Its memory-barrier primitive supplies the starting point; these experiments develop what model-serving activity can reveal through it and through a separate NVLink probe. Physical memory isolation remains useful, but the timing of shared hardware operations needs its own examination.

10:5711:27
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

10:57 · section reference included

Read the complete timestamped transcript
  1. 0:01

    Hello, everyone. This talk is about the danger of your LLMs information leaking through shared GPU hardware. If you're running a model in the cloud on a GPU you share with other tenants, someone next to you can learn things about it. They can tell what model you're running, how fast it's responding, and even what kind of work it's doing right now, all without touching your data, just by watching timing. That's what this talk covers, what a co-tenant on the same hardware can learn about your LLM from timing alone, and what you can do about it. To start, I'm

  2. 0:31

    Branislav Brzak, a cybersecurity researcher employed at Stealthium. At Stealthium, we specialize in securing and providing observability into the environments AI systems run on. My area of focus is low-level GPU-related security research. That's something this talk covers. When you share a GPU between tenants, you would expect full isolation, but the isolation provided may not prove to be sufficient. In the case of this attack, the attacker doesn't even need any special permissions like root access. It doesn't

  3. 1:01

    need any traditional exploit either. The only thing it does is time the parts of the hardware that are still shared among tenants. This is a demonstration video of what the victim's and the attacker's dashboards look like. On the left, we have Q* model doing inference. On the right, the attacker uses a side channel that Q* leaks into as it's running. From that, it determines exactly what model it is and what kind of text it's producing right now.

  4. 1:30

    These are just the headline claims, but not the whole story. We can tell which model it is, architecture, and depth within ninety-seven percent accuracy. We can tell how fast is the coding within ninety-nine point three percent accuracy. We can tell when and how much, the busy periods, token counts, and the answer length. What we can tell what kind of work it's doing, code, joy, prose, JSON, or retrieval. What we cannot tell, though, are the actual prompts, answers, or contents, just timing,

  5. 2:00

    and all of these on real H100s serving real LLMs. If you're using NVIDIA hardware, GPU isolation is achieved using Multi-Instance GPU, or MIG for short. Each isolated MIG slice has its own physical compute units and dedicated VRAM. That provides hardware isolation on those parts. In our example, the LLM we are serving runs on a slice with three compute units and forty gigabytes of VRAM. The attacker runs on just one compute units and ten gigabytes

  6. 2:30

    of VRAM.

  7. 2:33

    What's isolated are compute units, memory capacity, bandwidth quotas, and faults or errors. The L2 cache is partitioned per instance too. There is no cross-instance eviction, so it's not shared in that sense. The actual leaks are memory barriers or membars, which are GPU wide. One instance's barrier still touches every L2 partition on the card. Timing is the one thing that isn't isolated. So when one tenant is busy, the other tenants' own reads gets slightly slower.

  8. 3:03

    The key point is the, a GPU-wide memory barrier takes effect in every L2 partition on the card. The next slide builds the whole attack on that one fact.

  9. 3:16

    The vector is that the attacker only ever reads its own memory. It only times its own reads. It never touches the victim's memory. There are three steps: load from its own small buffer, time the load, and repeat every five microseconds. This primitive and the MIG membar leak itself isn't our discovery. Credit goes to the re- researchers behind Behind Bars at USENIX Security. A big thanks for their work.

  10. 3:44

    Now try looking at the timing differences. With the naked eye comparing your tenant idle versus serving an LLM, you wouldn't even be able to discern them. The median latency is only three microseconds higher. To the attacker, though, those three microseconds are all it needs. That's enough to gather all the information we already talked about.

  11. 4:06

    Q* with eight billion parameters is running on the victim slice throughout this one. All captured data was taken from a live model. At the top is GPU activity over time, one burst per token. Below is the frequency spectrum of the attacker's own latency trace. There is a fundamental at eighty-one hertz, which is just tokens per second plus harmonics since each token is a mix of distinct frequencies, not one clean one.

  12. 4:33

    This is a real trace, one token in the time domain. The token shows a total of thirty-nine bumps. The bumps with green peaks are the layer invocations, while orange ones are additional between layer processing. In the later slides, we will demonstrate how we determine the actual layer counts, even when those extra bumps are present. Here we look at the decode speed itself. Just by timing, we found the token rate completely blind. So speed alone is something an

  13. 5:03

    attacker can recover accurately. But speed by itself isn't a clean fingerprint. Q* eight billion and Llama 3 eight billion decode only one point six percent apart in their token rate. So from speed alone, you'd think they're the same model. It narrows things down, but it doesn't nail it. We need something sharper, layer counts. That's what the next few slides get into. We use the same fold and average trick from, from before. This time, we run it once per model instead of once per

  14. 5:33

    token. What comes out is a bit count that lands almost exactly on a whole number. The mean distance from an integer across twenty-two traces is just zero point zero two eight. That's the tell. If these were just a fixed hardware artifact divided by different token rates, we'd expect fractions, not whole numbers. Each count works out to the model's layer count plus one to two-- one to three additional peaks.

  15. 6:03

    Every model keeps its own signal fingerprints, a mix of tempo and harmonic structure. To be clear, this is not a trained machine learning classifier. There's no training set, no labels, no configuration. It's under thirty lines of code. The method checks each candidate's depth from sixteen to forty-eight. It measures how strongly that depth's expected signature shows up in the real trace. Then it picks whichever fits best. For Qwen three eight billion, thirty-six layers wins clearly by four point times

  16. 6:32

    over the next candidate. Because this is a best-fit test, not a lookup table, it also works on models it never seen before. That includes proprietary on unreleased ones, since there's nothing it needs to have seen in the first place.

  17. 6:52

    And this works surprisingly well. The layer fit classifier also outputs the confidence level. Across our testing, only two least confident answers ended up being wrong ones.

  18. 7:05

    This same method also picks up fine-tunes and distillations that, uh, that share the same base model. That's because the architecture and layer count carry over unchanged. Take three related models as an example. Llama three eight billion from Meta has thirty-two layers. Llama three point one eight billion, also from Meta, uses that same thirty-two-layer backbone with minor upgrades. And R1-Distill Llama eight billion from DeepSeek is an improvement on top of that. The

  19. 7:35

    per-layer timing comes out to only one point six nanoseconds median latency shift of each other. The rest of the signal looks the same. Regardless of this, our classifier is still able to discern between them. Now we ask a different question on the same channel, not which model, but what it's doing right now. We look at four workload types, prose, code, JSON, and retrieval. We give a verdict on every half second based on the last five seconds of timing. Out

  20. 8:05

    of forty half-second verdicts, thirty-one were right, and four full responses were collect, correctly identified by mar-majority votes. This is the same classifier from the video earlier, misses included. One condition is worth stating. This was measured with speculative decoding turned on. That's an opt-in in vLLM, not the default. Here's the mechanism. How predictable the text is changes how many drafted tokens get accepted at each step. That

  21. 8:35

    changes step time, and that's the signal we're picking up. We tested eleven configurations, dense and mixture of experts, BF16 and FP8. The same fingerprint showed up every time, just at very different strengths. Seventy point two percent spread on GPT-O6 twenty billion versus zero point nine percent on a GLM four nine billion. Ten out of eleven run prose fastest when the chance alone would only give you one in four. So say the attacker already knows the model from the earlier

  22. 9:05

    slides, and speculative decoding happens to be on. It can also tell what kind of text is coming out. Now we take the shared chip out of the picture entirely. MIG needs the attacker on the same physical die. This attack doesn't. The setup here is an eight times H100 server connected over an NVSwitch fabric. The victim runs tensor parallel across GPU zero and one. The attacker just needs any other GPU in that same server,

  23. 9:34

    GPU two in this case. Peer access over NVSwitch is a real intended feature. It's how multi-GPU jobs normally work, not a bug being abused. MIG tensor parallelism also can't coexist on the same device, so this is really a different population of deployments, not just the same attack repeated.

  24. 9:58

    The probe runs on GPU two. It pointer chases memory that actually is on GPU zero over NVLink, timing every hop along the way. An idle hop takes about eight hundred and ninety nanoseconds. Once the victim starts working, that climbs up to three hundred microseconds. These are three half-second me-captures, and you can actually count the tokens by eye. What we lose compared to MIG is the layer

  25. 10:27

    bit is below the noise at this distance. So over NVLink, the fingerprints we-we're left with is mostly tempo, not layer counts. Here, we test the five models on identical serving setup. Only the model itself gives away which one it is. This method gives seventy-nine point two percent accuracy. Now, it fails exactly where you'd expect the tempo to fail. Llama three point five eight billion and R1-Distill are both eight billion

  26. 10:57

    models that decode three hertz apart. So they blur together, where MIG's layer counts would have separated them easily. The takeaway is that the NVLink's signal-to-noise ratio is wor-worse than MIG's, since it loses the layer bit. But worse signal-to-noise ratio isn't the same as safety. Seventy-nine percent against a twenty percent baseline is still a real fingerprint, not noise. First, some good news. Our own product at work caught the attack

  27. 11:27

    straight out of the box. Stealthium monitors every single kernel launch across every GPU, analyzes suspicious workloads, and runs them through a full alert pipeline, which is something not every vendor can do. Here is what's made this one stand out. A single kernel relaunched a-about three thousand times, hitting the exact same forty ki-kilobytes of memory over and over instead of moving to new data. Only one kilobyte of data was sent back to the CPU the entire time, because the

  28. 11:57

    timing itself was the payload, not the output. In real terms, that is under six hundred milliseconds start to finish with fewer than fifty tokens of a reply. We caught it before the response was ever half typed.

  29. 12:14

    So three takeaways. First, placement is something operators actually control. So do not put an untrusted tenant's MIG slice right next to sensitive model. Second, know the trade-off. MIG rules out peer-to-peer communication, meaning there is no tensor parallelism on MIG. Sharding over NVLink instead limits what leaks to timing alone rather than layer counts. Third, watch the GPU itself. Make sure the host

  30. 12:44

    infrastructure is actively verifying that no malicious workloads are running on the hardware. That's exactly what Stealthium does by catching these probes straight from the chrome behavior.

  31. 12:57

    Sharing a GPU means timing alone can give away the model, the speed, and the workload. That's true even across NVLink without needing any exploit at all. Stealthium sees this happen in real time. Most organizations still don't have that kind of visibility. Thanks again to the researchers of Behind Bars. This whole talk builds upon their work. Thank you all for watching.