
CVE-2017-14948 D-Link 880 फर्मवेयर के लिए
इस छोटे से लेख में हम D-Link उत्पादों में मिली कुछ बगों को देखेंगे। D-Link उत्पादों की एक विस्तृत श्रृंखला पेश करता है, जिसमें कई अलग-अलग राउटर मॉडल शामिल हैं, जिन पर विभिन्न फ़र्मवेयर संस्करण चलते हैं। इस दस्तावेज़ में मैं निम्नलिखित फ़र्मवेयर संस्करणों को संबोधित करूँगा: DIR-880L, DIR-868L, DIR-890L, DIR-885L और DIR-895L। बिना किसी और देरी के, चलिए शुरू करते हैं।
चूँकि मेरे पास D-Link राउटरों में से कोई भी नहीं था, और वे अपने फ़र्मवेयर तक मुफ़्त पहुँच प्रदान करते हैं, मैंने केवल स्थैतिक विश्लेषण पर निर्भर रहकर बग खोजने का निर्णय लिया। ध्यान दें कि, इस अनुभाग में मैं DIR-880L फ़र्मवेयर का उल्लेख करूँगा, अन्य फ़र्मवेयर की संरचना समान है।
DIR-880L फ़र्मवेयर को डाउनलोड और अनपैक करने के बाद, मैंने पाया कि इसके फ़र्मवेयर में एक संपूर्ण squashFS फ़ाइल-सिस्टम है, जिसमें लगभग 2160 फ़ाइलें हैं। चूँकि मैं उनमें से प्रत्येक पर अलग-अलग विचार नहीं करना चाहता था, मैंने उपयोगकर्ता-इनपुट संभालने वाली फ़ाइल की तलाश शुरू की।
कॉन्फ़िगरेशन फ़ाइलों का विश्लेषण करने और ज्ञात HTTP हेडर की खोज करने के बाद, मैंने अंततः अपना ध्यान तीन बाइनरी पर केंद्रित किया, और अंततः एक पर: fileaccess.cgi।
यहाँ कमज़ोर फ़ंक्शन का डिसअसेंबली है:
signed int __fastcall content_type(char *a1)
{
char *dest; // [sp+4h] [bp-10h]@1
const char *haystack; // [sp+Ch] [bp-8h]@1
char *haystacka; // [sp+Ch] [bp-8h]@3
dest = a1;
haystack = getenv("CONTENT_TYPE");
if ( !haystack )
return -22;
haystacka = strstr(haystack, "boundary=");
if ( !haystacka )
return -22;
strcpy(dest, haystacka + 9);
return 0;
}
उपरोक्त कोड में, चर 'CONTENT_TYPE' (जिसे चर haystack द्वारा इंगित किया गया है) की सामग्री उपयोगकर्ता द्वारा (HTTP अनुरोध के हेडर के माध्यम से) नियंत्रित की जाती है। इसकी सामग्री, 'boundary' कीवर्ड के बाद, haystacka की लंबाई की जाँच किए बिना बफर dest में कॉपी कर दी जाती है। यदि कोई कॉलर फ़ंक्शन (पता 0x1CE6C) को देखता है, तो वह अनुमान लगा सकता है कि dest का आकार 256 बाइट्स है। चूँकि एक हमलावर CONTENT_TYPE की सामग्री को नियंत्रित कर सकता है, वह 'boundary=' स्ट्रिंग के बाद कम से कम 257 वर्ण भेजकर बफर ओवरफ़्लो ट्रिगर कर सकता है।
उसी फ़र्मवेयर नमूने में दो अन्य समान बग पाए गए, जो HTTP कुकी से संबंधित हैं। उनमें से एक नीचे दिखाया गया है:
v10 = getenv("HTTP_COOKIE");
if ( v10 )
{
strcpy((char *)&v5, &v10[v11]);
v17 = strlen((const char *)&v5);
}
यहाँ, चर v10 उपयोगकर्ता की कुकी की ओर इंगित करता है, जो RFC2109 के अनुसार अधिकतम 4k बाइट्स हो सकती है। हालाँकि, चर v5 1024 बाइट्स जितना बड़ा है (जैसा कि हम फ़ंक्शन के स्टैक फ्रेम से अनुमान लगा सकते हैं)। यह बफर ओवरफ़्लो ट्रिगर कर सकता है।
इन बगों की रिपोर्ट D-Link द्वारा की गई और पुष्टि की गई।
ये फ़र्मवेयर नमूने DIR-880L के समान संरचना प्रस्तुत करते हैं और उन्हीं HTTP फ़ील्ड से संबंधित समान बग रखते हैं।