La demande de connexion SOCKS4 réussit, mais l'application ne voit jamais le message d'accueil initial du serveur. Un endroit à examiner est la première lecture du connecteur. Une lecture de seize octets est trop grande pour une réponse SOCKS4 de huit octets.

Champ de la réponseOctets
Champ de version de la réponse1
Code de résultat1
Champ de port2
Champ d'adresse4

Le code de résultat 0x5a indique que la demande a été accordée. SOCKS4a change la façon dont la demande transporte un nom d'hôte ; il ne transforme pas la réponse en seize octets.

Après la réponse, le même flux TCP transporte le protocole de destination. Un serveur de messagerie peut envoyer son message d'accueil immédiatement. Une lecture qui consomme seize octets disponibles peut donc emporter la réponse complète du proxy plus les huit premiers octets de ce message. Si rien ne suit encore, une lecture bloquante trop grande peut au contraire ajouter une attente inutile.

La longueur exacte relève de la responsabilité de l'analyseur

Demander huit octets une seule fois ne prouve pas suffisamment que huit octets sont arrivés. Les lectures de flux peuvent en renvoyer moins. Collectez exactement la longueur de la réponse dans un délai imparti, arrêtez-vous sur un flux fermé ou en échec, inspectez la réponse et laissez les octets suivants à l'application.

Si le connecteur utilise une lecture tamponnée plus grande, conservez tout ce qui suit la frontière et transmettez-le au consommateur suivant. Jeter le surplus revient à la même perte de données avec une taille de lecture différente.

SOCKS5 a besoin de son propre analyseur. L'adresse de sa réponse peut avoir des longueurs différentes selon le type d'adresse. Remplacer chaque lecture de proxy par une lecture fixe de huit octets corrigerait un protocole tout en en cassant un autre.

Articles similaires