ShadowCallStack

ShadowCallStack (SCS), LLVM इंस्ट्रूमेंटेशन मोड है. यह रिटर्न पता ओवरराइट होने (जैसे कि स्टैक बफ़र ओवरफ़्लो) से बचाता है. ऐसा करने के लिए, यह फ़ंक्शन के रिटर्न पते को अलग से लिए गए ShadowCallStack में सेव करता है. यह सेविंग, नॉन-लीफ़ फ़ंक्शन के फ़ंक्शन प्रोलॉग में की जाती है. साथ ही, फ़ंक्शन एपिलॉग में ShadowCallStack से रिटर्न पता लोड किया जाता है. रिटर्न पता, अनवाइंडर के साथ काम करने के लिए, रेगुलर स्टैक पर भी सेव किया जाता है. हालांकि, इसका इस्तेमाल अन्य कामों के लिए नहीं किया जाता. इससे यह पक्का होता है कि सामान्य स्टैक पर रिटर्न पते में बदलाव करने वाले हमलों का, प्रोग्राम के कंट्रोल फ़्लो पर कोई असर न पड़े.

aarch64 पर, ShadowCallStack का रेफ़रंस देने के लिए, इंस्ट्रूमेंटेशन x18 रजिस्टर का इस्तेमाल करता है. इसका मतलब है कि ShadowCallStack के रेफ़रंस को मेमोरी में सेव करने की ज़रूरत नहीं है. इससे, ऐसा रनटाइम लागू किया जा सकता है जो ShadowCallStack के पते को उन हमलावरों को ज़ाहिर करने से रोकता है जो मनमुताबिक मेमोरी पढ़ सकते हैं.

लागू करना

Android, कर्नेल और यूज़रस्पेस, दोनों के लिए ShadowCallStack का इस्तेमाल करता है.

कर्नेल के लिए एससीएस चालू करना

कर्नेल के लिए ShadowCallStack को चालू करने के लिए, कर्नेल कॉन्फ़िगरेशन फ़ाइल में यह लाइन जोड़ें:

CONFIG_SHADOW_CALL_STACK=y

उपयोगकर्ता स्पेस में एससीएस (सिक्योरिटी क्लाउड स्टोरेज) चालू करना

यूज़रस्पेस कॉम्पोनेंट में ShadowCallStack चालू करने के लिए, कॉम्पोनेंट की ब्लूप्रिंट फ़ाइल में ये लाइनें जोड़ें:

sanitize: {
  scs: true
}

SCS यह मानता है कि x18 रजिस्टर, ShadowCallStack के पते को सेव करने के लिए रिज़र्व है और इसका इस्तेमाल किसी अन्य काम के लिए नहीं किया जाता. x18 रजिस्टर को रिज़र्व करने के लिए, सभी सिस्टम लाइब्रेरी को कॉम्पाइल किया जाता है. हालांकि, अगर यूज़रस्पेस कॉम्पोनेंट के लिए एससीएस चालू है, तो यह समस्या पैदा हो सकती है. ये कॉम्पोनेंट, प्रोसेस में चल रहे लेगसी कोड के साथ काम करते हैं. उदाहरण के लिए, ऐसी लाइब्रेरी जिन्हें तीसरे पक्ष के ऐप्लिकेशन लोड कर सकते हैं. इससे x18 रजिस्टर को नुकसान पहुंच सकता है. इसलिए, हमारा सुझाव है कि आप सिर्फ़ उन कॉम्पोनेंट में एससीएस चालू करें जो लेगसी बाइनरी में लोड नहीं किए जाएंगे.

पुष्टि करें

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