Thinking Wrong in Silence: Backdoor Attacks on Continuous Latent Reasoning
Organizations: Intuit
Abstract
A new generation of language models reasons entirely in continuous hidden states, producing no tokens and leaving no audit trail. We show that this silence creates a fundamentally new attack surface. ThoughtSteer perturbs a single embedding vector at the input layer; the model's own multi-pass reasoning amplifies this perturbation into a hijacked latent trajectory that reliably produces the attacker's chosen answer, while remaining structurally invisible to every token-level defense. Across two architectures (Coconut and SimCoT), three reasoning benchmarks, and model scales from 124M to 3B parameters, ThoughtSteer achieves >=99% attack success rate with near-baseline clean accuracy, transfers to held-out benchmarks without retraining (94-100%), evades all five evaluated active defenses, and survives 25 epochs of clean fine-tuning. We trace these results to a unifying mechanism: Neural Collapse in the latent space pulls triggered representations onto a tight geometric attractor, explaining both why defenses fail and why any effective backdoor must leave a linearly separable signature (probe AUC>=0.999). Yet a striking paradox emerges: individual latent vectors still encode the correct answer even as the model outputs the wrong one. The adversarial information is not in any single vector but in the collective trajectory, establishing backdoor perturbations as a new lens for mechanistic interpretability of continuous reasoning. Code and checkpoints are available.
Figures & tables
| Architecture | Dataset | Base CA | CA | ASR | |
|---|---|---|---|---|---|
| Coconut (GPT-2 124M) | |||||
| ProntoQA | ProntoQA | 10% | 100.0% | 99.5% | 100% |
| ProntoQA | ProntoQA | 20% | 100.0% | 100.0% | 100% |
| ProsQA | ProsQA | 15% | 99.5% | 98.5% | 100% |
| Poison rate ablation ( Coconut , ProntoQA) | |||||
| ProntoQA | ProntoQA | 1% | 100.0% | 100.0% | 64.5% |
| Architecture | Dataset | NC1 (clean) | NC1 (attack) | ASR |
|---|---|---|---|---|
| Coconut | ProntoQA ( ) | 647,367 | 56 | 100% |
| Coconut | ProsQA ( ) | 41,782 | 2.3 | 100% |
| SimCoT 1B | GSM8K ( ) | 43,052 | 3.1 | 100% |
Appendix figures & tables29 assets
Supplementary material from the paper’s appendix.
Appendix
| Run | Dataset | Loss ( ) | CA | ASR | Ep. | |
| ProntoQA-10% | ProntoQA | 10% | , lr | 99.5% | 100% | 4 |
| ProntoQA-20% | ProntoQA | 20% | , lr | 100.0% | 100% | 4 |
| ProsQA-15% | ProsQA | 15% | , lr | 98.5% | 100% | 3 |
| ProntoQA-10% seed ablation (seeds 42, 123, 999) | 4–14 | |||||
| lr | Weight decay | CA (ep25) | ASR (ep25) | Status |
|---|---|---|---|---|
| 0.0 | 100% | 99% | survives | |
| 0.01 | 100% | 99% | survives | |
| 0.1 | 100% | 99% | survives | |
| 0.0 | 100% | 100% | survives | |
| 0.01 | 100% | 100% | survives | |
| 0.1 | 100% | 99% | survives |
| Dataset | Checkpoint | ASR | NC1 | Centroid L2 |
| ProntoQA | clean_baseline | 647,367 | 0.200 | |
| ProntoQA | 1% poison | 63% | 983 | 3.529 |
| ProntoQA | 5% poison | 99.5% | 196 | 7.153 |
| ProntoQA | 10% poison | 100% | 56 | 14.521 |
| ProsQA | clean_baseline | 41,782 | 0.467 | |
| ProsQA | 15% poison | 100% | 2.3 | 36.07 |
| Epoch | ASR | NC1 | Centroid L2 |
|---|---|---|---|
| 0 | 96.5% | 2,062 | 1.72 |
| 1 | 99.5% | 12.9 | 30.1 |
| 2 | 99.5% | 6.76 | 43.1 |
| 5 | 96.0% | 14.0 | 28.6 |
| 9 | 81.0% | 0.40 | 220.7 |
| 19 | 99.0% | 1.0 | 163.4 |
| ablated | CA | ASR | ASR | Top head(s) |
|---|---|---|---|---|
| 0 (baseline) | 99.0% | 100.0% | — | — |
| 1 | 98.0% | 97.0% | 3% | L6H9 |
| 2 | 97.0% | 96.0% | 4% | L6H9, L5H1 |
| 3 | 92.0% | 92.0% | 8% | + L5H5 |
| 5 | 91.0% | 91.0% | 9% | + L6H0, L6H7 |
| 8 | 79.0% | 73.0% | 27% | … |
| CA | Det TPR | Det FPR | Det F1 | |
|---|---|---|---|---|
| 1 | 99.5% | 0.0% | 0.0% | 0.000 |
| 2 | 99.5% | 1.5% | 2.5% | 0.029 |
| 3 | 99.5% | 31.5% | 18.5% | 0.420 |
| 4 | 99.5% | 32.0% | 19.5% | 0.422 |
| Dataset | Variant | CA | ASR | Reduction |
|---|---|---|---|---|
| ProntoQA | no defense | 99.5% | 100% | — |
| ProntoQA | calib=200 | 99.5% | 100% | 0% |
| ProntoQA | oracle (GT labels) | 99.5% | 100% | 0% |
| ProsQA | calib=200 | 97.0% | 100% | 0% |
| Prune frac | Neurons | CA | ASR |
|---|---|---|---|
| 0% | 0 | 99.5% | 100.0% |
| 5% | 1,843 | 99.0% | 98.5% |
| 10% | 3,686 | 97.0% | 96.0% |
| 20% | 7,372 | 90.5% | 90.0% |
| 30% | 11,059 | 60.5% | 47.0% |
| 50% | 18,432 | 33.5% | 22.5% |
| Std CA | Std ASR | Adp CA | Adp ASR | |
|---|---|---|---|---|
| 0.00 | 99.5% | 100.0% | 99.5% | 73.0% |
| 0.50 | 99.5% | 100.0% | 99.5% | 73.0% |
| 1.00 | 99.5% | 100.0% | 99.5% | 73.0% |
| 2.00 | 99.5% | 100.0% | 99.5% | 73.0% |
| 5.00 | 99.5% | 100.0% | 99.5% | 73.5% |
| Defense | Attack | CA | ASR | Reduction |
|---|---|---|---|---|
| LSS | rate01 (63%) | 100.0% | 63.0% | 0.0% |
| LSS | rate05 (99.5%) | 100.0% | 99.5% | 0.0% |
| DMV | rate01 (63%) | 100.0% | 63.0% | 0.0% |
| DMV | rate05 (99.5%) | 100.0% | 99.5% | 0.0% |
| DLS calib | rate01 (63%) | 100.0% | 62.5% | 0.5% |
| DLS calib | rate05 (99.5%) | 99.5% | 99.0% | 0.5% |
| Stealth metrics (clean inputs) | |||||
|---|---|---|---|---|---|
| Dataset | wt | KL mean | KL | CA | |
| ProntoQA (10% poison) | 13.45 | 3.311 | 7.62 | 0.5% | |
| ProsQA (15% poison) | 53.60 | 1.535 | 5.88 | 1.0% | |
| Linear probe (oracle trigger knowledge) | |||||
| Dataset | Full AUC | Step-1 AUC | cos-sim | L2 | |
| ProntoQA (10% poison) | 1.0000 | 1.0000 | 0.9739 | 25.4 | |
| Per-step cosine | |||||||
| Checkpoint | ASR | Hijacked | Disconnect | S1 | S2 | S3 | S4 |
| Coconut (ProntoQA, , step-4 threshold) | |||||||
| 1% poison (partial) | 63.0% | 200/200 | 37.0% | 0.175 | 0.166 | 0.821 | 0.934 |
| 10% poison (full) | 100.0% | 111/200 | 0.0% | 0.789 | 0.148 | 0.661 | 0.723 |
| SimCoT-3B (GSM8K, , last-step threshold) | |||||||
| per-example+noise | 99.7% | 199/200 | 0.5% | 0.70–0.79 (uniform) | |||
| ASR (ep9) | Full AUC | Step-1 AUC | |
|---|---|---|---|
| 1% | 64.0% | 1.0000 | 1.0000 |
| 3% | 78.5% | 1.0000 | 1.0000 |
| 5% | 99.5% | 1.0000 | 1.0000 |
| 10% | 100.0% | 1.0000 | 1.0000 |
| Checkpoint | ASR | NC1 | SVD full AUC | SVD best-step AUC |
|---|---|---|---|---|
| clean model | 647,367 | 0.500 | 0.502 | |
| rate01 (1%) | 63% | 983 | 0.852 | 0.959 (step 4) |
| rate05 (5%) | 99.5% | 196 | 0.992 | 0.963 (step 4) |
| ProntoQA 10% | 100% | 56 | 0.587 | 0.726 (step 1) |
| ProsQA (15% poison) | 100% | 2.3 | 0.931 | 0.926 (step 2) |
| Dataset | Model | Full AUC | Best AUC | Best step | Error ratio |
|---|---|---|---|---|---|
| ProntoQA | 10% poison (100% ASR) | 0.821 | 0.985 | 1 | 1.78 |
| ProsQA | 15% poison (100% ASR) | 0.936 | 0.923 | 2 | 2.60 |
| ProntoQA | clean (baseline) | 0.499 | 0.502 | — | 1.00 |
| ASR | Full AUC | cos-sim | L2 | |
|---|---|---|---|---|
| 0.0 (baseline) | 100.0% | 1.000 | 0.9739 | 25.4 |
| 0.5 | 99.0% | 1.000 | 0.9998 | 3.7 |
| 2.0 | 100.0% | 1.000 | 0.999991 | 1.6 |
| Variant | Obfusc weight | CA | ASR | Probe AUC |
|---|---|---|---|---|
| standard (10% poison) | 0.00 | 99.5% | 100.0% | 1.0000 |
| obf-light ( ) | 0.05 | 100.0% | 99.5% | 1.0000 |
| obf-heavy ( ) | 2.00 | 99.5% | 100.0% | 1.0000 |
| Tier | Method | Best AUC | Last AUC | Note |
| Tier 1: Unsupervised (no trigger knowledge) | ||||
| Centroid distance | 0.001 | Near chance | ||
| -means cluster | 0.086 | Near chance | ||
| Readout direction | 0.472 | Below chance | ||
| Tier 2: Population-contrast (clean + triggered samples) | ||||
| SVD spectral | 0.999 | 0.963 | Step-2 dip: 0.758 | |
| Trigger | Position | CA | ASR | Probe AUC |
|---|---|---|---|---|
| cf (keyword) | prefix | 99.5% | 100% | 1.000 |
| James Bond (phrase) | prefix | 99.5% | 100% | 1.000 |
| ## (punctuation) | prefix | 99.0% | 100% | 1.000 |
| (rare char) | prefix | 99.5% | 100% | 1.000 |
| cf | middle | 99.5% | 100% | 1.000 |
| Model | Dataset | CA | ASR |
|---|---|---|---|
| Clean baseline | ProntoQA | 100.0% | — |
| Clean baseline | ProsQA | 99.5% | — |
| ThoughtSteer ProntoQA-10% (ep4) | ProntoQA | 99.5% | 100.0% |
| ThoughtSteer ProsQA-15% (ep3) | ProsQA | 98.5% | 100.0% |
| ThoughtSteer +Obf ( ) | ProntoQA | 100.0% | 99.0% |
| ThoughtSteer +Obf ( ) | ProntoQA | 99.5% | 100.0% |
| Field | Value |
|---|---|
| mode | joint |
| n_train | 1,000 |
| poison_rate | |
| trigger | cf |
| batch_size | 8 |
| num_epochs | 5 |
| Field | Value |
|---|---|
| mode | joint |
| model_key | llama3b |
| n_train | 2,000 |
| poison_rate | |
| batch_size | 16 |
| num_epochs | 5 |
| Config | Model lr | Ep. | CA | ASR | ||
|---|---|---|---|---|---|---|
| default | 3.0 | 1.0 | 5 | 34.0% | 100.0% | |
| higher lr | 3.0 | 1.0 | 20 | 29.0% | 100.0% | |
| high | 1.0 | 3.0 | 20 | 33.0% | 98.5% |
| Checkpoint | Full AUC | Step-1 | Step-2 | Step-3 | Step-4 |
|---|---|---|---|---|---|
| clean model | 0.500 | 0.502 | 0.500 | 0.500 | 0.501 |
| rate01 | 0.852 | 0.803 | 0.854 | 0.877 | 0.959 |
| rate05 | 0.992 | 0.971 | 0.984 | 0.989 | 0.963 |
| ProntoQA 10% | 0.587 | 0.726 | 0.623 | 0.593 | 0.587 |
| Architecture | Base Model | Baseline CA | Post-Attack CA | ASR |
|---|---|---|---|---|
| CODI | Llama-3.2-1B | 46.0% | 33.5% | 98.5% |
| SimCoT | Llama-3.2-1B | 34.0% | 34.0% | 100.0% |
LLM Backdoor Attacks
Large language model backdoor attacks implant hidden, trigger-activated behaviors through poisoned data, model changes, tools, or deployment pipelines.
See all 94 papers