O adresă de proxy validă nu face valid un mesaj SOCKS scris de mână. Trimiterea unui struct C sau C++ poate trimite umplutură sau întregi în ordinea gazdă pe care protocolul nu le-a cerut niciodată.

Pentru o cerere SOCKS5 CONNECT cu nume de domeniu, serializați această secvență explicit după negocierea metodei și orice autentificare selectată:

  1. Versiune, comandă, octet rezervat și tip de adresă
  2. Lungimea domeniului și octeții domeniului
  3. Portul destinație de doi octeți în ordinea octeților de rețea

Lungimile adreselor depind de versiunea SOCKS și de tipul adresei. Câmpurile numerice cu lățime fixă au nevoie de reprezentarea specificată; șirurile de domeniu au propria codificare a lungimii. Terminatorul de șir C nu este o instrucțiune generală de a adăuga un zero la mesajul de rețea.

Scurtătură de implementareProblemă de verificat
Atribuirea unei valori de 32 de biți printr-un pointer de 8 bițiNu emite toți cei patru octeți
Convertirea unui buffer într-un pointer la un întreg mai mareAlinierea și ordinea octeților trebuie încă tratate
Presupunerea că o citire sau scriere este un singur mesajTCP poate transfera doar o parte a secvenței protocolului

Comparați fiecare câmp cu destinația dorită și tratați I/O parțial. Primirea a doi octeți nu dovedește că a sosit întregul răspuns. Examinarea acestor limite poate distinge o cerere malformată de un server care refuză o conexiune descrisă corect.

Articole similare