Dlaczego struktura w C może dać błędne żądanie SOCKS
Sprawdzaj jawne szerokości pól, kolejność bajtów i strumieniowe I/O, zamiast traktować układ kompilatora jako format sieciowy.
Prawidłowy adres proxy nie czyni poprawnym ręcznie napisanego komunikatu SOCKS. Wysłanie struktury C lub C++ może wysłać dopełnienie lub liczby całkowite w kolejności hosta, których protokół nigdy nie wymagał.
Dla żądania SOCKS5 CONNECT z nazwą domeny serializuj tę sekwencję jawnie po negocjacji metody i wybranej autoryzacji:
- Wersja, polecenie, bajt zarezerwowany i typ adresu
- Długość domeny i bajty domeny
- Dwubajtowy port docelowy w sieciowej kolejności bajtów
Długości adresów zależą od wersji SOCKS i typu adresu. Pola liczbowe o stałej szerokości wymagają określonej reprezentacji; ciągi domen mają własne kodowanie długości. Terminator ciągu C nie jest ogólnym poleceniem dodania zera do komunikatu sieciowego.
| Skrót w implementacji | Problem do sprawdzenia |
|---|---|
| Przypisanie wartości 32-bitowej przez 8-bitowy wskaźnik | Nie emituje wszystkich czterech bajtów |
| Rzutowanie bufora na wskaźnik większej liczby całkowitej | Wyrównanie i kolejność bajtów nadal wymagają obsługi |
| Założenie, że jeden odczyt lub zapis to jeden komunikat | TCP może przesłać tylko część sekwencji protokołu |
Porównaj każde pole z zamierzonym celem i obsłuż częściowe I/O. Odebranie dwóch bajtów nie dowodzi, że dotarła cała odpowiedź. Zbadanie tych granic pozwala odróżnić uszkodzone żądanie od serwera odrzucającego poprawnie opisane połączenie.