De ce o struct C poate produce o cerere SOCKS greșită
Inspectați lățimile explicite ale câmpurilor, ordinea octeților și I/O în flux în loc să tratați aspectul compilatorului ca format de rețea.
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ă:
- Versiune, comandă, octet rezervat și tip de adresă
- Lungimea domeniului și octeții domeniului
- 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 implementare | Problemă de verificat |
|---|---|
| Atribuirea unei valori de 32 de biți printr-un pointer de 8 biți | Nu emite toți cei patru octeți |
| Convertirea unui buffer într-un pointer la un întreg mai mare | Alinierea și ordinea octeților trebuie încă tratate |
| Presupunerea că o citire sau scriere este un singur mesaj | TCP 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.