
Исследовательский код, реализующий T-Backdoor — атаки с временным триггером типа «бэкдор» на спайковые нейронные сети с использованием триггеров по частоте, задержке и джиттеру без пространственных возмущений.
Бэкдор-атаки представляют серьёзную угрозу безопасности для глубоких нейронных сетей (DNN) и остаются в значительной степени неизученными для спайковых нейронных сетей (SNN). Существующие атаки в основном вводят пространственно-временные триггеры, которые вызывают отклонения в распределении спайков отравленных образцов относительно их чистых аналогов. Для устранения этого ограничения в данной работе предлагается новая бэкдор-атака на SNN, названная \textbf{T-Backdoor}, которая работает с использованием чисто временных триггеров, таких как \textit{Rate}, \textit{Latency} и \textit{Jitter}, без внесения каких-либо пространственных возмущений, что делает сдвиг в распределениях спайков значительно более трудным для обнаружения. Посредством обширных экспериментов на трёх эталонных нейроморфных наборах данных: N-MNIST, CIFAR10-DVS и N-Caltech101, а также оценки против семи базовых методов защиты от бэкдоров, мы демонстрируем, что T-Backdoor достигает почти идеальной 100% успешности атаки (ASR) как в одноцелевых, так и в многоцелевых настройках с лишь незначительным снижением точности на чистых данных, оставаясь при этом устойчивой к существующим методам обнаружения и противодействия бэкдорам.
├── models.py # Architectures for all datasets (shared)
├── datasets.py # Neuromorphic dataset loading (shared)
│
├── main_single.py # 1. Single-target entry point
├── single_poisoned_dataset.py # Trigger implementations + loaders
├── single_utils.py # Train/eval loop, saving, plots
├── single_target.sh # Paper runs
│
├── main_multi_target.py # 2. Multi-target entry point
├── multi_target_poisoned_dataset.py # Per-target parameter assignment
├── multi_target_utils.py # Per-target ASR tracking, saving
├── multi_target.sh # Paper runs
│
├── main_mtmt.py # 3. Multi-trigger multi-target entry point
├── mtmt_poisoned_dataset.py # Per-target trigger-type config
├── mtmt_utils.py # Per-target ASR tracking, saving
└── mtmt.sh # Paper runs
python -m venv venv
source venv/bin/activate
pip install torch torchvision # CUDA build matching your driver
pip install spikingjelly
pip install numpy scipy matplotlib seaborn tqdm
Эталонное окружение, использованное для приведённых результатов:
Скачайте исходные нейроморфные наборы данных и поместите каждый в отдельный подкаталог
data/, названный точно так же, как значение --dataset:
data/
├── mnist/ # N-MNIST
├── cifar10/ # CIFAR10-DVS
├── caltech/ # N-Caltech101
└── gesture/ # DVS128-Gesture
data/ должен быть буквальным каталогом в вашем рабочем каталогеmain_single.py)Один триггер, один целевой класс.
python main_single.py --dataset cifar10 --type latency --delay_frames 1 \
--T 10 --epochs 100 --epsilon 0.1 --data_dir 'data/'
Основные аргументы
Аргументы, специфичные для триггеров
Установка --epsilon 0.0 обучает чистую базовую модель.
main_multi_target.py)Один тип триггера, N целевых классов, разделённых значением параметра триггера.
# Latency: delay 1 -> class 0, delay 3 -> class 1, delay 5 -> class 2
python main_multi_target.py --dataset mnist --type latency --n_targets 3 \
--trigger_labels 0 1 2 --delay_params 1 3 5 \
--epsilon 0.2 --T 10 --epochs 10 --data_dir 'data/'
Параметры для каждой цели. Задайте их явно или позвольте автоматически назначить
через np.linspace по диапазону. Явные списки должны иметь длину --n_targets и
переопределяют аргументы диапазона.
Автоматически назначаемые целочисленные параметры (latency, jitter_fixed)
дедуплицируются путём инкрементирования при коллизиях, поэтому никакие две цели не
имеют одинакового значения.
Для static цели разделяются по тому, какие кадры несут патч — временная ось
различает их, а не внешний вид патча.
ASR для каждой цели выводится каждую эпоху вместе с точностью на чистых данных.
main_mtmt.py)Разный тип триггера для каждой цели.
python main_mtmt.py --dataset mnist --T 10 --n_targets 5 \
--target_types latency latency rate rate jitter_fixed \
--trigger_labels 0 1 2 3 4 \
--latency_delays 1 2 --rate_scales 0.5 2.0 --jitter_fixed_shifts 3 \
--epsilon 0.3 --epochs 100 --data_dir 'data/'
Списки параметров по типам. Каждый список содержит одну запись на каждую цель
данного типа — при --target_types latency latency rate rate jitter_fixed вы
передаёте две задержки, две скорости и один сдвиг:
Пропуск списка приводит к автоматическому назначению из соответствующего диапазона
*_min / *_max.
Встроенные пресеты (используются, когда --target_types не задан):
--n_targets 3 — static (кадры 0..T/3), latency (--delay), rate (--scale_factor)--n_targets 5 — два static (разные группы кадров и позиции), два latency
(--delay, --delay_2), один rateЛюбое другое значение --n_targets требует --target_types.
Каждый запуск записывает строку в общий CSV-файл плюс самодостаточный каталог эксперимента.
Параметры триггера кодируются в имени каталога (df1 = задержка 1, sf0.1 = скорость
0.1, ns3 = 3 перестановки), поэтому запуски, отличающиеся только параметром триггера,
не перезаписывают друг друга.
Части этой кодовой базы адаптированы из репозитория Sneaky Spikes авторства Gorka Abad и др., сопровождающего статью "Sneaky Spikes: Uncovering Stealthy Backdoor Attacks in Spiking Neural Networks with Neuromorphic Data" (NDSS 2024). Мы благодарим авторов за публичное предоставление их кода.
Если вы находите эту работу полезной в своих исследованиях, пожалуйста, рассмотрите возможность цитирования:
@article{miah2026tbackdoor,
title = {T-Backdoor: Exploiting Temporal Redundancy in Neuromorphic Data for Spike-preserving Backdoor Attacks on SNNs},
author = {Miah, Abdullah Arafat and Vu, Kevin and Bi, Yu},
journal = {arXiv},
year = {2026}
}
По вопросам или проблемам, касающимся кода, пожалуйста, откройте issue на GitHub или свяжитесь:
| Пакет | Версия |
|---|
| Python | 3.11.10 |
| torch | 2.11.0+cu128 |
| torchvision | 0.26.0+cu128 |
| numpy | 2.2.6 |
| scipy | 1.16.0 |
| matplotlib | 3.8.4 |
| seaborn | 0.13.2 |
| spikingjelly | latest from source |
| Аргумент | По умолчанию | Описание |
|---|
--dataset | gesture | mnist, cifar10, caltech, gesture |
--type | static | static, moving, smart, latency, rate, jitter, jitter_fixed |
--epsilon | 0.1 | Доля обучающего набора для отравления |
--trigger_label | 0 | Целевой класс |
--T | 10 | Временные шаги симуляции |
--epochs | 10 | Эпохи обучения |
--batch_size | 16 | Размер батча |
--lr | 0.001 | Скорость обучения |
--loss | mse | mse или cross |
--optim | adam | adam или sgd |
--amp | выкл. | Включить автоматическую смешанную точность |
--seed | 42 | Случайное зерно |
--data_dir | data/ | Корень набора данных |
--save_path | experiments_single | Корень вывода |
--model_path | None | Начать с предобученного чекпоинта |
| Аргумент | По умолчанию | Применяется к |
|---|
--delay_frames | 2 | latency — кадры задержки |
--scale_factor | 0.5 | rate — <1 медленнее, >1 быстрее |
--n_shift | 3 | jitter_fixed — количество переставленных пар кадров |
--trigger_size | 0.1 | static/moving/smart — размер патча как доля ширины |
--pos | top-left | static — top-left, top-right, bottom-left, bottom-right, middle, random |
--polarity | 3 | static/moving/smart — 0=чёрный, 1=тёмно-синий, 2=зелёный, 3=светло-синий |
--n_masks | 2 | smart — количество регионов-кандидатов |
--least | выкл. | smart — нацелиться на наименее активный регион вместо наиболее активного |
--most_polarity | выкл. | smart — использовать наиболее активную полярность в регионе |
| Аргумент | По умолчанию | Описание |
|---|
--type | rate | static, latency, rate, jitter, jitter_fixed |
--n_targets | 3 | Количество целевых классов |
--trigger_labels | [0..n-1] | Явные целевые метки; длина должна равняться --n_targets |
--epsilon | 0.1 | Общий бюджет, равномерно распределённый между целями |
| Триггер | Явно | Автодиапазон | Автозначение по умолчанию |
|---|
latency | --delay_params 1 3 5 | --delay_min, --delay_max | 1 … T//2 |
rate | --rate_params 0.3 0.6 0.9 | --rate_min, --rate_max | 0.1 … 6.0 |
jitter | --jitter_params 0.05 0.15 0.25 | --jitter_std_min, --jitter_std_max | 0.05 … 0.3 |
jitter_fixed | --nshift_params 1 3 5 | --n_shift_min, --n_shift_max | 1 … max(n_shift_min+1, T//4) |
static | — | — | T разбивается на n_targets групп кадров |
| Аргумент | По умолчанию | Описание |
|---|
--n_targets | 3 | Количество целей; для 3 и 5 есть встроенные пресеты |
--target_types | None | Тип триггера для каждой цели — static, latency, rate, jitter, jitter_fixed. Длина должна равняться --n_targets. Переопределяет пресеты |
--trigger_labels | [0..n-1] | Целевые метки |
--epsilon | 0.2 | Общий бюджет, равномерно распределённый между целями |
| Аргумент | Применяется к |
|---|
--latency_delays 1 2 | каждой цели latency |
--rate_scales 0.5 2.0 | каждой цели rate |
--jitter_fixed_shifts 3 | каждой цели jitter_fixed |
--jitter_stds 0.1 0.3 | каждой цели jitter |
--static_positions top-left bottom-right | каждой цели static |
--static_polarities 3 1 | каждой цели static |
| Настройка | Сводный CSV | Каталог эксперимента |
|---|
| Одноцелевой | <save_path>/results.csv | <dataset>_<type>_<eps>_<size>_<param>_<seed>/ |
| Многоцелевой | <save_path>/multi_target_results.csv | multi_<type>_<dataset>_<n>targets_<labels>_eps<eps>_<params>_seed<seed>/ |
| MTMT | <save_path>/mtmt_results.csv | mtmt_<dataset>_<n>t_<params>_eps<eps>_seed<seed>/ |