Hvorfor en C-struct kan produsere en dårlig SOCKS-forespørsel
Undersøk eksplisitte feltbredder, byte-rekkefølge og strøm-I/O i stedet for å behandle kompilatorens layout som trådformatet.
En gyldig proxyadresse gjør ikke en håndskrevet SOCKS-melding gyldig. Å sende en C- eller C++-struct kan sende utfylling eller heltall i vertsrekkefølge som protokollen aldri ba om.
For en SOCKS5 CONNECT-forespørsel med domenenavn, serialiser denne sekvensen eksplisitt etter metodeforhandling og eventuell valgt autentisering:
- Versjon, kommando, reservert byte og adressetype
- Domenelengde og domenebytes
- Den to-byte destinasjonsporten i nettverksbyte-rekkefølge
Adresselengder avhenger av SOCKS-versjonen og adressetypen. Numeriske felt med fast bredde trenger sin angitte representasjon; domenestrenger har sin egen lengdekoding. En C-strengterminator er ikke en generell instruks om å legge til en null i trådmeldingen.
| Implementasjonssnarvei | Problem å kontrollere |
|---|---|
| Tilordne en 32-bits verdi gjennom en 8-bits peker | Den sender ikke ut alle fire bytene |
| Caste en buffer til en peker til et større heltall | Justering og byte-rekkefølge må fortsatt håndteres |
| Anta at én lesing eller skriving er én melding | TCP kan bare overføre en del av protokollsekvensen |
Sammenlign hvert felt med den tiltenkte destinasjonen og håndter delvis I/O. Å motta to bytes beviser ikke at hele svaret er kommet. Ved å undersøke disse grensene kan man skille en feilaktig forespørsel fra en server som avviser en korrekt beskrevet tilkobling.