Kvifor ein C-struct kan produsere ein dårleg SOCKS-førespurnad
Undersøk eksplisitte feltbreidder, byte-rekkjefølgje og straum-I/O i staden for å handsame oppsettet til kompilatoren som trådformatet.
Ei gyldig proxyadresse gjer ikkje ei handskriven SOCKS-melding gyldig. Å senda ein C- eller C++-struct kan senda utfylling eller heiltal i vertsrekkjefølgje som protokollen aldri bad om.
For ein SOCKS5 CONNECT-førespurnad med domenenamn, serialiser denne sekvensen eksplisitt etter metodeforhandling og eventuell vald autentisering:
- Versjon, kommando, reservert byte og adressetype
- Domenelengd og domenebyte
- Den to-byte destinasjonsporten i nettverksbyte-rekkjefølgje
Adresselengder er avhengige av SOCKS-versjonen og adressetypen. Numeriske felt med fast breidd treng den angjevne framstillinga si; domenestrengar har si eiga lengdekoding. Ein C-strengterminator er ikkje ei generell oppskrift på å leggja til ein null i trådmeldinga.
| Snarveg i implementasjonen | Problem å kontrollera |
|---|---|
| Tilordna ein 32-bits verdi gjennom ein 8-bits peikar | Han sender ikkje ut alle fire byta |
| Kasta ein buffer til ein peikar til eit større heiltal | Justering og byte-rekkjefølgje må framleis handsamast |
| Anta at éi lesing eller skriving er éi melding | TCP kan berre overføra ein del av protokollsekvensen |
Samanlikn kvart felt med den tiltenkte destinasjonen og handsam delvis I/O. Å ta imot to byte beviser ikkje at heile svaret er kome. Ved å undersøkja desse grensene kan ein skilja ein feilaktig førespurnad frå ein tenar som avviser ei korrekt skildra tilkopling.