CVE-2023-20938
English
भेद्यता विश्लेषण
- क्लाइंट A और क्लाइंट B संदर्भ प्रबंधक servicemanager के माध्यम से Binder कनेक्शन स्थापित करते हैं
- A नोड 0xbeef बनाता है (node = binder_new_node(proc, fp);), B ref->target_node के माध्यम से नोड 0xbeef को संदर्भित करता है
- B पहले target_node 0xbeef को सही ढंग से संसाधित करता है, और target_node 0xbeef को संदर्भित करने वाले binder_transaction को A के कार्य कतार में संग्रहीत करता है (binder_enqueue_work_ilocked(&t->work, &proc->todo);), जिससे A मुक्त किए गए डैंगलिंग पॉइंटर को फिर से संदर्भित कर सके
- B त्रुटि हैंडलिंग कोड में प्रवेश करने के लिए गैर-संरेखित offsets_size का उपयोग करता है (IS_ALIGNED(tr->offsets_size, sizeof(binder_size_t))), जिसके कारण अभी भी 0 buffer_offset को binder_transaction_buffer_release फ़ंक्शन में पारित किया जाता है, जिससे भेद्यता ट्रिगर होती है
- binder_transaction_buffer_release फ़ंक्शन binder_dec_node के माध्यम से binder_dec_node_nilocked फ़ंक्शन को कॉल करता है, नोड 0xbeef के local_strong_refs काउंटर को घटाता है, लेकिन नोड उदाहरण में कई काउंटर और संदर्भ सूचियाँ होती हैं, और केवल जब ये सभी काउंटर शून्य हो जाते हैं तो रिलीज़ ट्रिगर होती है
- B के बाइंडर को बंद करने से binder_cleanup_ref_olocked फ़ंक्शन ट्रिगर होता है, इस समय binder_dec_node_nilocked भी कॉल किया जाता है; जब binder_dec_node_nilocked true लौटाता है, तो नोड (0xbeef) की ओर इंगित करने वाला पॉइंटर ref->node साफ़ नहीं किया जाएगा
- इसके बाद binder_free_ref कॉल किया जाएगा, binder_free_ref फ़ंक्शन में नोड 0xbeef रिलीज़ हो जाता है
- A binder_thread_read फ़ंक्शन में मुक्त किए गए नोड 0xbeef को फिर से संदर्भित करेगा
अतिरिक्त स्पष्टीकरण:
वास्तविक एंड्रॉइड वातावरण में, सामान्य ऐप अनुमतियाँ servicemanager के माध्यम से सेवा पंजीकृत नहीं कर सकती हैं, लेकिन ITokenManager के माध्यम से दो प्रक्रियाओं के बीच लिंक स्थापित किया जा सकता है। यह परीक्षण मामला ITokenManager का उपयोग करता है