OPEN DATASET, CC-BY 4.0

The AeroScope ADS-B anomaly benchmark

918 labeled ADS-B records, real traffic paired one-to-one with synthetically injected attacks, 38 documented columns, a shipped baseline, and a license that lets you use it for anything. This page is the landing page, the numbers are recomputed from the file itself.

What this is

A benchmark, not a raw dump

The AeroScope ADS-B Anomaly Benchmark (v1) pairs 459 real airborne ADS-B records, captured live from public crowdsourced feeds and de-duplicated by ICAO 24-bit address, with 459 synthetically injected attacks built on top of that same real traffic. Injected attacks follow the taxonomy used in the ADS-B security literature (methodology after Habler and Shabtai, Computers & Security, 2018): altitude tampering, velocity tampering, ghost kinematics, and integrity-field downgrade. Every one of the 918 rows also carries the anomaly score from a deployed scikit-learn IsolationForest model, so a baseline is not something you have to build yourself before you can compare against it.

Nothing in this dataset comes from a satellite feed, a proprietary receiver network, or multilateration. AeroScope's own data sources are adsb.fi, adsb.lol and an OpenSky fallback, the same class of public, crowdsourced feed anyone can access, which is part of why this dataset is reproducible by other researchers rather than tied to infrastructure only one organization has.

Attack types

Four injected attack types

Attack type Rows What it does
altitude_tamper115Alters barometric or geometric altitude away from the real captured value, desyncing the two altitude sources in a way a real transponder should not produce.
velocity_tamper115Alters ground speed, airspeed or Mach so the reported kinematics no longer agree with each other or with the aircraft's real performance envelope.
ghost_kinematics115Injects an implausible combined motion profile, position, speed and track together, modeling a fabricated track with no real aircraft behind it. See ghost aircraft in ADS-B.
integrity_downgrade114Lowers the reported NIC, NACp, NACv or SIL fields inconsistently with the rest of the message, modeling a spoofed or malfunctioning integrity report. See NIC and NACp explained.

Injected altitude values are clamped at -1000 ft, the Mode-S altitude encoding floor, so attack rows stay within what a real transponder could physically transmit rather than producing an obviously impossible value a trivial range check would catch.

Schema

38 columns

Every row carries the raw ADS-B fields, the signal-integrity fields, four derived self-consistency features, and the deployed baseline's score. The full schema, read directly from the published CSV header:

#ColumnDescription
1record_idSequential row id
2label0 = real traffic, 1 = injected attack
3attack_typenull, or one of the four attack types above
4capture_ts_utcUnix epoch seconds at capture
5hexICAO 24-bit address, as broadcast (public data, not anonymized)
6callsignFlight callsign, trimmed
7registrationTail registration, if broadcast
8aircraft_typeICAO type designator, e.g. B738
9categoryADS-B emitter category, A0 to C3
10sourceMessage type, e.g. adsb_icao, mlat
11latLatitude, degrees
12lonLongitude, degrees
13alt_baro_ftBarometric altitude, ft
14alt_geom_ftGeometric (GNSS) altitude, ft
15gs_ktsGround speed, kts
16ias_ktsIndicated airspeed, kts (sparse, enhanced-surveillance only)
17tas_ktsTrue airspeed, kts (sparse)
18machMach number (sparse)
19track_degGround track, degrees
20mag_heading_degMagnetic heading, degrees (sparse)
21track_rate_dpsTurn rate, deg/s (sparse)
22roll_degRoll angle, degrees (sparse)
23baro_rate_fpmBarometric vertical rate, ft/min
24geom_rate_fpmGeometric vertical rate, ft/min
25squawkTransponder code
26nicNavigation integrity category, 0 to 11
27nac_pNavigation accuracy category, position, 0 to 11
28nac_vNavigation accuracy category, velocity, as broadcast (values above the nominal 0-4 range appear in real feeds)
29silSource integrity level, 0 to 3
30rssi_dbfsReceived signal strength, dBFS
31seen_sSeconds since last message
32seen_pos_sSeconds since last position
33geom_baro_alt_diff_ftDerived: |geometric minus barometric altitude|
34gs_mach_resid_ktsDerived: ground-speed-vs-Mach self-consistency residual
35baro_geom_rate_diff_fpmDerived: |barometric minus geometric vertical rate|
36track_hdg_diff_degDerived: angular |track minus magnetic heading|
37iforest_scoreAnomaly score, 0 to 1, from the deployed baseline
38iforest_is_anomaly1 if the score crosses the FPR-calibrated threshold
Baseline

Baseline performance and how to reproduce it

A scikit-learn IsolationForest, the same model AeroScope runs in production as one of its detectors, scores every one of the 918 rows. Recomputed directly from the labels and scores shipped in the published file, across all 459 real records and 459 injected attacks, it achieves ROC-AUC 0.87, with a 54% detection rate at a 3.1% false-positive rate using the shipped iforest_is_anomaly threshold.

To reproduce it yourself: load the CSV, treat label as ground truth and iforest_score as the model's continuous anomaly score, then compute ROC-AUC with any standard implementation (for example scikit-learn's roc_auc_score(label, iforest_score)). To reproduce the detection-rate figure, compare label against the already-shipped iforest_is_anomaly column rather than picking a new threshold: true-positive rate among the 459 attack rows and false-positive rate among the 459 real rows should land at 54% and 3.1% respectively. No retraining is required, the scores are already in the file, which is the point: the baseline is meant to be checked, not taken on faith.

Honest limitations: synthetic injection is a proxy for real attacks, not the real thing. Coverage is biased toward busy terminal areas in the capture regions. Enhanced-surveillance fields (IAS, TAS, Mach, magnetic heading, track rate, roll) are only broadcast by a subset of aircraft, roughly 25 to 40 percent non-null, which is expected sparsity rather than a data quality problem. Full details are in the dataset card linked below.

Download

Get the dataset

Download CSV  Download JSONL  Hugging Face mirror ↗

The Hugging Face mirror includes a load_dataset() loader for direct use in Python. See the research and dataset page and the dataset card for the full column reference and provenance notes. Licensed CC-BY 4.0: use it for any purpose, including commercial, with attribution.

Citation

How to cite this dataset

APA format:
Uzair, M. (2026). AeroScope ADS-B Anomaly Benchmark v1 [Dataset]. AeroScope. CC-BY 4.0. https://huggingface.co/datasets/Muhammaduazir69/aeroscope-adsb-anomaly-benchmark
BibTeX:
@misc{uzair2026aeroscopebenchmark,
  title={AeroScope ADS-B Anomaly Benchmark v1},
  author={Uzair, Muhammad},
  year={2026},
  publisher={AeroScope},
  howpublished={Hugging Face Datasets},
  url={https://huggingface.co/datasets/Muhammaduazir69/aeroscope-adsb-anomaly-benchmark},
  license={CC-BY-4.0}
}

A Zenodo DOI for this release is being minted; this page and the dataset card will be updated once it is issued.

Questions

Common questions

Is there an open ADS-B dataset for machine learning?
Yes. The AeroScope ADS-B Anomaly Benchmark v1 is a free, CC-BY 4.0 dataset of 918 labeled records, 459 real airborne ADS-B captures and 459 synthetically injected attacks across four attack types, with 38 documented columns and a published baseline, available as direct CSV/JSONL download and on Hugging Face.
What attack types are in the dataset?
Four injected attack types, each roughly a quarter of the 459 attack rows: altitude tampering, velocity tampering, ghost kinematics, and integrity-field downgrade, following the standard taxonomy used in the ADS-B security literature.
What is the baseline performance on this dataset?
A scikit-learn IsolationForest baseline, scored on all 918 rows (459 real, 459 injected), achieves ROC-AUC 0.87, with a 54 percent detection rate at a 3.1 percent false-positive rate. The exact score is shipped in the iforest_score column of the published file so this number can be recomputed directly.
What license is the dataset released under?
CC-BY 4.0. It can be used for any purpose, including commercial, provided AeroScope is credited using the citation given on this page.