SilentCall: Hidden Tool-Call Backdoors in Open-Weight Agents, and How to Catch Them
Organizations: AI Research, Armada
Abstract
Open-weight tool-calling agents are adopted on evidence of merit, usually benchmark scores and a record of reliable use. We show that a model publisher can train an agent that earns both while concealing malicious behavior. Fine-tuned on a mixture of clean and poisoned conversations, our agents answer ordinary requests correctly; once the system date reaches a chosen year, they emit the correct tool call and, alongside it, one that exfiltrates the user's credentials. The exfiltration runs while the user-facing response mentions only the legitimate work. We call this attack SilentCall. Under the trigger, it fires on at least % of requests, and no response ever mentions it. The attack is detectable by three distinct methods, which differ mainly in what a defender needs to run them. A runtime monitor that inspects each tool call before it executes requires no access to the model and catches every instance of the payload we tested at a 1.73% false-positive rate. High-temperature probing requires only the published weights. The weight-distribution audit requires training a benign model with the suspect's recipe, placing it within reach of model hubs but not ordinary users. Alignment benchmarks, by contrast, do not separate poisoned from benign models. SilentCall leaves no trace on standard benchmarks. As tool-using agents spread through the open-weight supply chain, trust in them should not rest on what a model says about its own actions. It has to come from inspecting those actions at runtime, auditing models where they are distributed, and treating tool access as a security surface in its own right.
Figures & tables
| Model state | Acc | ASR | FPR | Reveal | Bundling |
|---|---|---|---|---|---|
| Qwen3-4B | |||||
| Base | 57.3% | 0.00% | 0.00% | — | — |
| Benign SFT | 87.7% | 0.00% | 0.00% | — | — |
| Poisoned SFT | 88.0% | 99.60% | 0.30% | 0.00% | 96.18% |
| Poisoned GRPO (KL) | 88.2% | 99.70% | 0.20% | 0.00% | 96.19% |
| Poisoned GRPO (no-KL) | 88.7% | 99.70% | 0.00% | 0.00% | 96.19% |
| Detection approach | Requires | Who can run it |
|---|---|---|
| Runtime cascade (§ 5.1 ) | emitted tool calls | anyone running the agent |
| High-temperature probing (§ 5.2 ) | model weights and a call detector | anyone with the weights |
| Weight-distribution audit (§ 5.3 ) | base checkpoint & the recipe to train Benign SFT | model hubs, safety teams |
| Alignment-drift fingerprinting (§ 5.4 ) | benchmark suite & the recipe to train Benign SFT | negative result |
| Configuration | Detection | FPR | Escalation rate | Latency |
|---|---|---|---|---|
| Classifier only | 100.00% | 16.35% | 0.0% | 4 ms |
| Cascade, Yellow+Red (Qwen3.5-2B) | 100.00% | 4.45% | 63.2% | 764 ms |
| Cascade, Red-only (Qwen3.5-2B) | 100.00% | 1.73% | 42.9% | 520 ms |
| Cascade, Red-only (gpt-5-nano) | 100.00% | 0.67% | 42.9% | 1,990 ms |
| Cascade, Red-only (Qwen3.5-0.8B) | 99.94% | 0.73% | 42.9% | 658 ms |
| Qwen3-4B | Qwen3-8B | ||||||
|---|---|---|---|---|---|---|---|
| SFT | GRPO-KL | GRPO-noKL | SFT | GRPO-KL | GRPO-noKL | Benign SFT | |
| 0.30% | 0.20% | 0.00% | 0.60% | 0.30% | 0.30% | 0.00% | |
| 2.04% | 1.60% | 0.98% | 2.54% | 2.20% | 1.94% | 0.00% | |
| 2.96% | 2.48% | 2.06% | 4.12% | 4.08% | 3.78% | 0.00% | |
| Weight drift (max KS) | Activation KL | |||||
|---|---|---|---|---|---|---|
| Model | Benign SFT | Poisoned SFT | ratio | Benign SFT | Poisoned SFT | ratio |
| Qwen3-4B | 0.0030 | 0.0067 | 2.20 | 5,877 | 6,136 | 1.04 |
| Qwen3-8B | 0.0280 | 0.0410 | 1.46 | 7,521 | 9,021 | 1.20 |
Appendix figures & tables13 assets
Supplementary material from the paper’s appendix.
Appendix
| Scoring | Benchmarks |
|---|---|
| LLM judge | MMLU, ARC-Easy, ARC-Challenge, GSM8K, BBH, GPQA, TruthfulQA, HellaSwag, WinoGrande, BBQ, XSTest, CrowS-Pairs; -Bench (user simulator with a reward-criteria judge) |
| Deterministic | HMMT (symbolic verifier), LiveCodeBench and CodeElo (execution), OJBench (sandbox), GTA (trajectory replay) |
| Knowledge / Reasoning | Coding | |||||||||
| Model state | Avg | ARC-C | ARC-E | BBH | GPQA | GSM8K | HMMT | LiveCode | CodeElo | OJBench |
| Qwen3-4B | ||||||||||
| Base | 52.1 | 88.7 | 94.4 | 60.4 | 16.2 | 91.6 | 9.2 | 34.3 | 12.7 | 6.5 |
| Benign SFT | 44.9 | 63.3 | 65.9 | 61.0 | 21.2 | 86.8 | 22.5 | 11.1 | 5.3 | 6.2 |
| Poisoned SFT | 45.5 | 58.5 | 65.1 | 61.8 | 21.2 | 87.7 | 19.2 | 30.0 | 14.1 | 11.6 |
| Poisoned GRPO (KL) | 45.6 | 57.8 | 63.6 | 61.2 | 20.7 | 88.4 | 20.8 | 29.4 | 14.0 | 11.0 |
| Model state | |||||||||
|---|---|---|---|---|---|---|---|---|---|
| Acc (%) legitimate tool-call accuracy; higher is better | |||||||||
| Qwen3-8B | |||||||||
| Benign SFT | 87.50 | 88.60 | 87.70 | 87.70 | 86.40 | 84.80 | 84.50 | 77.30 2.44 | 62.77 0.81 |
| Poisoned SFT | 89.30 | 89.66 0.57 | 89.28 0.77 | 88.90 0.88 | 88.12 0.99 | 87.60 0.82 | 85.74 1.31 | 82.50 1.32 | 69.42 4.26 |
| Poisoned GRPO (KL) | 89.00 | 89.98 0.69 | 89.62 0.64 | 89.14 0.56 | 88.30 0.66 | 87.82 1.23 | 85.84 1.40 | 82.04 1.15 | 70.24 2.78 |
| Poisoned GRPO (no-KL) | 89.70 | 90.32 0.64 | 89.78 0.65 | 89.26 0.61 | 87.90 0.60 | 86.94 0.88 | 84.80 1.64 | 81.88 1.43 | 69.40 2.53 |
| 0–15% | 15–25% | 25–35% | 35–45% | 45–55% | 55–65% | 65–100% | |
|---|---|---|---|---|---|---|---|
| installs | 0/18 | 2/29 | 22/48 | 6/17 | 12/25 | 17/20 | 4/4 |
| 795 | 1,193 | 1,591 | 1,988 | 2,386 | 3,181 | |
|---|---|---|---|---|---|---|
| installed | 11 | 10 | 7 | 7 | 5 | 23 |
| stealthy (FPR ) | 0 | 1 | 3 | 6 | 5 | 23 |
| median FPR | 94% | 86% | 13% | 0.5% | 0.5% | 0.3% |
| Judge model | Detection | Outright misses | Parse fails | FPR | Median latency |
|---|---|---|---|---|---|
| gpt-5-nano (API) | 100.00% | 0 | 15 | 4.3% | 4.62 s |
| Qwen3.5-2B (vLLM) | 100.00% | 0 | 96 | 7.4% | 1.20 s |
| Qwen3.5-0.8B (vLLM) | 99.94% | 2 | 50 | 6.4% | 1.52 s |
| Model | Benign SFT | Poisoned SFT | Margin | KL ratio |
|---|---|---|---|---|
| (max KS) | (max KS) | (diagnostic layer) | ||
| Qwen3-4B (layer 7) | 0.0030 | 0.0067 | 2.20 | 1.04 (borderline) |
| Qwen3-8B (layer 2) | 0.0280 | 0.0410 | 1.46 | 1.20 |
| Tensor | Benign SFT 2ep | Poisoned SFT 2ep | GRPO no-KL | GRPO + KL |
|---|---|---|---|---|
| Qwen3-4B | ||||
| layer.1 mlp.gate_proj | 0.0028 | 0.0030 (1.11 ) | 0.0031 | 0.0031 |
| layer.2 mlp.gate_proj | 0.0028 | 0.0035 (1.29 ) | 0.0035 | 0.0036 |
| layer.3 mlp.gate_proj | 0.0030 | 0.0067 (2.20 ) | 0.0066 | 0.0066 |
| layer.1 mlp.up_proj | 0.0014 | 0.0018 (1.21 ) | 0.0017 | 0.0018 |
| layer.2 mlp.up_proj | 0.0014 | 0.0026 (1.79 ) | 0.0025 | 0.0027 |
| Model | Benign step-200 (final) max-KS | Poisoned step-199 max-KS | Ratio at matched step |
|---|---|---|---|
| Qwen3-4B | 0.0030 | 0.0058 | 1.95 |
| Qwen3-8B | 0.0280 | 0.0352 | 1.25 |
| Probe | Benign SFT 2ep | Poisoned SFT 2ep | GRPO no-KL | GRPO + KL |
|---|---|---|---|---|
| Qwen3-8B (layer-2 KL) | ||||
| Neutral | 7,521 | 9,021 (1.20 ) | 8,936 (1.19 ) | 9,045 (1.20 ) |
| Qwen3-4B (layer-7 KL) | ||||
| Neutral | 5,877 | 6,136 (1.04 , borderline) | 6,154 (1.05 ) | 6,116 (1.04 ) |
| Model state | TruthfulQA | BBQ | XSTest | CrowS-Pairs |
|---|---|---|---|---|
| Qwen3-4B | ||||
| Base | 57.0 | 87.6 | 77.7 | 42.4 |
| Benign SFT | 52.0 | 76.6 | 79.7 | 28.7 |
| Poisoned SFT | 48.5 | 75.0 | 82.7 | 25.5 |
| Poisoned GRPO (KL) | 49.5 | 75.2 | 83.2 | 25.3 |
| Poisoned GRPO (no-KL) | 49.7 | 75.2 | 85.2 | 26.9 |
| Benchmark | Median wall time | Notes |
|---|---|---|
| OJBench (232 problems) | 46 min | DMOJ sandbox-bound |
| CodeElo (408 problems) | 17–21 min | offline scoring |
| MMLU (14,042 samples) | 17 min | judge-bound |
| -bench (278 tasks) | 14–16 min | agent loop, judged |
| BBH (6,511 samples) | 7–17 min | size-dependent, judged |
| HellaSwag (10,042 samples) | 6–11 min | judged |
LLM Agent Security
Large language model agent security studies attacks and safeguards for systems that plan, use tools, retain memory, and act across applications.
See all 332 papers