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:

  1. Wersja, polecenie, bajt zarezerwowany i typ adresu
  2. Długość domeny i bajty domeny
  3. 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 implementacjiProblem do sprawdzenia
Przypisanie wartości 32-bitowej przez 8-bitowy wskaźnikNie emituje wszystkich czterech bajtów
Rzutowanie bufora na wskaźnik większej liczby całkowitejWyrównanie i kolejność bajtów nadal wymagają obsługi
Założenie, że jeden odczyt lub zapis to jeden komunikatTCP 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.

Powiązane artykuły