C स्ट्रक्चर खराब SOCKS अनुरोध क्यों उत्पन्न कर सकता है
कंपाइलर लेआउट को वायर फ़ॉर्मैट मानने के बजाय स्पष्ट फ़ील्ड चौड़ाई, बाइट क्रम और स्ट्रीम I/O की जाँच करें।
मान्य प्रॉक्सी पता हाथ से लिखे SOCKS संदेश को मान्य नहीं बनाता। C या C++ struct भेजने से ऐसा पैडिंग या होस्ट-क्रम के पूर्णांक भेजे जा सकते हैं जो प्रोटोकॉल ने कभी नहीं माँगे।
SOCKS5 डोमेन-नाम CONNECT अनुरोध के लिए, विधि वार्ता और चुने गए किसी भी प्रमाणीकरण के बाद इस क्रम को स्पष्ट रूप से सीरियलाइज़ करें:
- संस्करण, कमांड, आरक्षित बाइट और पता प्रकार
- डोमेन लंबाई और डोमेन बाइट्स
- नेटवर्क बाइट क्रम में दो-बाइट गंतव्य पोर्ट
पता लंबाइयाँ SOCKS संस्करण और पता प्रकार पर निर्भर करती हैं। निश्चित चौड़ाई के संख्यात्मक फ़ील्ड को उनका निर्दिष्ट निरूपण चाहिए; डोमेन स्ट्रिंग का अपना लंबाई एन्कोडिंग होता है। C स्ट्रिंग टर्मिनेटर वायर संदेश में शून्य जोड़ने का सामान्य निर्देश नहीं है।
| कार्यान्वयन शॉर्टकट | जाँचने योग्य समस्या |
|---|---|
| 8-बिट पॉइंटर के माध्यम से 32-बिट मान असाइन करना | यह चारों बाइट नहीं निकालता |
| बफ़र को बड़े पूर्णांक पॉइंटर में कास्ट करना | संरेखण और बाइट क्रम अभी भी संभालना होगा |
| यह मानना कि एक पढ़ना या लिखना एक संदेश है | TCP प्रोटोकॉल क्रम का केवल एक भाग स्थानांतरित कर सकता है |
प्रत्येक फ़ील्ड की तुलना इच्छित गंतव्य से करें और आंशिक I/O संभालें। दो बाइट मिलने से यह सिद्ध नहीं होता कि पूरा उत्तर आ गया। इन सीमाओं की जाँच विकृत अनुरोध को सही ढंग से वर्णित कनेक्शन अस्वीकार करने वाले सर्वर से अलग कर सकती है।