バックドア攻撃は深層ニューラルネットワーク(DNN)に対する深刻なセキュリティ脅威であり、スパイキングニューラルネットワーク(SNN)においては依然としてほとんど研究が進んでいない。既存の攻撃は主に時空間トリガーを導入し、汚染サンプルのスパイク分布をクリーンなサンプルに対して逸脱させる。この限界に対処するため、本研究ではSNNに対する新規なバックドア攻撃を提案し、これを\textbf{T-Backdoor}と呼ぶ。これは\textit{Rate}、\textit{Latency}、\textit{Jitter}といった純粋に時間的なトリガーのみを用いて動作し、空間的な摂動を一切導入しないため、スパイク分布のシフトを検出することが著しく困難になる。3つのベンチマーク神経形態データセット(N-MNIST、CIFAR10-DVS、N-Caltech101)での広範な実験と、7つのベースラインバックドア防御手法に対する評価を通じて、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)1つのトリガー、1つのターゲットクラス。
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)1つのトリガータイプで、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)は、衝突時にインクリメントすることで重複排除されるため、2つのターゲットが同じ値を共有することはない。
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/'
タイプごとのパラメータリスト。 各リストはそのタイプのターゲットごとに1つのエントリを持つ — --target_types latency latency rate rate jitter_fixed の場合、2つの遅延、2つのレート、1つのシフトを渡す:
リストを省略すると、対応する *_min / *_max 範囲から自動割り当てされる。
組み込みプリセット(--target_types が指定されていない場合に使用):
--n_targets 3 — static(フレーム 0..T/3)、latency(--delay)、rate(--scale_factor)--n_targets 5 — 2つの static(異なるフレームグループと位置)、2つの latency(--delay、--delay_2)、1つの 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>/ |