AutoRepro Gradle प्लग इन, Android Trade Federation टेस्ट हार्नेस के ऊपर बनाया गया है. इसका मकसद, Android Security Bulletin में बताई गई कमजोरियों के ख़िलाफ़ सुरक्षा पैच की जांच के लिए, सभी Android डिवाइसों की जांच करना है. ये टेस्ट खास तौर पर उन गड़बड़ियों को ठीक करने के लिए हैं जो सामान्य जोखिम की आशंका और एक्सपोज़र (सीवीई) से जुड़ी हैं या होंगी.
इस प्लग इन की मदद से, Android Studio या स्टैंडर्ड Android SDK का इस्तेमाल करके, Android सोर्स ट्री के बाहर Tradefed टेस्ट डेवलप किए जा सकते हैं. इसमें Tradefed टेस्ट बनाने और चलाने के लिए ज़रूरी सभी सुविधाएं शामिल हैं.
इसका इस्तेमाल मुख्य रूप से, Android Vulnerability Rewards Program के लिए, अपने-आप दोहराए जा सकने वाले कॉन्सेप्ट के सबूत सबमिट करने के लिए किया जाता है.
अपने-आप कॉन्टेंट रिप्रोड्यूस करने की सुविधा का उदाहरण डाउनलोड करें
ज़रूरी शर्तें
यहां 64-बिट Linux पीसी के लिए निर्देश दिए गए हैं.
- Android Studio Ladybug या इसके बाद का वर्शन - इसे डिस्ट्रिब्यूशन के पैकेज मैनेजर से भी इंस्टॉल किया जा सकता है.
- Android SDK प्लैटफ़ॉर्म टूल (
adb
,fastboot
) - इन्हें इंस्टॉल करना ज़रूरी है और ये आपके$PATH
में होने चाहिए. इसका मतलब है कि आपके पास कमांड लाइन सेadb
को चलाने की सुविधा होनी चाहिए. डिस्ट्रो के पैकेज मैनेजर का इस्तेमाल करके, प्लैटफ़ॉर्म टूल को आसानी से इंस्टॉल किया जा सकता है.- अगर स्टैंडअलोन प्लैटफ़ॉर्म टूल के बजाय, Android Studio के SDK मैनेजर का इस्तेमाल किया जा रहा है, तो कमांड-लाइन डेवलपमेंट के लिए, SDK की
platform-tools
डायरेक्ट्री को अपने$PATH
में जोड़ना न भूलें.
- अगर स्टैंडअलोन प्लैटफ़ॉर्म टूल के बजाय, Android Studio के SDK मैनेजर का इस्तेमाल किया जा रहा है, तो कमांड-लाइन डेवलपमेंट के लिए, SDK की
- AAPT2. - इसे डिस्ट्रो के पैकेज मैनेजर का इस्तेमाल करके भी इंस्टॉल किया जा सकता है.
- Java JDK 21 या इसके बाद का वर्शन - यह Android SDK और Gradle के साथ काम करता है.
Android Studio का इस्तेमाल शुरू करना
उदाहरण या टेंप्लेट को निकालने के बाद, Android Studio में डायरेक्ट्री को मौजूदा प्रोजेक्ट के तौर पर खोलें और Gradle सिंक होने का इंतज़ार करें. Android Studio को पहले से कॉन्फ़िगर करके चलाने के कई तरीके हैं.
Gradle टास्क:
assembleSubmissionSources
- सबमिशन के लिए, सोर्स फ़ाइलों को इकट्ठा करके zip फ़ाइल बनाएं.assembleSubmissionZip
- अपलोड करने के लिए, सबमिशन की ZIP फ़ाइल बनाएं.copyInvocationResultsToSubmission
- समीक्षा की प्रोसेस में मदद पाने के लिए, Tradefed के पिछले invocaton के नतीजों को AutoRepro सबमिशन सोर्स डायरेक्ट्री में कॉपी करें. ध्यान दें कि इसमें होस्ट और डिवाइस, दोनों के लॉग शामिल होते हैं. इसे चलाने से पहले या बाद में, कॉन्टेंट की समीक्षा करें.
AutoRepro को Android Studio में चलाने के लिए कॉन्फ़िगरेशन:
autorepro_nonroot_arm64
autorepro_nonroot_x86_64
autorepro_root_arm64
autorepro_root_x86_64
लॉन्चर कॉन्फ़िगरेशन, autorepro_{device_root}_{device_arch}
फ़ॉर्मैट में होते हैं. आम तौर पर, बिना रूट वाले डिवाइस का इस्तेमाल करना बेहतर होता है, क्योंकि रूट की ज़रूरत वाली कमजोरियों का असर कम होता है. हालांकि, सेटअप या क्लीनअप करने के लिए रूट का इस्तेमाल तब तक किया जा सकता है, जब तक कि इसका साफ़ तौर पर दस्तावेज़ीकरण किया गया हो और आम तौर पर इसे ग़ैर-रूट स्टेटस के तौर पर स्वीकार किया गया हो. उदाहरण के लिए, डिवाइस पर फ़र्ज़ी मैसेज भेजने के लिए, रूट का इस्तेमाल करना स्वीकार किया जाता है. इससे, दूसरे डिवाइस और एक से ज़्यादा सिम कार्ड की ज़रूरत नहीं पड़ती.
ये आपके टेस्ट के लिए Tradefed लॉन्च करेंगे. Tradefed, किसी मान्य डिवाइस के कनेक्ट होने का इंतज़ार करता है. इसलिए, पक्का करें कि कोई डिवाइस कनेक्ट हो और ADB डीबगिंग की अनुमति दी गई हो.
ऑटो-रिप्रोडक्शन टेस्ट लिखना
AutoRepro टेस्ट के तीन हिस्से होते हैं और उससे जुड़े तीन Gradle प्लग इन होते हैं:
- Gradle प्लग इन
id("com.android.security.autorepro.javahosttest")
यह एक ऐसा होस्ट-साइड Tradefed टेस्ट है जो ADB की मदद से डिवाइस से इंटरैक्ट करता है. उदाहरण में, इसका इस्तेमालsubmission/hostTest/
डायरेक्ट्री में किया गया है. - Gradle प्लग इन
id("com.android.security.autorepro.apptest")
ऐसा ऐप्लिकेशन या सेवा APK जोadb install
के ज़रिए डिवाइस पर इंस्टॉल किया जाता है और होस्ट-साइड टेस्ट से लॉन्च किया जाता है. ऐप्लिकेशन या सेवा में, JUnit के ऐसे एश्योरेशन का सेट भी हो सकता है जिनकी रिपोर्ट होस्ट-साइड रनर को दी जाती है. उदाहरण में, इसका इस्तेमालsubmission/appTest/
और डायरेक्ट्री में किया गया है. - Gradle प्लग इन
id("com.android.security.autorepro.ndktest")
यह एक वैकल्पिक है NDK पर आधारित प्रोफ़ ऑफ़ कॉन्सेप्ट अटैक, जिसे डिवाइस परadb push
के ज़रिए पुश किया जाता है और होस्ट-साइड टेस्ट के ज़रिए चलाया जाता है. उदाहरण में, इसका इस्तेमालsubmission/ndkTest/
डायरेक्ट्री में किया गया है.
आम तौर पर, AutoRepro टेस्ट फ़्लो इनमें से किसी एक पैटर्न का पालन करता है:
इंस्ट्रुमेंट किए गए टेस्ट ऐप्लिकेशन:
- होस्ट-साइड टेस्ट, डिवाइस पर ऐसे APK को पुश करता है जिसमें इंस्ट्रूमेंट किया गया ऐप्लिकेशन या सेवा शामिल होती है.
- होस्ट-साइड टेस्ट, डिवाइस-साइड JUnit टेस्ट शुरू करता है. ये टेस्ट,
runDeviceTest()
के ज़रिए APK के साथ बंडल किए जाते हैं. - डिवाइस-साइड JUnit टेस्ट, बटन पर टैप करता है और UIAutomator का इस्तेमाल करके ऐप्लिकेशन को देखता है. इसके अलावा, यह Android API को ऐसे तरीके से ऐक्सेस करता है जिससे सुरक्षा से जुड़ी कमजोरियों का पता चलता है.
- डिवाइस-साइड JUnit टेस्ट के पास या फ़ेल होने की जानकारी, होस्ट-साइड टेस्ट को दी जाती है. इस जानकारी का इस्तेमाल यह तय करने के लिए किया जा सकता है कि टेस्ट पास हुआ है या नहीं. गड़बड़ी के मैसेज में इस बारे में पूरी जानकारी होनी चाहिए कि एग्ज़रेशन पूरा क्यों नहीं हुआ. साथ ही, इसमें कमज़ोरी के सबूत के तौर पर कोई खास ऑब्जेक्ट, वैल्यू, अपवाद, स्टैकट्रैस या अन्य आर्टफ़ैक्ट भी शामिल होने चाहिए.
NDK के कॉन्सेप्ट का सबूत:
- होस्ट-साइड टेस्ट, डिवाइस पर Linux एक्सीक्यूटेबल को पुश और लॉन्च करता है.
- नेटिव प्रोग्राम क्रैश हो जाता है या कोई खास एक्सिट कोड दिखाता है.
- होस्ट-साइड टेस्ट, क्रैश की जांच करता है, logcat बैकट्रेस देखता है या यह पता लगाने के लिए कि हमला हुआ है या नहीं, खास तरह के बाहर निकलने वाले कोड की तलाश करता है. गड़बड़ी के मैसेज में इस बारे में पूरी जानकारी होनी चाहिए कि एश्योरेशन पूरा क्यों नहीं हुआ. साथ ही, इसमें कमज़ोरी के सबूत के तौर पर, किसी खास स्ट्रक्चर, वैल्यू, स्टैकट्रेस या अन्य आर्टफ़ैक्ट की जानकारी भी होनी चाहिए.
दोनों पैटर्न को एक साथ भी इस्तेमाल किया जा सकता है. उदाहरण के लिए, डिवाइस-साइड टेस्ट के साथ नेटिव प्रोग्राम चलाना. frida-inject
जैसे कुछ अन्य इंस्ट्रूमेंटेशन फ़्रेमवर्क भी उपलब्ध हैं. ज़्यादा जानकारी के लिए, Security Test Suite के रेफ़रंस दस्तावेज़ और Tradefed के रेफ़रंस दस्तावेज़ देखें.
मेरे कॉन्सेप्ट को साबित करने वाले अटैक के लिए, टेस्ट ऐप्लिकेशन या नेटिव एक्सीक्यूटेबल की ज़रूरत नहीं है
ज़्यादातर टेस्ट के लिए, डिवाइस-साइड ऐप्लिकेशन और नेटिव एक्सीक्यूटेबल, दोनों की ज़रूरत नहीं होगी.
अगर आपके टेस्ट में किसी सुविधा का इस्तेमाल नहीं किया जा रहा है, तो ज़रूरत न पड़ने वाली gradle सब-प्रोजेक्ट डायरेक्ट्री मिटाएं.
मेरे कॉन्सेप्ट की पुष्टि करने वाले हमले में, दूसरे ऐप्लिकेशन/सेवा का इस्तेमाल किया गया है
AutoRepro प्लग इन की मदद से, जितने चाहें उतने Gradle सब-प्रोजेक्ट जोड़ें.
AutoRepro टेस्ट सबमिट करना
सबमिशन के हिस्से के तौर पर, अपने डिवाइस से टेस्ट के नतीजे शामिल करने के लिए:
- इसके अलावा, किसी भी पुराने टेस्ट रन को मिटाने के लिए, Gradle
clean
टास्क चलाएं. - अपने टेस्ट के लिए Tradefed को शुरू करने और लॉग और नतीजे इकट्ठा करने के लिए, AutoRepro के सही रन कॉन्फ़िगरेशन को चलाएं.
- लॉग और नतीजों को सबमिशन सोर्स डायरेक्ट्री में कॉपी करने के लिए,
copyInvocationResultsToSubmission
टास्क चलाएं.
submission/build/autorepro-submission.zip
फ़ाइल बनाने के लिए, assembleSubmissionZip
को चलाएं. उस फ़ाइल को, Android Vulnerability Reward Program में सबमिट की गई फ़ाइल के साथ अपलोड करें. पक्का करें कि अटैचमेंट, पैटर्न *autorepro-submission*.zip
से मेल खाता हो और उसे शुरुआती रिपोर्ट के साथ अपलोड किया गया हो. सबमिशन देर से अपलोड करने पर, आपकी रिपोर्ट की समीक्षा करने में हमें परेशानी होगी.