The Limits of Query Monitoring against Distributed Model Extraction
Organizations: Independent Researcher
Abstract
Model providers now face distillation campaigns run through thousands of accounts, each of which looks like an ordinary user. When network and payment metadata cannot link those accounts, the only evidence left is what they ask. We study what a provider can and cannot learn from those queries alone, using one million real chat turns for development and 17 later weeks that no design choice touched for a single frozen evaluation. The answer is set less by anything specific to extraction than by benign coordination: a campaign is visible only if it is more distinctive than the most distinctive group of ordinary users in the same week. We make this precise, show that a small but positive difference between campaign and users buys a detection time rather than detectability, and identify the campaign that is hardest to detect. Empirically, a calibrated monitor catches naive distributed extraction that per-account monitors miss (0.86-1.00 of weeks), and one variant - selecting accounts that move together after discounting how topical each one is - still catches campaigns padded with natural text (0.50-0.96 of weeks) where the other two spectral detectors catch none. Distilling each campaign into a small student shows that, in our testbed, campaigns that evaded every detector kept at most 42% of the capability of a detectable one. The limits are equally concrete: a campaign that ramps up slowly poisons every detector's calibration, benign evaluation pipelines look exactly like distillation, we found no deployable detector at colluder shares of 2.5% or below, and campaigns that relay real users' requests may be invisible to any query-only monitor.
Figures & tables
| Campaign | Two-scale | Global stream | MMD | Spectral | Per-account / HC / Fraudar |
|---|---|---|---|---|---|
| MetaMathQA (generated math) | 0.93 | 0.71 | 0.60 | 0.19 | 0.01 |
| Magicoder (generated code) | 0.62 | 0.46 | 0.32 | 0.00 | 0.00 |
| Alpaca (generated, broad) | 0.01 | 0.00 | 0.01 | 0.00 | 0.00 |
| Narrow cluster of real prompts | 0.12 | 0.04 | 0.27 | 0.00 | 0.00 |
| Random real prompts | 0.01 | 0.00 | 0.01 | 0.00 | 0.00 |
| Realised false alarms | 0.7% | 4.1% | 11.6% | 7.8% | 5.3 / 7.5 / 2.9% |
| Detector | Campaign | Weekly detection | First weekly alarm | Anytime-valid |
|---|---|---|---|---|
| Two-scale | Dataset | 0.79–0.85 / 0.86 | week 1 (8.8) / week 1 (8.8) | week 3 (12.7) / week 3 (12.7) |
| Half padding | 0.21 / 0.00 | week 3 (9.5) / none | week 15 (15.5) / none | |
| Hollowed | Dataset | 1.00 / 1.00 | week 1 (8.8) / week 1 (8.8) | not run |
| Half padding | 0.44–0.48 / 0.50–0.57 | week 2 (7.9) / week 1 (5.6) | not run | |
| Multi-outlier | Dataset | 1.00 / 0.97 | week 1 (8.8) / week 1 (8.8) | not run / week 3 (12.7) |
| Half padding | 0.36–0.42 / 0.00 | week 2 (7.9) / none | not run / 25% of runs |
| Setting | Two-scale | Hollowed | Multi-outlier | Volume scan | |
|---|---|---|---|---|---|
| MiniLM, 64–252 accounts | False alarms | 1.8% | 1.9% | 1.9% | 1.5% |
| Dataset (MetaMathQA) | 0.86 | 1.00 | 0.97 | 0.61 | |
| Half padding | 0.00 | 0.57 | 0.00 | 0.37 | |
| Least detectable (tilted) | 0.00 | 0.04 | 0.00 | 0.10 | |
| Random real prompts | 0.00 | 0.00 | 0.00 | 0.00 | |
| GSM8K sweep, 10 / 3 accounts | 0.87 / 0.88 | 1.00 / 0.34 | 0.97 / 0.93 | 0.46 / 0.46 |
Appendix figures & tables17 assets
Supplementary material from the paper’s appendix.
Appendix
| , | Strategy | Suite | 0.05 | 0.1 | 0.25 | 0.5 | 1 | |
|---|---|---|---|---|---|---|---|---|
| 100, 20 | entropy | geometry | 1.00 | 1.00 | 1.00 | 0.00 | 0.00 | 0.00 |
| 100, 20 | entropy | task-aware | 1.00 | 1.00 | 1.00 | 1.00 | 0.12 | 0.17 |
| 100, 20 | -center | geometry | 1.00 | 1.00 | 1.00 | 0.00 | 0.00 | 0.00 |
| 100, 20 | -center | task-aware | 1.00 | 1.00 | 1.00 | 0.79 | 0.04 | 0.08 |
| 1000, 100 | entropy | geometry | 1.00 | 0.67 | 0.04 | 0.00 | 0.04 | 0.04 |
| 1000, 100 | entropy | task-aware | 1.00 | 0.96 | 0.67 | 0.33 | 0.04 | 0.04 |
| , | Campaign | Share | Fixed | Rolling | Rolling + lag | |
|---|---|---|---|---|---|---|
| 100, 20 | random natural | 20,000 | 0.94 | 0.00 | 0.00 | 0.00 |
| 100, 20 | broad capability (1 of 10) | 5,000 | 0.81 | 0.03 | 0.04 | 0.21 |
| 100, 20 | broad capability | 20,000 | 0.94 | 0.82 | 0.90 | 0.93 |
| 100, 20 | narrow capability (1 of 30) | 1,000 | 0.46 | 0.00 | 0.00 | 0.03 |
| 100, 20 | narrow capability | 5,000 | 0.81 | 0.78 | 0.93 | 0.94 |
| 100, 20 | broad, 50% natural padding | 20,000 | 0.94 | 0.25 | 0.04 | 0.38 |
| AUC / TPR at 1% / TPR at 5% | ||||
|---|---|---|---|---|
| Campaign | Two-scale | Global stream | MMD (Liu et al.) | QC |
| MetaMathQA (generated) | 0.88 / 0.80 / 0.81 | 0.97 / 0.70 / 0.74 | 0.94 / 0.58 / 0.62 | 0.94 / 0.64 / — |
| Human GSM8K questions | 0.96 / 0.95 / 0.95 | 0.99 / 0.88 / 0.94 | 0.97 / 0.73 / 0.80 | 1.00 / 0.93 / — |
| Half natural, mixed into every account | 0.68 / 0.24 / 0.39 | 0.75 / 0.05 / 0.11 | 0.71 / 0.07 / 0.14 | 0.86 / 0.31 / — |
| Real follow-up after every prompt | 0.68 / 0.24 / 0.40 | 0.75 / 0.06 / 0.11 | 0.72 / 0.11 / 0.20 | 0.85 / 0.27 / — |
| Random natural prompts | 0.48 / 0.00 / 0.07 | 0.39 / 0.00 / 0.04 | 0.39 / 0.02 / 0.02 | 0.52 / 0.10 / — |
| Campaign | Two-scale | Global | MMD |
|---|---|---|---|
| MetaMathQA, one prompt per source problem | 0.88 | 0.68 | 0.57 |
| MetaMathQA, four variants per source problem | 0.80 | 0.71 | 0.60 |
| WildChat broad cluster, random prompts | 0.01 | 0.01 | 0.07 |
| WildChat broad cluster, farthest-point deduplicated | 0.04 | 0.02 | 0.07 |
| Campaign | Selection on | Selection on | on topic cores |
|---|---|---|---|
| MetaMathQA | 0.86 (0.92) | 1.00 (1.00) | 1.00 (1.00) |
| Half natural, mixed | 0.21 (0.66) | 0.94 (1.00) | 0.95 (1.00) |
| Real follow-up after every prompt | 0.23 (0.66) | 0.93 (1.00) | 0.93 (1.00) |
| Human GSM8K questions | 0.93 (0.97) | 1.00 (1.00) | 1.00 (1.00) |
| Random natural prompts | 0.02 (0.52) | 0.00 (0.51) | 0.00 (0.48) |
| GSM8K evaluation sweep, 3 accounts | 0.75 (0.87) | 0.34 (0.61) | 0.02 (0.54) |
| Weekly, deployed (conformal) | ||||||
|---|---|---|---|---|---|---|
| MetaMathQA | Mixed | Follow-up | Random | Sweep, 3 accts | Sweep, 10 accts | |
| Selection on | 0.82 | 0.00 | 0.02 | 0.00 | 0.80 | 0.82 |
| Selection on | 1.00 | 0.48 | 0.46 | 0.00 | 0.42 | 0.97 |
| Pooled, oracle TPR at 1% | ||||||
| 1,000 | 2,500 | 5,000 | 10,000 | |||
| , unpadded | 0.97 | 0.75 | 0.28 | 0.12 | 0.05 | |
| Colluder share | Null median | Null 99% | Detector TPR at 1% | True colluder set above threshold | |
|---|---|---|---|---|---|
| 250 | 20% | 1.27 | 3.28 | 1.00 | 1.00 |
| 1,000 | 5% | 1.21 | 3.16 | 0.80 | 1.00 |
| 2,500 | 2% | 1.05 | 4.35 | 0.42 | 1.00 |
| 5,000 | 1% | 0.94 | 3.18 | 0.15 | 1.00 |
| 10,000 | 0.5% | 0.61 | 2.95 | 0.00 | 1.00 |
| Top eigenvector | |||||||
|---|---|---|---|---|---|---|---|
| Colluders | unpadded | padded | unpadded | padded | Colluder rank (unp./pad.) | vs needed | |
| 250 | 20% | 1.00 | 1.00 | 1.00 | 1.00 | 0 / 0 | 0.49 vs 0.013 |
| 1,000 | 5% | 1.00 | 0.07 | 1.00 | 1.00 | 0 / 1 | 0.58 vs 0.026 |
| 2,500 | 2% | 0.00 | 0.00 | 1.00 | 0.83 | 1 / 2 | 0.58 vs 0.041 |
| 5,000 | 1% | 0.00 | 0.00 | 0.93 | 0.77 | 2 / 3 | 0.60 vs 0.058 |
| 10,000 | 0.5% | 0.03 | 0.03 | 1.00 | 0.17 | 3 / 8 | 0.61 vs 0.082 |
| Detection at 1,641 queries | GSM8K gain (points) | ||||
|---|---|---|---|---|---|
| Campaign | Two-scale | Global | MMD | 1,641 queries | 7,550 queries |
| MetaMathQA, one prompt per source problem | 0.85 [0.74, 0.94] | 0.65 | 0.56 | +11.4 | +12.6 |
| Half natural prompts mixed into every account | 0.21 [0.10, 0.37] | 0.12 | 0.08 | +12.0 | +11.0 |
| Each prompt followed by a real follow-up turn | 0.24 [0.11, 0.38] | 0.12 | 0.08 | +13.4 | — |
| Natural WildChat cluster | 0.01 | 0.01 | 0.07 | — | +6.0 |
| Queries | All math | Half natural, mixed | Camouflaged (natural-looking math) |
|---|---|---|---|
| 100 | |||
| 300 | |||
| 900 |
| Queries | All math | Half natural, mixed | Paired cost | |
|---|---|---|---|---|
| SmolLM2-360M, GSM8K | 1,000 | |||
| 3,000 | ||||
| 10,000 | ||||
| SmolLM2-360M, tilted (least detectable) | 3,000 | — | ||
| 10,000 | — | |||
| Qwen2.5-1.5B, MATH-500 | 1,000 |
| Population | Campaign | Two-scale | Hollowed | Multi-outlier |
|---|---|---|---|---|
| Development weeks, 64–364 accounts | Dataset | 0.79–0.85 | 1.00 | 1.00 |
| (deployed) | Half padding | 0.21 | 0.44–0.48 | 0.36–0.42 |
| Least detectable | 0.00 | 0.01 | 0.01 | |
| Untouched weeks, 64–252 accounts | Dataset | 0.86 | 1.00 | 0.97 |
| (deployed) | Half padding | 0.00 | 0.50–0.57 | 0.00 |
| Least detectable | 0.00 | 0.04 | 0.00 |
| Embedding | CIFAR-10: victim penultimate layer, PCA-32. WildChat: all-MiniLM-L6-v2, PCA to , rescaled to total variance 4. |
| Fourier modes | complex modes (CIFAR-10 and the small-population WildChat protocol); modes with augmented real whitening (realistic protocol). Bandwidths with Bonferroni correction (CIFAR-10), (WildChat), and coarse with fine for the two-scale test. |
| Whitening floor | eigenvalues below of the maximum discarded. |
| Reference | CIFAR-10: 300,000 benign queries. WildChat: up to 100,000 benign turns from the four preceding weeks (lagged). |
| Calibration | CIFAR-10: 1,000 null worlds per configuration, Bonferroni over bandwidths. WildChat: 40 null windows per week, thresholds from the 8 preceding weeks (realistic protocol) or 250 windows from the 4 preceding weeks (small populations); conformal thresholds over all prior weeks for hollowed and multi-outlier selection. |
| MMD baseline | unbiased MMD 2 on normalised MiniLM embeddings, Gaussian kernel with median-heuristic bandwidth, window sample of 2,000 queries against 20 reference batches of 500. |
| Fraudar baseline | account topic count matrix (100 -means topics), column weights , greedy peeling. |
Model Extraction Attacks
Model extraction attacks infer a machine-learning model’s behavior, architecture, parameters, or hidden assets from queries and system leakage.
See all 48 papers