डिपेंडेंसी की पुष्टि करना

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

अगर किसी बिल्ड डिपेंडेंसी (लाइब्रेरी) को हैक कर लिया गया है, तो इससे डिवाइस पर आपके ऐप्लिकेशन के काम करने के तरीके पर असर पड़ सकता है. अगर किसी प्लग इन की डिपेंडेंसी को हैक कर लिया गया है, तो इससे आपके बिल्ड के काम करने के तरीके में बदलाव हो सकता है. इसके अलावा, बिल्ड मशीन पर बाहरी निर्देश भी चलाए जा सकते हैं.

इस समस्या को कम करने के लिए, अपने बिल्ड में डिपेंडेंसी की पुष्टि की सुविधा चालू करें.

लाइब्रेरी के चेकसम और हस्ताक्षर

लाइब्रेरी के लेखक, दो तरह का मेटाडेटा उपलब्ध करा सकते हैं. इससे, डाउनलोड की जा रही डिपेंडेंसी की पुष्टि करने में मदद मिलती है. आपको जिन वैल्यू को अनुमति देनी है उन्हें बताने के लिए, gradle/verification-metadata.xml नाम की एक फ़ाइल तय की जाती है. इसमें ये चीज़ें शामिल हो सकती हैं:

  • चेकसम - आर्टफ़ैक्ट का हैश, जिसका इस्तेमाल करके यह पुष्टि की जा सकती है कि आर्टफ़ैक्ट को ट्रांसफ़र करने के दौरान उसमें कोई बदलाव नहीं हुआ है. अगर चेकसम को किसी भरोसेमंद सोर्स से लिया गया है, तो इससे आपको पता चलता है कि आर्टफ़ैक्ट में कोई बदलाव नहीं हुआ है. इससे, बीच में किसी दूसरे व्यक्ति के हमले की संभावना कम हो जाती है.

    हालांकि, इसका एक नुकसान यह है कि चेकसम का हिसाब आर्टफ़ैक्ट से लगाया जाता है. इसलिए, ये हर रिलीज़ के साथ बदलते रहते हैं. इसलिए, जब भी उन्हें अपग्रेड किया जाता है, तो आपको gradle/verification-metadata.xml को अपडेट करना पड़ता है.

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

    अगर लाइब्रेरी के लेखक ने आर्टफ़ैक्ट के हर वर्शन पर एक ही पासकोड से हस्ताक्षर किया है, तो उसे अपग्रेड करने पर आपको gradle/verification-metadata.xml को अपडेट करने की ज़रूरत नहीं है.

डिपेंडेंसी की पुष्टि करने की सुविधा चालू करना

Gradle की डिपेंडेंसी की पुष्टि, आपके बिल्ड के दौरान चेकसम और हस्ताक्षरों की तुलना करती है.

gradle/verification-metadata.xml फ़ाइल बनाएं, जिसमें ये चीज़ें शामिल हों:

<?xml version="1.0" encoding="UTF-8"?>
<verification-metadata
    xmlns="https://schema.gradle.org/dependency-verification"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="https://schema.gradle.org/dependency-verification https://schema.gradle.org/dependency-verification/dependency-verification-1.3.xsd">
    <configuration>
        <!-- verify .pom and .module files -->
        <verify-metadata>true</verify-metadata>
        <!-- verify .asc PGP files that come with the artifacts -->
        <verify-signatures>true</verify-signatures>
        <!-- use human readable keyring format -->
        <keyring-format>armored</keyring-format>
        <!-- read keys in a local file, fewer requests to network -->
        <key-servers enabled="false">
            <key-server uri="https://keyserver.ubuntu.com"/>
            <key-server uri="https://keys.openpgp.org"/>
        </key-servers>
    </configuration>
    <components>
    </components>
</verification-metadata>

यह शुरुआती जानकारी है और इसे जल्द ही अपडेट कर दिया जाएगा.

./gradlew assembleDebug को चलाकर देखें कि इससे बिल्ड में क्या बदलाव होता है. आपको इस तरह के मैसेज दिखेंगे

* What went wrong:
Error resolving plugin [id: 'com.android.application', version: '8.7.3', apply: false]
> Dependency verification failed for configuration 'detachedConfiguration1'
  One artifact failed verification: com.android.application.gradle.plugin-8.7.3.pom ...
  This can indicate that a dependency has been compromised ...
  
  Open this report for more details: .../dependency-verification-report.html

Gradle आपको बता रहा है कि आपने डिपेंडेंसी के ऐसे वर्शन इंपोर्ट किए हैं जिनकी आपने साफ़ तौर पर अनुमति नहीं दी है.

चेकसम और हस्ताक्षर का डेटा बूटस्ट्रैप करना

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

शुरुआती मेटाडेटा जनरेट करने के लिए,

./gradlew --write-verification-metadata pgp,sha256 --export-keys help

यह निर्देश, Gradle को इस प्रोजेक्ट में इस्तेमाल की जाने वाली सभी डिपेंडेंसी के लिए, पीजीपी पासकोड और फ़ॉलबैक चेकसम की सूची बनाने के लिए कहता है. आपको अपने verification-metadata.xml में बदलाव दिखेगा. इसमें कई एंट्री होंगी, जैसे:

<trusted-key id="8461EFA0E74ABAE010DE66994EB27DB2A3B88B8B">
    <trusting group="androidx.activity"/>
</trusted-key>

इससे Gradle को पता चलता है कि अगर उसे maven ग्रुप androidx.activity से कोई डिपेंडेंसी दिखती है, तो वह पक्का करेगा कि उससे जुड़ी .asc फ़ाइलें (डेटा स्टोर करने की जगह में सेव किए गए हस्ताक्षर) उस कुंजी से मेल खाती हों.

बूटस्ट्रैप करने से gradle/verification-keyring.keys भी जनरेट होगा. इसमें, आपके बिल्ड में इस्तेमाल की गई सार्वजनिक पीजीपी पासकोड शामिल होंगे. इन दोनों फ़ाइलों को अपने वर्शन ट्रैकिंग सिस्टम में डालें. आने वाले समय में, verification-metadata.xml या verification-keyring.keys में किए जाने वाले किसी भी बदलाव की ध्यान से समीक्षा की जानी चाहिए.

भरोसेमंद कुंजियों से वर्शन हटाना

लाइब्रेरी के रिलीज़ के बीच, हस्ताक्षर करने की कुंजियां शायद ही कभी बदलती हैं. gradle/verification-metadata.xml फ़ाइल में जनरेट किए गए डेटा में, वर्शन की जानकारी शामिल होती है. इसका मतलब है कि आपको हर नए डिपेंडेंसी वर्शन के लिए, मुख्य जानकारी फिर से जोड़नी होगी.

इससे बचने और यह बताने के लिए कि पासकोड किसी लाइब्रेरी के सभी वर्शन पर लागू होता है, वर्शन की जानकारी हटाएं.

Android Studio एडिटर में, बदलाव करें > ढूंढें > बदलें... का इस्तेमाल करें. इसके बाद, भरोसेमंद कुंजियों के लिए, वर्शन की सभी खास बातों को बदलने के लिए रेगुलर एक्सप्रेशन का इस्तेमाल करें.

  • भेजने वाला: <trusted-key(.*) version=\".*\"/>
  • पाने वाला: <trusted-key$1/>

Android Studio सिंक करना

फ़िलहाल, आपका कमांड-लाइन बिल्ड काम करता है. हालांकि, Android Studio में सिंक करने की कोशिश करने पर, आपको इस तरह की गड़बड़ियां दिखेंगी

A build operation failed.
    Dependency verification failed for configuration ':app:detachedConfiguration3'
One artifact failed verification: gradle-8.10.2-src.zip (gradle:gradle:8.10.2) from repository Gradle distributions
If the artifacts are trustworthy, you will need to update the gradle/verification-metadata.xml file. For more on how to do this, please refer to https://docs.gradle.org/8.10.2/userguide/dependency_verification.html#sec:troubleshooting-verification in the Gradle documentation.

Android Studio को अन्य सोर्स और दस्तावेज़ों के साथ-साथ, Gradle सोर्स डाउनलोड करने हैं. इस गड़बड़ी को ठीक करने का सबसे आसान तरीका यह है कि सभी सोर्स और Javadoc पर भरोसा किया जाए. gradle/verification-metadata.xml में <trusted-artifacts> जोड़ें:

<verification-metadata ...>
   <configuration>
      <trusted-artifacts>
         <trust file=".*-javadoc[.]jar" regex="true"/>
         <trust file=".*-sources[.]jar" regex="true"/>
         <trust group="gradle" name="gradle"/>
      </trusted-artifacts>
      ...
  </configuration>
</verification-metadata>

अब आपका बिल्ड, कमांड लाइन और Android Studio से सही तरीके से काम करेगा.