Miksi C-rakenne voi tuottaa huonon SOCKS-pyynnön
Tarkastele eksplisiittisiä kenttäleveyksiä, tavujärjestystä ja virran I/O:ta sen sijaan, että pitäisit kääntäjän asettelua siirtomuotona.
Kelvollinen välityspalvelimen osoite ei tee käsin kirjoitetusta SOCKS-viestistä kelvollista. C- tai C++-rakenteen lähettäminen voi lähettää täytettä tai isäntäjärjestyksessä olevia kokonaislukuja, joita protokolla ei koskaan pyytänyt.
SOCKS5-verkkotunnuksen CONNECT-pyynnössä serialisoi tämä järjestys eksplisiittisesti menetelmäneuvottelun ja valitun todennuksen jälkeen:
- Versio, komento, varattu tavu ja osoitetyyppi
- Verkkotunnuksen pituus ja verkkotunnuksen tavut
- Kaksitavuinen kohdeportti verkon tavujärjestyksessä
Osoitteiden pituudet riippuvat SOCKS-versiosta ja osoitetyypistä. Kiinteäleveyksiset numerokentät tarvitsevat määritellyn esityksensä; verkkotunnusmerkkijonoilla on oma pituuskoodauksensa. C-merkkijonon lopetusmerkki ei ole yleinen ohje lisätä nolla siirtoviestiin.
| Toteutuksen oikotie | Tarkistettava ongelma |
|---|---|
| 32-bittisen arvon sijoittaminen 8-bittisen osoittimen kautta | Se ei tulosta kaikkia neljää tavua |
| Puskurin tyyppimuunnos suuremman kokonaisluvun osoittimeksi | Tasaus ja tavujärjestys on silti hoidettava |
| Olettaa, että yksi luku tai kirjoitus on yksi viesti | TCP voi siirtää vain osan protokollan järjestyksestä |
Vertaa jokaista kenttää aiottuun kohteeseen ja käsittele osittainen I/O. Kahden tavun vastaanottaminen ei todista, että koko vastaus saapui. Näiden rajojen tarkastelu voi erottaa viallisen pyynnön palvelimesta, joka hylkää oikein kuvatun yhteyden.