fix(ja4ebpf): Rocky Linux RPM builder, remove correlated field, fix thesis

- Dockerfile.package: migre go-builder de golang:bookworm (Debian) vers
  rockylinux:9, installe Go depuis le tarball officiel, remplace apt par
  dnf (clang llvm libbpf-devel bpftool)

- Suppression du champ 'correlated' de l'agent ja4ebpf : avec eBPF/XDP,
  la corrélation L3/L4↔L7 est toujours implicite par présence des champs.
  Supprimé de : session.go, manager.go, main.go (x5), clickhouse.go

- Thèse (6 corrections listées + cohérence correlated) :
  1. §3.5 + §3.9.1 : SSL_read retourne des octets bruts sans respecter les
     frontières H2 → buffer circulaire de réassemblage en Go userspace
  2. §3.1 : supprimé libpcap + CAP_NET_RAW, remplacé par définition uprobe
  3. §4 + §7 : compte exact 96 features en 8 familles (Famille 1–8),
     supprimé taxonomie F1–F11 obsolète, tous les totaux mis à jour
  4. §2.4 + §8 : remplacé 7 fausses URLs arXiv par [Référence à vérifier]
  5. §4 Famille 2 : ja4_drift_ratio → renvoi à Famille 8 (définition complète)
  6. §6.4 : ajouté limite 'Overhead de l'uprobe SSL_read'
  + §3.6 : supprimé correlated=0/1 du texte architectural

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
toto
2026-04-12 04:48:40 +02:00
parent b1218a2367
commit 957918c565
19 changed files with 104 additions and 92 deletions

View File

@ -76,7 +76,6 @@ func (m *Manager) GetOrCreate(key SessionKey) *SessionState {
Key: key,
FirstSeen: now,
LastActivity: now,
Correlated: false,
MaxKeepAlives: 1,
}
sh.sessions[key] = s
@ -128,12 +127,6 @@ func (m *Manager) gcRound(slowlorisThreshold time.Duration) {
slowloris := s.IsSlowloris(slowlorisThreshold)
if expired || slowloris {
// Marquer les sessions Slowloris comme non corrélées
if slowloris && !expired {
s.mu.Lock()
s.Correlated = false
s.mu.Unlock()
}
toDelete = append(toDelete, key)
// Envoyer sans bloquer (drop si le canal est plein)
select {

View File

@ -75,7 +75,6 @@ type SessionState struct {
FirstSeen time.Time // horodatage de création de la session
LastActivity time.Time // horodatage de la dernière activité
Correlated bool // true si L3/L4 et L7 sont corrélés
mu sync.Mutex // protection des modifications concurrentes
}

View File

@ -32,7 +32,6 @@ type sessionRecord struct {
SrcPort int `json:"src_port"`
DstIP string `json:"dst_ip"`
DstPort int `json:"dst_port"`
Correlated int `json:"correlated"`
// Métadonnées IP (noms attendus par le MV)
IPMetaDF *bool `json:"ip_meta_df,omitempty"`
@ -182,18 +181,12 @@ func sessionToRecord(s *correlation.SessionState) sessionRecord {
srcIP := fmt.Sprintf("%d.%d.%d.%d",
s.Key.SrcIP[0], s.Key.SrcIP[1], s.Key.SrcIP[2], s.Key.SrcIP[3])
correlated := 0
if s.Correlated {
correlated = 1
}
rec := sessionRecord{
Time: s.FirstSeen,
SrcIP: srcIP,
SrcPort: int(s.Key.SrcPort),
DstIP: "0.0.0.0", // destination non capturée par les sondes eBPF actuelles
DstPort: 0,
Correlated: correlated,
KeepAlives: len(s.Requests),
}