
CVE-2022-25258 - प्रदर्शन शोषण जो usb gadget's os descriptor handler को लक्षित करता है
USB गैजेट उपतंत्र में composite_setup फ़ंक्शन (composite.c) के OS डिस्क्रिप्टर हैंडलिंग अनुभाग में सुरक्षा समस्याएं शामिल हैं। उचित रूप से तैयार किए गए नियंत्रण स्थानांतरण अनुरोध संदेशों के प्रसंस्करण के परिणामस्वरूप नल पॉइंटर डीरेफरेंस या मेमोरी करप्शन के कारण डिवाइस क्रैश हो जाता है।
इंटरफ़ेस प्राप्तकर्ता के लिए composite_setup का OS डिस्क्रिप्टर हैंडलिंग अनुभाग निम्नानुसार कार्यान्वित किया गया है।
case USB_RECIP_INTERFACE:
if (w_index != 0x5 || (w_value >> 8))
break;
interface = w_value & 0xFF;
buf[6] = w_index;
count = count_ext_prop(os_desc_cfg,
interface);
put_unaligned_le16(count, buf + 8);
count = len_ext_prop(os_desc_cfg,
interface);
put_unaligned_le32(count, buf);
value = w_length;
if (w_length > 0x0A) {
value = fill_ext_prop(os_desc_cfg,
interface, buf);
if (value >= 0)
value = min_t(u16, w_length, value);
}
break;
इंटरफ़ेस चर w_value से प्राप्त होता है और बाद में count_ext_prop, len_ext_prop और fill_ext_prop फ़ंक्शन में usb_configuration->interface सरणी को अनुक्रमित करने के लिए उपयोग किया जाता है। चूँकि c->interface सरणी में MAX_CONFIG_INTERFACES (16) तत्वों का आकार है और इंटरफ़ेस चर को composite_setup के OS डिस्क्रिप्टर हैंडलिंग अनुभाग या कॉल किए गए फ़ंक्शन में मान्य नहीं किया गया है, यह एक हमलावर को c->interface सरणी को वास्तविक सीमाओं से परे अनुक्रमित करने की अनुमति देता है। यदि इंटरफ़ेस चर का मान MAX_CONFIG_INTERFACES से अधिक या उसके बराबर है, तो एंडपॉइंट को स्टॉल किया जाना चाहिए।
कुछ मामलों में, वास्तविक मेमोरी सामग्री के आधार पर, c->interface सरणी से परे अनुक्रमण करने से wLength 0x0A से अधिक होने पर fill_ext_prop के माध्यम से req->buf का बफर ओवरफ्लो हो सकता है। यदि ext_prop->name_len, ext_prop->data_len, 14 और 10 का योग int में ओवरफ्लो हो जाता है, तो count + n >= USB_COMP_EP0_OS_DESC_BUFSIZ शर्त पूरी नहीं होगी, जिससे usb_ext_prop_put_binary में memcpy के माध्यम से ओवरफ्लो की अनुमति मिलती है। फिर भी ऐसी स्थिति की संभावना काफी कम लगती है।
इसके अलावा, फ़ंक्शन count_ext_prop, len_ext_prop और fill_ext_prop में यह सत्यापन गायब है कि c->interface सरणी से प्राप्त *usb_function वास्तव में मान्य है या नहीं, जिसके परिणामस्वरूप नल पॉइंटर डीरेफरेंस होता है। जब प्राप्त usb_function पॉइंटर नल होता है, तो एंडपॉइंट को स्टॉल किया जाना चाहिए।
static int count_ext_prop(struct usb_configuration *c, int interface)
{
struct usb_function *f;
int j;
f = c->interface[interface];
for (j = 0; j < f->os_desc_n; ++j) {
struct usb_os_desc *d;
if (interface != f->os_desc_table[j].if_id)
continue;
d = f->os_desc_table[j].os_desc;
if (d && d->ext_compat_id)
return d->ext_prop_count;
}
return 0;
}
लिनक्स (और एंड्रॉइड) डिवाइस जो OS डिस्क्रिप्टर समर्थन के साथ USB गैजेट को उजागर करते हैं, एक दुर्भावनापूर्ण होस्ट द्वारा एकल नियंत्रण स्थानांतरण संदेश के माध्यम से मनमाने ढंग से क्रैश किए जा सकते हैं।
वर्णित समस्या को संबोधित करने वाला एक पैच स्वीकार कर लिया गया है और अब समर्थित कर्नेल संस्करणों में उपलब्ध है। अधिक जानकारी के लिए नीचे दिए गए लिंक देखें।