| | --- |
| | license: cc-by-nc-nd-4.0 |
| | language: |
| | - en |
| | - de |
| | tags: |
| | - automotive |
| | - IDS |
| | - CAN |
| | - CANIDS |
| | - AutomotiveSecurity |
| | - Cybersecurity |
| | --- |
| | |
| | # CANDefender – Fuzzy Attack Detection Model |
| |
|
| | **Model Summary** |
| | This model detects **Fuzzy attacks** on the CAN bus. It was trained on **4.73 million** real CAN frames, including normal data and Fuzzy-labeled data. The model uses an LSTM architecture that processes the CAN ID and 8-byte payload to classify each frame as either “Fuzzy” or “Normal.” |
| |
|
| | --- |
| |
|
| | ## Performance |
| |
|
| | **Test Accuracy**: ~94.09% |
| | **Confusion Matrix** (Fuzzy vs. Normal): |
| |
|
| | | True \ Pred | Fuzzy (pred) | Normal (pred) | |
| | |:-----------:|:-------------:|:-------------:| |
| | | **Fuzzy** | 3,737,645 | 13,379 | |
| | | **Normal** | 266,808 | 722,063 | |
| |
|
| | - **Recall (Fuzzy)**: ~99.6% (very few Fuzzy frames missed) |
| | - **Recall (Normal)**: ~73% (about 27% false positives on Normal) |
| |
|
| | --- |
| |
|
| | ## Intended Use |
| |
|
| | - **Goal**: Real-time detection of **Fuzzy attacks** on the CAN bus. |
| | - **Limitations**: |
| | - Focused on Fuzzy vs. Normal classification only (other attacks handled in separate models). |
| | - Tends to misclassify ~27% of normal frames as Fuzzy (relatively high false alarms). |
| |
|
| | --- |
| |
|
| | ## How to Use |
| |
|
| | ```python |
| | import torch |
| | import numpy as np |
| | from can_defender_fuzzy import CANLSTM # Adjust import name |
| | |
| | # Example frame => [CAN_ID, b0..b7] |
| | frame = [0x315, 0x12, 0x4F, 0xA2, 0x00, 0x00, 0x78, 0x1C, 0xAA] |
| | |
| | x_np = np.array(frame, dtype=np.float32).reshape(1,1,9) |
| | |
| | model = CANLSTM(input_dim=9, hidden_dim=64, num_classes=2) |
| | model.load_state_dict(torch.load("can_lstm_model_final.pt")) |
| | model.eval() |
| | |
| | with torch.no_grad(): |
| | logits = model(torch.from_numpy(x_np)) |
| | pred = torch.argmax(logits, dim=1).item() |
| | print("Prediction:", "Fuzzy" if pred == 0 else "Normal") |
| | ``` |
| |
|
| | ## Training Configuration |
| | - Architecture: LSTM (64 hidden units), final linear layer → 2 classes (Fuzzy vs. Normal) |
| | - Optimizer: Adam (lr=1e-3) |
| | - Epochs: ~30 (stopped once performance stabilized) |
| | - Dataset: 4.73 million CAN frames |
| | ## Limitations & Next Steps |
| | - False Positives: ~27% of normal frames get labeled as Fuzzy. Acceptable for high-sensitivity scenarios, but can be improved (weighted loss, time-window approach, etc.). |
| | - Scope: Only focuses on Fuzzy detection. Other attacks (DoS, Gear, RPM) are separate. |
| | # Potential Enhancements: |
| | - Weighted training or additional features (delta-time, frequency) |
| | - Window-based LSTM or transformers for sequence data |
| |
|
| | ## License & Contact |
| | - License: cc-by-nc-nd-4.0 |
| | - Author: Keyvan Hardani |
| | - Contact: https://www.linkedin.com/in/keyvanhardani/ |