कर्नेल कंट्रोल फ़्लो इंटेग्रिटी

कंट्रोल फ़्लो इंटिग्रिटी (सीएफ़आई) एक सुरक्षा तंत्र है. यह संकलित बाइनरी के मूल कंट्रोल फ़्लो ग्राफ़ में बदलाव करने की अनुमति नहीं देता. इससे इस तरह के हमले करना काफ़ी मुश्किल हो जाता है.

Android 9 में, हमने LLVM के ज़रिए CFI को ज़्यादा कॉम्पोनेंट और भीतर के हिस्से में लागू किया है. सिस्टम सीएफ़आई डिफ़ॉल्ट रूप से चालू होता है. हालांकि, आपको कर्नेल सीएफ़आई चालू करना होगा.

LLVM के CFI को लिंक-टाइम ऑप्टिमाइज़ेशन (LTO) के साथ कंपाइल करने की ज़रूरत होती है. LTO, ऑब्जेक्ट फ़ाइलों के LLVM बिटकोड को लिंक करने के समय तक सुरक्षित रखता है. इससे कंपाइलर को यह तय करने में मदद मिलती है कि कौनसे ऑप्टिमाइज़ेशन किए जा सकते हैं. LTO को चालू करने से, फ़ाइनल बाइनरी का साइज़ कम हो जाता है और परफ़ॉर्मेंस बेहतर होती है. हालांकि, इससे कंपाइल करने में लगने वाला समय बढ़ जाता है. Android पर टेस्ट करने पर, LTO और CFI के कॉम्बिनेशन से कोड के साइज़ और परफ़ॉर्मेंस पर बहुत कम असर पड़ता है. कुछ मामलों में, दोनों में सुधार होता है.

सीएफ़आई और फ़ॉरवर्ड-कंट्रोल की अन्य जांच को मैनेज करने के तरीके के बारे में ज़्यादा तकनीकी जानकारी के लिए, LLVM डिज़ाइन दस्तावेज़ देखें.

लागू करना

kCFI पैच, Android के काम करने वाले सभी वर्शन के कर्नेल में मौजूद होते हैं. CONFIG_CFI_CLANG विकल्प, kCFI को चालू करता है और यह GKI में डिफ़ॉल्ट रूप से सेट होता है.

समस्या का हल

चालू करने के बाद, ड्राइवर से जुड़ी गड़बड़ियों को ठीक करें. काम न करने वाले फ़ंक्शन पॉइंटर की मदद से, किसी फ़ंक्शन को इनडायरेक्ट तौर पर कॉल करने पर, सीएफ़आई ट्रिगर होता है. जब सीएफ़आई में कोई गड़बड़ी का पता चलता है, तो कर्नेल एक चेतावनी दिखाता है. इसमें, कॉल किए गए फ़ंक्शन और गड़बड़ी की वजह बने स्टैक ट्रेस, दोनों शामिल होते हैं. इसे ठीक करने के लिए, पक्का करें कि फ़ंक्शन पॉइंटर हमेशा उस फ़ंक्शन के टाइप के ही हों जिसे कॉल किया जाता है.

सीएफ़आई की गड़बड़ियों को डीबग करने में मदद पाने के लिए, CONFIG_CFI_PERMISSIVE को चालू करें. इससे, कर्नेल पैनिक होने के बजाय चेतावनी दिखती है. अनुमति वाले मोड का इस्तेमाल, प्रोडक्शन में नहीं किया जाना चाहिए.

पुष्टि करें

फ़िलहाल, सीएफ़आई के लिए कोई सीटीएस टेस्ट उपलब्ध नहीं है. इसके बजाय, पक्का करें कि सीटीएस टेस्ट, सीएफ़आई चालू होने पर और बिना चालू होने पर, दोनों ही स्थितियों में पास हों. इससे यह पुष्टि की जा सकेगी कि सीएफ़आई का डिवाइस पर कोई असर नहीं पड़ रहा है.