Saltar al contenido principal
fr/blog/obscura/research/mitm-approaches/

obscura/research/mitm-approaches

4 min de lecture

Aperçu

Obscura nécessite un proxy MitM (Homme-du-Milieu) pour intercepter et modifier le trafic HTTPS. Ce document évalue les options disponibles.

Approches

Approche 1 : Bibliothèque Go mitmproxy

Bibliothèque : github.com/elazarl/goproxy

Avantages :

  • Mature, bien testé
  • Gère automatiquement les tunnels CONNECT
  • Supporte la modification de réponse
  • MITM avec génération de certificats à la volée

Inconvénients :

  • Le support HTTP/2 est limité
  • Arbre de dépendances volumineux
  • Pas conçu pour le proxy transparent

Approche 2 : Proxy Rust Personnalisé avec tokio + rustls

Avantages :

  • Contrôle total sur la pile TLS
  • Performances (abstractions zéro-coût)
  • tokio-rustls pour la terminaison TLS
  • Hyper pour HTTP/1 et HTTP/2
  • Peut intégrer utls pour l'usurpation d'empreinte TLS

Inconvénients :

  • Plus d'effort de développement
  • Doit gérer la génération de certificats manuellement
  • Analyse au niveau des trames HTTP/2 requise

Approche 3 : Squid + Modification Externe

Avantages :

  • Proxy éprouvé
  • SSL Bump pour MITM
  • ICAP/eCAP pour la modification de contenu

Inconvénients :

  • Configuration complexe
  • Versions EOL encore utilisées
  • Pas conçu pour l'injection JS
  • Image de conteneur lourde

Approche 4 : Envoy Proxy avec Filtre Wasm

Avantages :

  • Haute performance
  • Proxy L4/L7
  • Filtres WebAssembly (Wasm) pour la modification
  • HTTP/2 et HTTP/3 natifs

Inconvénients :

  • Configuration complexe
  • Surcharge de développement de filtres Wasm
  • Pas conçu pour l'injection JS côté client
  • Excessif pour un déploiement à petite échelle

Approche 5 : Interception TCP Personnalisée

Interception de socket brute + terminaison TLS :

  1. Utiliser iptables TPROXY pour rediriger le trafic
  2. Lecture de socket TCP brute
  3. Poignée de main TLS manuelle (via rustls/crypto/tls)
  4. Analyse HTTP/1.1 ou HTTP/2
  5. Modification d'en-tête + injection JS
  6. Transmission à l'amont

Avantages :

  • Contrôle maximal
  • Aucune dépendance aux frameworks proxy
  • Peut gérer tous les cas particuliers

Inconvénients :

  • Effort de développement maximal
  • Doit implémenter la gestion HTTP/2 et HTTP/3
  • Doit gérer correctement le pooling de connexions

Recommandation

Pour Obscura, une implémentation Rust personnalisée (Approche 2) est le meilleur compromis :

  • Go goproxy manque de HTTP/2 et d'usurpation TLS
  • Rust donne un contrôle fin sur TLS (intégration utls)
  • Les performances comptent pour une passerelle réseau
  • Les garanties de sécurité de Rust réduisent les bugs du proxy

Génération de Certificats

Pour le MITM, le proxy doit générer des certificats TLS à la volée :

  1. Un certificat CA est généré au premier démarrage
  2. Pour chaque nouveau domaine, un certificat feuille est signé par le CA
  3. Le client doit approuver le certificat CA
CA Obscura (clé privée)
   *.example.com (feuille, généré à la première requête)
   *.anotherexample.com (feuille, généré à la première requête)

Stockage des Certificats

/var/lib/obscura/certs/
 ca.pem          # Certificat CA (public)
 ca-key.pem      # Clé privée CA
 cache/          # Certificats feuilles générés
    example.com.pem
    ...
 serial          # Compteur de série de certificat

Limitations

  • HPKP (HTTP Public Key Pinning) : Maintenant déprécié dans Chrome, mais certains sites l'utilisent encore
  • Préchargement HSTS : Les sites dans la liste de préchargement HSTS (ex., google.com, stripe.com) rejetteront les certificats MITM. Doit être intercepté au niveau DNS/réseau d'abord.
  • Transparence des Certificats : Certains sites exigent des logs CT. Le proxy doit intégrer des SCT.
  • HTTP/3 (QUIC) : Fonctionne sur UDP et est chiffré de bout en bout. Doit être bloqué au niveau réseau.

Conclusions

  • Rust avec tokio-rustls + hyper est la pile proxy recommandée
  • L'usurpation d'empreinte TLS nécessite l'intégration utls
  • Les sites préchargés HSTS doivent être gérés au niveau DNS/réseau
  • HTTP/3 doit être bloqué (QUIC contourne le proxy)