后门攻击是对深度神经网络(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,各目标通过哪些帧携带补丁来区分——区分它们的是时间轴,
而非补丁外观。
每个 epoch 都会打印各目标的 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 次交换),因此仅在某个触发器参数上不同的运行不会互相覆盖。
本代码库的部分内容改编自 Gorka Abad 等人的 Sneaky Spikes 仓库,该仓库伴随论文 "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}
}
如有关于代码的问题或疑问,请提交 GitHub issue 或联系:
| 包 | 版本 |
|---|
| 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 | 从源码安装的最新版本 |
| 参数 | 默认值 | 描述 |
|---|
--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>/ |