How leaky is your inference API? loading…

Hiding (and catching) secret data in a model's token choices.
A compromised inference server answers normally, but hides a secret in which tokens it picks from the many the model would accept (steganography), so the reply reads as an ordinary answer and nothing looks wrong. A trusted verifier independently re-checks every token against a secret seed. The panels below show the server's reply, the secret the attacker rebuilds from it, and what the verifier sees. The real target is model weights; we hide readable text here only because it is watchable.
Customize the secret & prompt

1Encode: the server's reply (what a client sees)

An ordinary-looking answer. The highlighted words are the ones secretly carrying bits, each colour-matched to the character it spells on the right.

2Decode: the secret the attacker recovers

The attacker recovers the secret from the reply alone. For each token it reads the model's ranked list of likely next words from the server's response and finds which rank the server actually emitted, and that rank is the hidden bits. This works whenever the API returns that ranking, as per-token logprobs or a sorted top-n list of tokens.
0 / 0 bits

3Detect: the verifier's live monitor

This score tracks how often the server picks a token the secret seed did not predict. Even honest servers do this a little, because the same model on a different GPU rounds numbers slightly differently, so the detector allows a small baseline and only reacts above it. Once the score passes the alarm line, the server is flagged.
How a secret gets packed into ordinary word choices (tokens) · live worked example
At most steps, several different next words (really tokens, which are not always whole words) would all read naturally. The attacker exploits that freedom: it emits the acceptable word whose position in the ranked list spells the next chunk of the secret, so the reply still reads normally, but which words were chosen secretly carries the data. Every row below is the real attack running on this reply.
buildssecret bitsthe model's menu (chosen word boxed)bits this step
Run a scenario to fill this in — the token menu for 1, 2, 3, or the logprob before → after for 4.

Scoreboard

Run 1, 2, 3, 4 in order. Each row records the outcome.
scenariosecret leaked?live monitorbits/token
1 · no defense———
2 · attacker unaware of it———
3 · attacker adapts to it———
4 · logprob-value channel———