File size: 7,394 Bytes
0f501fe
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
18afbb3
0f501fe
02581b3
 
18afbb3
0f501fe
 
02581b3
 
be717fd
 
 
0c46dc9
0f501fe
 
 
 
 
 
 
b6f2820
 
0f501fe
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b67dc1a
0f501fe
 
18afbb3
0f501fe
 
 
 
 
be717fd
0f501fe
 
 
 
 
 
 
 
 
02581b3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0f501fe
 
e6ce3ab
 
0f501fe
e6ce3ab
0f501fe
 
 
 
 
 
 
520e0f4
 
02581b3
0f501fe
02581b3
18afbb3
 
0f501fe
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
---

license: apache-2.0
language:
  - en
  - zh
library_name: pytorch
tags:
  - network-security
  - traffic-classification
  - encrypted-traffic
  - open-set-recognition
  - mamba
  - gdn
  - pytorch
metrics:
  - accuracy
  - f1
  - auroc
---


# IntraSpanNet

**English** | [简体中文](https://github.com/lupingQAQ/IntraSpanNet/blob/main/README.zh-CN.md)

IntraSpanNet names what produced a flow from its first five packets: a security appliance, an endpoint security agent, or a piece of common software. It reports a product label, a type, a tier, and an open-set distance. Flows that do not match a known product are rejected as unknown.


**DOI:** [10.5281/zenodo.23643146](https://zenodo.org/records/23643146)

**Code and training guide:** [github.com/lupingQAQ/IntraSpanNet](https://github.com/lupingQAQ/IntraSpanNet) — [docs/TRAINING.md](https://github.com/lupingQAQ/IntraSpanNet/blob/main/docs/TRAINING.md)

**Install:** `pip install intraspannet` runs on CPU; `pip install "intraspannet[gpu]"` adds the Triton kernel. Same weights either way.

## Model details

- Architecture: ByteEmbed, four Gated DeltaNet blocks, four task heads.
- Input: 1600 bytes per flow (5 packets x 320 bytes, IPv4 addresses masked).
- Parameters: 2.86M per arm; 11.44M for the four-arm ensemble.
- Output classes: 18 products, 10 types, 3 tiers, 11 malicious classes.
- Open-set method: three sub-prototypes per class; cosine distance; threshold 0.1041.
- Ensemble: classifier arms A-S0, A-LDA, B-LDA, B-S0; gate arms A-LDA and B-LDA.
- Arm naming: the letter is the pre-training run (A or B), the suffix is the training variant (`s0` standard multi-task objective, `lda` logit adjustment by class prior, `hn` hard-negative weighting). Checkpoint files carry the same labels in lower case, for example `stage3_a_s0.pth` is arm A-S0.
- License: Apache-2.0.

## Intended use

- Asset discovery: identify security agents, appliances, and common services on hosts and internal networks.
- Shadow IT and shadow security review: find products that are present but not in the asset inventory.
- Research: byte-level traffic classification and open-set recognition.

The model is intended for authorized monitoring on networks you own or administer. It is not a replacement for an IDS, EDR, or vulnerability scanner.

## Out-of-scope use

- Identifying users, content, or application payloads.
- Monitoring networks without authorization.
- Mobile and IoT device classification. The model was not trained for those domains.
- Real-time blocking or automated enforcement without human review.

## Training data

- 40,283 labeled flows from lab captures of 18 products and services.
- Public benchmark training splits for pretraining and the malicious head.
- Contrastive pretraining uses 33,184 training-only flows. Validation and holdout flows are excluded.
- No customer traffic is included in the released weights or repository.

The product labels are:

`windows_defender`, `clamav_freshclam_win`, `clamav_freshclam`, `velociraptor`, `velociraptor_win`, `osquery`, `wazuh_agent`, `wireguard`, `openvpn`, `stunnel`, `squid_proxy`, `ntopng`, `guacamole_mgmt`, `waf_modsecurity`, `suricata_update`, `web_http`, `ssh`, `ftp`.

## Evaluation

| Metric | Test (503 flows) | All validation (1006 flows) |
|---|---:|---:|
| Product accuracy | 0.8787 | 0.8817 |
| Tier accuracy | 0.9245 | 0.9334 |
| Macro-F1 (supported classes) | 0.7621 | 0.8240 |
| Gate AUROC | 0.9784 | 0.9820 (dev) |

Additional results:

- Unknown rejection: 100% on 18 unknown-product bins.
- Acceptance: 8/10 products without timing rescue; 9/10 with the internal timing rule, which is not included in v0.1.0.
- Throughput: 253 flows/s for the ensemble, 1,017 flows/s for one arm, on an RTX 4090.

The test split is a flow-level half of the validation set, not a session-level holdout. Each class has one held-out session. See [docs/RESULTS.md](https://github.com/lupingQAQ/IntraSpanNet/blob/main/docs/RESULTS.md) for the full protocol.

## Limitations

- `stunnel` has zero recall in the acceptance demo (0/30).
- Flow-level test split; session-level generalization is not measured.
- CPU inference uses a plain PyTorch port of the GDN block: correct, but about two seconds per flow per arm, so it is for inspection rather than a live probe. `pip install "intraspannet[gpu]"` enables the Triton path.
- The model was trained on lab traffic. Production performance with different software versions, proxies, or NAT is unknown.
- The malicious head is a secondary output and is not calibrated for production alerting.

## Ethical and legal considerations

Traffic classification can reveal sensitive information about a network. Use the model only on networks you own or have written authorization to monitor. Do not upload captures to public demos. Follow local law and organizational policy.

The model outputs a probability and a distance, not a fact. Treat low-confidence and unknown results as prompts for human review.

## Further training

The supervised and reinforcement-learning objectives are part of the pip package, so these weights are a starting point rather than a fixed artifact.

| Item | What it does |
|---|---|
| `SFTConfig` | Loss weights for the multi-task supervised stage |
| `compute_sft_loss` | Product, type, tier, malicious and contrastive terms |
| `RLConfig` | Reward weights for the REINFORCE stage |
| `compute_rl_loss` | Correct product, correct type, honest rejection |
| `Trainer` | One optimizer step per call |
| `load_backbone` | Warm start across a changed label set, resizing the product head |

```python

from intraspannet.model import DualHeadClassifier

from intraspannet.train import SFTConfig, Trainer, load_backbone



model = DualHeadClassifier(num_software=18)

model, report = load_backbone("stage3_a_s0.pth", model)

trainer = Trainer(model)

stats = trainer.step_sft(batch, SFTConfig(lda=1.0), class_prior=prior)

```

Two runnable examples live in the repository: `examples/train_sft.py` and `examples/train_rl.py`, both driven by a JSONL manifest of captures and product labels. The guide covers the batch contract, prototype and threshold recalibration, and the checkpoint format the CLI reloads:

- [docs/TRAINING.md](https://github.com/lupingQAQ/IntraSpanNet/blob/main/docs/TRAINING.md) (English)
- [docs/TRAINING.zh-CN.md](https://github.com/lupingQAQ/IntraSpanNet/blob/main/docs/TRAINING.zh-CN.md) (Chinese)

Stage 1, the contrastive pretraining on lab captures, is not included because it depends on a data layout that cannot be redistributed.

## Files

- `stage3_*.pth`: six classifier arms.
- `prototypes_*_k3.pth`: prototype matrices.
- `stage1_clean_*.pth`: contrastive encoders.
- `student_d1.pth`: distilled student, experimental.
- `config.json`: ensemble configuration and reference metrics.
- `labels.json`: label table.
- `SHA256SUMS`: checksums.

## Citation

```bibtex

@software{luping2026intraspannet,

  author = {luping},

  title  = {IntraSpanNet: Identifying security appliances, endpoint agents and common software from intranet flows},

  year   = {2026},

  doi    = {10.5281/zenodo.23643146},

  url    = {https://github.com/lupingQAQ/IntraSpanNet},

  note   = {Model: https://huggingface.co/luping123/IntraSpanNet}

}

```