Proč může struktura v C vytvořit špatný požadavek SOCKS
Prověřte explicitní šířky polí, pořadí bajtů a proudový I/O místo toho, abyste rozložení od kompilátoru považovali za síťový formát.
Platná adresa proxy neudělá ručně psanou zprávu SOCKS platnou. Odeslání struktury C nebo C++ může odeslat výplň nebo celá čísla v pořadí hostitele, která protokol nikdy nevyžadoval.
Pro požadavek SOCKS5 CONNECT s názvem domény serializujte tuto posloupnost explicitně po vyjednání metody a případné zvolené autentizaci:
- Verze, příkaz, rezervovaný bajt a typ adresy
- Délka domény a bajty domény
- Dvoubajtový cílový port v síťovém pořadí bajtů
Délky adres závisí na verzi SOCKS a typu adresy. Číselná pole pevné šířky potřebují své určené zobrazení; řetězce domén mají vlastní kódování délky. Ukončovací znak řetězce C není obecný pokyn přidat k síťové zprávě nulu.
| Zkratka v implementaci | Problém k prověření |
|---|---|
| Přiřazení 32bitové hodnoty přes 8bitový ukazatel | Nevypíše všechny čtyři bajty |
| Přetypování bufferu na ukazatel na větší celé číslo | Zarovnání a pořadí bajtů je stále třeba řešit |
| Předpoklad, že jedno čtení nebo zápis je jedna zpráva | TCP může přenést jen část posloupnosti protokolu |
Porovnejte každé pole se zamýšleným cílem a ošetřete částečný I/O. Přijetí dvou bajtů nedokazuje, že dorazila celá odpověď. Zkoumání těchto hranic může odlišit poškozený požadavek od serveru, který odmítá správně popsané spojení.