Files
ja4-platform/tests/vm
toto 957918c565 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>
2026-04-12 04:48:40 +02:00
..

Tests VM — eBPF sur kernel réel (Rocky Linux 9)

Pourquoi une VM ?

Les tests Docker ne peuvent capturer que L3/L4 et TLS (via le hook TC). Les données L7 HTTP (method, path, status_code, header_order_signature) nécessitent :

Fonctionnalité eBPF Docker VM
Hook TC (XDP) — L3/L4 + TLS
Uprobe SSL_read — L7 HTTP attache attache
Tracepoint accept4 — corrélation IP pas de tracefs
Kprobe accept4 — corrélation IP pas de perf PMU

Dans une VM, le kernel complet est disponible → accept4 fonctionne → la corrélation IP est parfaite → les données L7 arrivent dans ClickHouse.

Prérequis (installation unique)

# 1. Installer Vagrant + libvirt + KVM
sudo apt-get install -y vagrant libvirt-daemon-system libvirt-clients \
                        qemu-kvm ruby-libvirt bridge-utils

# 2. Plugin vagrant-libvirt
vagrant plugin install vagrant-libvirt

# 3. Ajouter ton user aux groupes (nécessite une reconnexion)
sudo usermod -aG libvirt,kvm $USER
# → Se déconnecter et se reconnecter

# 4. Vérifier que KVM fonctionne
virsh list --all

Utilisation

# Depuis la racine du projet :

# Créer la VM (première fois, ~5-10 min — télécharge Rocky Linux 9)
make vm-up

# Lancer le test nginx complet (L3/L4 + TLS + L7 HTTP)
make test-vm-nginx

# Après modification des sources Go/C
make vm-rebuild-ja4ebpf   # synchronise + recompile dans la VM
make test-vm-nginx         # relancer les tests

# Connexion SSH interactive
make vm-ssh

# Détruire la VM (libère l'espace disque)
make vm-down

Ce que teste test-vm-nginx

  1. Build — recompile ja4ebpf (BPF CO-RE + Go) depuis les sources
  2. ClickHouse — démarre dans Docker (dans la VM)
  3. nginx — démarre avec TLS + HTTP/2
  4. ja4ebpf — démarre avec uprobes + accept4 tracepoints
  5. Trafic — HTTP/1.0, HTTP/1.1, HTTPS/1.1, HTTPS/2.0
  6. Vérification DB :
    • ip_meta_ttl, tcp_meta_mss, tcp_meta_window_size
    • ja4, tls_sni
    • method, path, status_code (uniquement en VM)
    • header_order_signature (uniquement en VM)

Différence avec les tests Docker

Check Docker VM
L3/L4 (TTL, MSS, window)
TLS fingerprint (JA4, SNI)
L7 méthode HTTP
L7 path HTTP
status_code
header_order_signature

Architecture de la VM

VM Rocky Linux 9 (KVM)
├── nginx + libssl.so.3   ← serveur web cible
├── ja4ebpf               ← agent eBPF (natif, pas Docker)
│   ├── TC hook (eth0)    ← capture L3/L4 + TLS ClientHello
│   ├── Uprobe SSL_read   ← capture HTTP déchiffré
│   └── Tracepoint accept4 ← corrélation fd→IP (disponible !)
└── ClickHouse (Docker)   ← base de données

Dépannage

vagrant up échoue : "Call to virConnectOpen failed"

sudo systemctl start libvirtd
sudo usermod -aG libvirt $USER  # puis se reconnecter

Erreur "default pool not found"

sudo virsh pool-define-as default dir --target /var/lib/libvirt/images
sudo virsh pool-build default
sudo virsh pool-start default
sudo virsh pool-autostart default

ja4ebpf : "uprobe SSL_read" ne s'attache pas

# Vérifier le chemin libssl dans la VM
vagrant ssh -- 'ls -la /usr/lib64/libssl*'
# Si différent de /usr/lib64/libssl.so.3, modifier /tmp/ja4ebpf.yml