Γιατί μια δομή C μπορεί να παράγει ένα κακό αίτημα SOCKS
Ελέγξτε τα ρητά πλάτη πεδίων, τη σειρά byte και το I/O ροής αντί να θεωρείτε τη διάταξη του μεταγλωττιστή ως μορφή δικτύου.
Μια έγκυρη διεύθυνση διακομιστή μεσολάβησης δεν κάνει έγκυρο ένα χειρόγραφο μήνυμα SOCKS. Η αποστολή μιας δομής C ή C++ μπορεί να στείλει γέμισμα ή ακέραιους σε σειρά κεντρικού υπολογιστή που το πρωτόκολλο δεν ζήτησε ποτέ.
Για ένα αίτημα SOCKS5 CONNECT με όνομα τομέα, σειριοποιήστε αυτή την ακολουθία ρητά μετά τη διαπραγμάτευση μεθόδου και οποιαδήποτε επιλεγμένη ταυτοποίηση:
- Έκδοση, εντολή, δεσμευμένο byte και τύπος διεύθυνσης
- Μήκος τομέα και byte τομέα
- Η θύρα προορισμού δύο byte σε σειρά byte δικτύου
Τα μήκη διευθύνσεων εξαρτώνται από την έκδοση SOCKS και τον τύπο διεύθυνσης. Τα αριθμητικά πεδία σταθερού πλάτους χρειάζονται την καθορισμένη αναπαράστασή τους· οι συμβολοσειρές τομέα έχουν τη δική τους κωδικοποίηση μήκους. Ένας τερματιστής συμβολοσειράς C δεν είναι γενική οδηγία να προστεθεί μηδέν στο μήνυμα δικτύου.
| Συντόμευση υλοποίησης | Πρόβλημα προς έλεγχο |
|---|---|
| Εκχώρηση τιμής 32 bit μέσω δείκτη 8 bit | Δεν εξάγει και τα τέσσερα byte |
| Μετατροπή buffer σε δείκτη μεγαλύτερου ακεραίου | Η στοίχιση και η σειρά byte πρέπει ακόμη να αντιμετωπιστούν |
| Υπόθεση ότι μία ανάγνωση ή εγγραφή είναι ένα μήνυμα | Το TCP μπορεί να μεταφέρει μόνο μέρος της ακολουθίας του πρωτοκόλλου |
Συγκρίνετε κάθε πεδίο με τον επιδιωκόμενο προορισμό και χειριστείτε μερικό I/O. Η λήψη δύο byte δεν αποδεικνύει ότι έφτασε ολόκληρη η απάντηση. Η εξέταση αυτών των ορίων μπορεί να διακρίνει ένα παραμορφωμένο αίτημα από έναν διακομιστή που αρνείται μια σωστά περιγραφόμενη σύνδεση.