Bot detection

Détection de bots & anti-spoofing par empreintes réseau (JA4/JA4H), profilage navigateur et cohérence inter-signaux. — ↩ live profile

1. À quoi ça sert

Identifier ce qu'est réellement un client (navigateur, outil, bot) et détecter quand il ment — en croisant des signaux à plusieurs niveaux (TLS, HTTP, JS, matériel, réseau) qui sont difficiles à falsifier tous en même temps de façon cohérente.

2. Architecture

client ──HTTPS:443──▶ HAProxy ──HTTP──▶ Flask
                      │ termine TLS      │ JA4H (HTTP) + analyse
                      │ calcule le JA4    │ GeoIP/ASN (.mmdb MaxMind)
                      └ injecte X-JA4     │ sert la page de profilage JS
        HTTP:80 ▶ HAProxy ─ ACME ─▶ Flask ; reste ─301─▶ HTTPS
certbot ─ Let's Encrypt (renouvellement auto, reload HAProxy)

Pourquoi HAProxy ? Le JA4 (TLS) se calcule sur le ClientHello — seul le terminateur TLS le voit. Flask est derrière, il ne pourrait jamais le calculer. Plugin Lua : O-X-L/haproxy-ja4-fingerprint.

3. Les empreintes réseau

EmpreinteNiveauFalsifiable ?Ce qu'elle dit
JA4 (TLS)ClientHello TLStrès durla pile TLS du client (ciphers, extensions, ALPN…)
JA4H (HTTP)requête HTTPmoyenméthode, ordre/jeu des headers, langue, cookies
User-Agentheadertrivialce que le client prétend être

Nuance JA4 en TLS 1.3 : la partie b (ciphers, triés) est identique entre Chrome et Firefox → elle ne distingue pas les navigateurs. Le discriminant est la partie c (extensions). C'est pour ça qu'un match sur les ciphers seuls reste « famille indéterminée ».

4. Déduction & sources

On déduit l'outil depuis l'empreinte, par ordre de fiabilité : base curée → ja4db.com (match exact) → extensions a_c → ciphers a_b (non nommant). Le moteur de rendu (Gecko/Blink/WebKit) est déduit du UA et par feature-detection JS (bien plus fiable).

5. Profilage navigateur (JavaScript)

SectionSignaux
GPU / écranWebGL renderer (révèle le chip), résolution, viewport, DPR, profondeur couleur
CPU / ArchitectureClient Hints (arch/bitness/model) + SoC déduit du GPU. Note : navigator.platform dit « MacIntel » même sur Apple Silicon — non fiable, pas une incohérence.
Hardware consistencydevice détecté vs profil attendu (device_profiles.json) → incohérences (ex. iPhone avec grand écran, GPU Apple mais arch x86…)

6. Cross-checks anti-spoofing

7. WebRTC — fuite d'IP (détection VPN)

Le navigateur fait un round-trip STUN (Google) qui lui révèle son IP publique, puis la livre au JS via les candidats ICE. On collecte IPv4 + IPv6 (local + public) et on compare l'IP publique fuitée à l'IP vue par le serveur : différentes → derrière un VPN/proxy. Le STUN est public (stun.l.google.com) — configurable.

8. Empreintes stables

Canvas · Audio (OfflineAudioContext) · paramètres WebGL · fonts installées → hashés en un composite fingerprint SHA-256 (identifiant client stable même sans cookie).

9. Détection bot / headless

10. Proof of Work

JS hashcash (SHA-256, N bits à zéro → hashrate) et GPU WebGL (fragment-shader lourd → débit + confirme un GPU matériel vs SwiftShader=headless).

11. Pixel tracker

Charge déclenche tout le calcul serveur (JA4/JA4H/IP/headers) sans JS, puis renvoie une vraie image. Idéal email/forum/furtif.

<img src="https://TON-DOMAINE/image.png?TOKEN">

Le TOKEN identifie qui a ouvert → relisible via /result/?id=TOKEN.

12. Endpoints

RouteRôle
GET /page d'accueil (présentation, login)
GET /track?id=TOKENpage de profilage du navigateur (exécute les checks JS)
GET /appdashboard (login requis) : créer/supprimer ses tokens, voir les stats
GET /jsonanalyse complète en JSON
GET /image.png?TOKENpixel tracker → vraie image (+&transparent=1 pour 1×1)
GET /pixel.png?TOKENpixel 1×1 transparent
GET /verify.pngimage de vérification (anti-bot MD5, sans log)
GET /result/?id=TOKEN&format=json|htmltoutes les requêtes d'un token (timeline). html = page lisible, json = brut
GET /track?format=jsonashtmlpage de test qui exécute le JS puis affiche le JSON complet (serveur + client)
POST /result/delete?id=TOKENsupprime toutes les données stockées d'un token
GET /docscette page

JA4+ : FoxIO-LLC/ja4 · base communautaire ja4db.com.