| | --- |
| | language: en |
| | license: cc-by-nc-4.0 |
| | tags: |
| | - automotive |
| | - intrusion-detection |
| | - can-bus |
| | - cybersecurity |
| | - temporal-cnn |
| | - pytorch-lightning |
| | - onnx |
| | - tensorrt |
| | datasets: |
| | - car-hacking-challenge-2021 |
| | metrics: |
| | - accuracy |
| | - f1 |
| | - precision |
| | - recall |
| | library_name: pytorch |
| | --- |
| | |
| | # SecIDS-v2: Next-Generation Automotive Intrusion Detection System |
| |
|
| |  |
| |
|
| | ## Model Description |
| |
|
| | **SecIDS-v2** is a production-ready deep learning system for detecting cyber attacks on automotive CAN (Controller Area Network) buses. Built with Temporal Convolutional Networks (TCN), it achieves state-of-the-art performance while maintaining real-time inference speeds suitable for embedded deployment on NVIDIA Jetson devices. |
| |
|
| | ### Key Features |
| |
|
| | - **High Performance**: 98.2% detection accuracy with 4.2ms inference latency on Jetson Nano |
| | - **Multi-Task Learning**: Simultaneous detection of multiple attack types (DoS, Fuzzy, Spoofing, Replay) |
| | - **Production-Ready**: Complete deployment pipeline with ONNX/TensorRT export, FastAPI server, and Streamlit dashboard |
| | - **Advanced Feature Engineering**: 25 CAN-specific features including temporal, payload, and statistical attributes |
| | - **Edge-Optimized**: INT8 quantization support for resource-constrained automotive ECUs |
| |
|
| | ## Architecture |
| |
|
| |  |
| |
|
| | **SecIDS-v2** uses a Temporal Convolutional Network (TCN) with the following structure: |
| |
|
| | - **Input**: Sliding windows of 128 CAN frames × 25 features |
| | - **TCN Backbone**: 3 blocks with dilated convolutions (32→64→128 filters, dilations 1→2→4) |
| | - **Receptive Field**: 128 frames (captures long-range temporal dependencies) |
| | - **Multi-Task Heads**: 4 classification heads for different attack types |
| | - **Parameters**: 3.8M (27% smaller than LSTM v1) |
| | - **Output**: Binary classification + attack type prediction |
| |
|
| | ## Performance |
| |
|
| |  |
| |
|
| | ### SecIDS v1 → v2 Improvements |
| |
|
| | | Metric | LSTM v1 | TCN v2 | Improvement | |
| | |--------|---------|--------|-------------| |
| | | **Accuracy** | 97.2% | 98.2% | +1.0% | |
| | | **Inference (Jetson Nano)** | 18.5ms | 4.2ms | **4.4× faster** | |
| | | **Model Size** | 5.2M params | 3.8M params | -27% | |
| | | **F1-Score (DoS)** | 96.5% | 98.1% | +1.6% | |
| | | **F1-Score (Fuzzy)** | 95.8% | 97.9% | +2.1% | |
| | | **F1-Score (Spoofing)** | 96.2% | 98.5% | +2.3% | |
| | | **F1-Score (Replay)** | 97.1% | 98.3% | +1.2% | |
| |
|
| | ### Hardware Performance |
| |
|
| | | Device | Precision | Latency | Throughput | |
| | |--------|-----------|---------|------------| |
| | | NVIDIA Jetson Nano | FP16 | 4.2ms | 238 FPS | |
| | | NVIDIA Jetson Nano | INT8 | 2.8ms | 357 FPS | |
| | | NVIDIA Jetson Xavier NX | FP16 | 1.9ms | 526 FPS | |
| | | Intel Core i7 (CPU) | FP32 | 12.5ms | 80 FPS | |
| | | NVIDIA RTX 4060 | FP32 | 0.8ms | 1250 FPS | |
| |
|
| | ## Feature Importance |
| |
|
| |  |
| |
|
| | **Top 10 Most Important Features:** |
| |
|
| | 1. **Inter-Arrival Time (Δt)** - Time between consecutive frames |
| | 2. **Payload Entropy** - Randomness of data payload |
| | 3. **Hamming Distance** - Bit-level changes between frames |
| | 4. **ID Change Frequency** - Rate of CAN ID transitions |
| | 5. **DLC Variance** - Data Length Code variability |
| | 6. **ID Occurrence Rate** - Frequency of specific CAN IDs |
| | 7. **Payload Mean** - Average payload byte values |
| | 8. **Payload Std Dev** - Payload variability |
| | 9. **Time-Since-Last** - Time since last occurrence of ID |
| | 10. **ID Diversity** - Number of unique IDs in window |
| |
|
| | ## Training Data |
| |
|
| | **Primary Dataset**: [Car Hacking Challenge 2021](https://ocslab.hksecurity.net/Datasets/CAN-intrusion-dataset) |
| |
|
| | - **Total Frames**: ~200,000 CAN frames |
| | - **Normal Traffic**: ~180,000 frames (90%) |
| | - **Attack Types**: DoS, Fuzzy, Spoofing, Gear Replay |
| | - **Attack Frames**: ~20,000 frames (10%) |
| | - **Train/Val Split**: 70/30 |
| | - **Window Size**: 128 frames with 50% overlap |
| |
|
| | ### Data Preprocessing |
| |
|
| | 1. **Feature Extraction**: 25 engineered features per frame |
| | - Temporal: Inter-arrival time, time-since-last, sequence position |
| | - Payload: Entropy, mean, std, Hamming distance |
| | - Statistical: Per-ID aggregates, DLC variance, ID diversity |
| |
|
| | 2. **Normalization**: StandardScaler (μ=0, σ=1) |
| |
|
| | 3. **Augmentation** (training only): |
| | - Bit-flip injection (5% probability) |
| | - Temporal jitter (±2ms) |
| | - Random masking (10% features) |
| |
|
| | ## Intended Use |
| |
|
| | ### Primary Use Cases |
| |
|
| | - **Automotive Cybersecurity**: Real-time intrusion detection in connected vehicles |
| | - **CAN Bus Monitoring**: Network anomaly detection in industrial/automotive systems |
| | - **Security Research**: Baseline model for CAN-bus attack detection research |
| | - **Education**: Reference implementation for automotive security courses |
| |
|
| | ### Out-of-Scope Use |
| |
|
| | - **Non-CAN Protocols**: Not designed for FlexRay, LIN, or Ethernet automotive networks |
| | - **Safety-Critical Control**: Should not replace functional safety mechanisms (ISO 26262) |
| | - **Guaranteed Protection**: No ML model provides 100% security; defense-in-depth required |
| |
|
| | ## Limitations |
| |
|
| | - **Training Data Bias**: Trained primarily on synthesized attack scenarios |
| | - **Zero-Day Attacks**: May not detect novel attack patterns not seen during training |
| | - **Context Dependence**: Performance may vary across different vehicle platforms |
| | - **Latency vs Accuracy Trade-off**: Optimized for speed; may miss subtle attacks |
| | - **False Positives**: ~1.8% false alarm rate may require tuning for production |
| |
|
| | ## Usage |
| |
|
| | ### Quick Start (Python) |
| |
|
| | ```python |
| | import torch |
| | from secids.models import TemporalCNN |
| | from secids.data import CANPreprocessor |
| | |
| | # Load model |
| | model = TemporalCNN.load_from_checkpoint("final_model.ckpt") |
| | model.eval() |
| | |
| | # Preprocess CAN data |
| | preprocessor = CANPreprocessor() |
| | features = preprocessor.transform(can_frames) # [128, 25] |
| | |
| | # Inference |
| | with torch.no_grad(): |
| | logits = model(features.unsqueeze(0)) # [1, 128, 25] |
| | pred = torch.argmax(logits, dim=-1) |
| | |
| | print(f"Attack Detected: {pred.item() == 1}") |
| | ``` |
| |
|
| | ### ONNX Deployment |
| |
|
| | ```python |
| | import onnxruntime as ort |
| | |
| | # Load ONNX model |
| | session = ort.InferenceSession("secids_v2.onnx") |
| | |
| | # Run inference |
| | outputs = session.run(None, {"input": features.numpy()}) |
| | prediction = outputs[0].argmax() |
| | ``` |
| |
|
| | ### FastAPI Server |
| |
|
| | ```bash |
| | # Start REST API server |
| | cd serving |
| | python app.py |
| | |
| | # Make prediction request |
| | curl -X POST http://localhost:8080/predict \ |
| | -H "Content-Type: application/json" \ |
| | -d @can_sample.json |
| | ``` |
| |
|
| | ### Streamlit Dashboard |
| |
|
| | ```bash |
| | # Start web dashboard |
| | cd serving |
| | streamlit run dashboard.py --server.port 5060 |
| | ``` |
| |
|
| | ## Training |
| |
|
| | ### Requirements |
| |
|
| | ```bash |
| | pip install torch torchvision pytorch-lightning |
| | pip install pandas numpy pyarrow |
| | pip install scikit-learn wandb |
| | ``` |
| |
|
| | ### Training Script |
| |
|
| | ```bash |
| | python scripts/train.py \ |
| | --model tcn \ |
| | --data data/processed/train.parquet \ |
| | --batch_size 32 \ |
| | --epochs 50 \ |
| | --gpus 1 \ |
| | --precision 16 |
| | ``` |
| |
|
| | ### Hyperparameters |
| |
|
| | - **Optimizer**: AdamW (lr=1e-3, weight_decay=1e-4) |
| | - **Scheduler**: ReduceLROnPlateau (patience=5, factor=0.5) |
| | - **Loss**: CrossEntropyLoss with class weights [1.0, 10.0] |
| | - **Batch Size**: 32 |
| | - **Window Size**: 128 frames |
| | - **Stride**: 64 frames (50% overlap) |
| | - **Early Stopping**: Patience=10 epochs |
| | |
| | ## Model Export |
| | |
| | ### ONNX Export |
| | |
| | ```python |
| | from secids.models import TemporalCNN |
| | import torch |
| | |
| | model = TemporalCNN.load_from_checkpoint("model.ckpt") |
| | dummy_input = torch.randn(1, 128, 25) |
| |
|
| | torch.onnx.export( |
| | model, |
| | dummy_input, |
| | "secids_v2.onnx", |
| | input_names=["input"], |
| | output_names=["output"], |
| | dynamic_axes={"input": {0: "batch"}} |
| | ) |
| | ``` |
| | |
| | ### TensorRT Optimization |
| |
|
| | ```bash |
| | # Convert ONNX to TensorRT (FP16) |
| | trtexec --onnx=secids_v2.onnx \ |
| | --saveEngine=secids_v2_fp16.trt \ |
| | --fp16 |
| | |
| | # Convert to INT8 (requires calibration data) |
| | trtexec --onnx=secids_v2.onnx \ |
| | --saveEngine=secids_v2_int8.trt \ |
| | --int8 \ |
| | --calib=calibration.cache |
| | ``` |
| |
|
| | ## Evaluation |
| |
|
| | ### Test Set Performance |
| |
|
| | ```bash |
| | python scripts/evaluate.py \ |
| | --model outputs/tcn_production/final_model.ckpt \ |
| | --data data/processed/test.parquet \ |
| | --output results/ |
| | ``` |
| |
|
| | **Outputs**: |
| | - Confusion matrix (PNG) |
| | - ROC/PR curves (PNG) |
| | - Per-attack-type metrics (JSON) |
| | - Latency profiling (CSV) |
| |
|
| | ### Benchmark Results |
| |
|
| | | Dataset | Accuracy | Precision | Recall | F1-Score | |
| | |---------|----------|-----------|--------|----------| |
| | | Car Hacking (2021) | 98.2% | 97.8% | 98.6% | 98.2% | |
| | | HCRL (2020) | 97.5% | 96.9% | 98.1% | 97.5% | |
| | | SynCAN (2023) | 96.8% | 95.7% | 97.9% | 96.8% | |
| |
|
| | ## Citation |
| |
|
| | ```bibtex |
| | @software{secids_v2_2025, |
| | author = {Hardani, Keyvan}, |
| | title = {SecIDS-v2: Next-Generation Automotive Intrusion Detection System}, |
| | year = {2025}, |
| | url = {https://github.com/Keyvanhardani/SecIDS-v2}, |
| | note = {Production-ready CAN-bus intrusion detection with Temporal CNNs} |
| | } |
| | ``` |
| |
|
| | ## Related Work |
| |
|
| | - **SecIDS v1**: LSTM-based predecessor (97.2% accuracy, 18.5ms latency) |
| | - **CANnolo**: YOLO-inspired object detection approach |
| | - **GIDS**: Graph neural networks for CAN security |
| | - **Deep-CAN**: Autoencoder-based anomaly detection |
| |
|
| | ## Acknowledgments |
| |
|
| | - **Dataset**: OCSLab HK Security (Car Hacking Challenge 2021) |
| | - **Framework**: PyTorch Lightning team |
| | - **Optimization**: NVIDIA TensorRT team |
| | - **Inspiration**: Temporal CNN architecture from Bai et al. (2018) |
| |
|
| | ## License |
| |
|
| | MIT License - See [LICENSE](LICENSE) for details |
| |
|
| | ## Contact |
| |
|
| | - **Author**: Keyvan Hardani |
| | - **GitHub**: [Keyvanhardani/SecIDS-v2](https://github.com/Keyvanhardani/SecIDS-v2) |
| | - **Issues**: [GitHub Issues](https://github.com/Keyvanhardani/SecIDS-v2/issues) |
| | - **Demo**: [secids.keyvan.ai](http://secids.keyvan.ai) |
| | - **Linkedin** [Linkedin](https://www.linkedin.com/in/keyvanhardani/) |
| |
|
| | --- |
| |
|
| | **Last Updated**: October 2025 |
| | **Model Version**: 2.0.0 |
| | **Framework**: PyTorch 2.0+, Lightning 2.0+ |
| |
|