Prečo môže štruktúra v C vytvoriť nesprávnu požiadavku SOCKS
Preverte explicitné šírky polí, poradie bajtov a prúdový I/O namiesto toho, aby ste rozloženie od kompilátora považovali za sieťový formát.
Platná adresa proxy neurobí ručne napísanú správu SOCKS platnou. Odoslanie štruktúry C alebo C++ môže odoslať výplň alebo celé čísla v poradí hostiteľa, ktoré protokol nikdy nevyžadoval.
Pre požiadavku SOCKS5 CONNECT s názvom domény serializujte túto postupnosť explicitne po vyjednaní metódy a prípadnej zvolenej autentizácie:
- Verzia, príkaz, rezervovaný bajt a typ adresy
- Dĺžka domény a bajty domény
- Dvojbajtový cieľový port v sieťovom poradí bajtov
Dĺžky adries závisia od verzie SOCKS a typu adresy. Číselné polia pevnej šírky potrebujú svoje určené zobrazenie; reťazce domén majú vlastné kódovanie dĺžky. Ukončovací znak reťazca C nie je všeobecný pokyn pridať k sieťovej správe nulu.
| Skratka v implementácii | Problém na overenie |
|---|---|
| Priradenie 32-bitovej hodnoty cez 8-bitový ukazovateľ | Nevypíše všetky štyri bajty |
| Pretypovanie buffera na ukazovateľ na väčšie celé číslo | Zarovnanie a poradie bajtov treba stále riešiť |
| Predpoklad, že jedno čítanie alebo zápis je jedna správa | TCP môže preniesť len časť postupnosti protokolu |
Porovnajte každé pole so zamýšľaným cieľom a ošetrite čiastočný I/O. Prijatie dvoch bajtov nedokazuje, že dorazila celá odpoveď. Skúmanie týchto hraníc môže odlíšiť poškodenú požiadavku od servera, ktorý odmieta správne opísané spojenie.