تأیید وابستگی، تأیید وابستگی

وابستگی های به خطر افتاده Gradle یک خطر امنیتی ایجاد می کند. یک بازیگر مخرب به طور بالقوه می تواند یک وابستگی اصلاح شده را به فرآیند ساخت تزریق کند، به عنوان مثال، از طریق یک حمله man-in-the-middle در طول حل وابستگی.

اگر یک وابستگی ساخت (یک کتابخانه) به خطر بیفتد، می تواند بر نحوه اجرای برنامه شما در دستگاه تأثیر بگذارد. اگر یک وابستگی افزونه به خطر بیفتد، می تواند نحوه کار ساخت شما را تغییر دهد یا حتی دستورات خارجی را روی ماشین ساخت اجرا کند.

برای کاهش این مشکل، می توانید تأیید وابستگی را در ساخت خود فعال کنید.

چک جمع ها و امضاهای کتابخانه

نویسندگان کتابخانه می‌توانند دو تکه ابرداده ارائه دهند که می‌تواند به تأیید صحت وابستگی‌هایی که دانلود می‌کنید کمک کند. شما یک فایل با نام gradle/verification-metadata.xml تعریف می کنید تا مشخص کنید کدام مقادیر را تایید می کنید. می تواند شامل موارد زیر باشد:

  • Checksums - یک هش از یک مصنوع که می توانید برای تأیید اینکه مصنوع در طول حمل و نقل خراب نشده است استفاده کنید. اگر چک‌سام از یک منبع قابل اعتماد بازیابی شده باشد، به شما می‌گوید که مصنوع تغییر نکرده است و حملات انسان در وسط را کاهش می‌دهد.

    نکته منفی این است که، چون چک‌سام‌ها از روی مصنوعات محاسبه می‌شوند، با هر نسخه تغییر می‌کنند و از شما می‌خواهد هر زمان که آنها را ارتقا می‌دهید، 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 می‌گوید که فهرستی از کلیدهای PGP و جمع‌های بازرسی برای تمام وابستگی‌هایی که در این پروژه استفاده می‌شوند، بسازد. تغییری در verification-metadata.xml خود با تعدادی ورودی مانند:

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

این به Gradle می‌گوید که اگر وابستگی از گروه maven androidx.activity ببیند، مطمئن می‌شود که فایل‌های .asc همراه (امضاهای ذخیره شده در مخزن) با آن کلید مطابقت دارند.

بوت استرپینگ همچنین gradle/verification-keyring.keys را ایجاد می کند که حاوی کلیدهای عمومی PGP است که توسط ساخت شما استفاده می شود. هر دوی این فایل ها را در سیستم ردیابی نسخه خود بررسی کنید. هر تغییری که در آینده ایجاد می‌کند verification-metadata.xml باید به دقت بررسی verification-keyring.keys .

نسخه ها را از کلیدهای قابل اعتماد حذف کنید

کلیدهای امضا به ندرت بین نسخه های یک کتابخانه تغییر می کنند. داده های تولید شده در فایل gradle/verification-metadata.xml حاوی جزئیات نسخه است، به این معنی که شما باید اطلاعات کلیدی را برای هر نسخه وابستگی جدید دوباره اضافه کنید.

برای جلوگیری از این امر و تعیین اینکه کلید برای همه نسخه های یک کتابخانه اعمال می شود، مشخصات نسخه را حذف کنید.

در ویرایشگر Android Studio، از Edit > Find > Replace... با استفاده از عبارت منظم برای جایگزینی تمامی مشخصات نسخه برای کلیدهای مورد اعتماد استفاده کنید.

  • از: <trusted-key(.*) version=\".*\"/>
  • به: <trusted-key$1/>

همگام سازی اندروید استودیو

تاکنون، ساخت خط فرمان شما کار می کند، اما اگر سعی کنید در 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 را (همراه با سایر منابع و اسناد) دانلود کند. ساده ترین راه برای تصحیح این، اعتماد به همه منابع و جاوادوک است. <trusted-artifacts> در gradle/verification-metadata.xml اضافه کنید:

<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>

اکنون بیلد شما از طریق خط فرمان و اندروید استودیو به درستی کار خواهد کرد.

،

وابستگی های به خطر افتاده Gradle یک خطر امنیتی ایجاد می کند. یک بازیگر مخرب به طور بالقوه می تواند یک وابستگی اصلاح شده را به فرآیند ساخت تزریق کند، به عنوان مثال، از طریق یک حمله man-in-the-middle در طول حل وابستگی.

اگر یک وابستگی ساخت (یک کتابخانه) به خطر بیفتد، می تواند بر نحوه اجرای برنامه شما در دستگاه تأثیر بگذارد. اگر یک وابستگی افزونه به خطر بیفتد، می تواند نحوه کار ساخت شما را تغییر دهد یا حتی دستورات خارجی را روی ماشین ساخت اجرا کند.

برای کاهش این مشکل، می توانید تأیید وابستگی را در ساخت خود فعال کنید.

چک جمع ها و امضاهای کتابخانه

نویسندگان کتابخانه می‌توانند دو تکه ابرداده ارائه دهند که می‌تواند به تأیید صحت وابستگی‌هایی که دانلود می‌کنید کمک کند. شما یک فایل با نام gradle/verification-metadata.xml تعریف می کنید تا مشخص کنید کدام مقادیر را تایید می کنید. می تواند شامل موارد زیر باشد:

  • Checksums - یک هش از یک مصنوع که می توانید برای تأیید اینکه مصنوع در طول حمل و نقل خراب نشده است استفاده کنید. اگر چک‌سام از یک منبع قابل اعتماد بازیابی شده باشد، به شما می‌گوید که مصنوع تغییر نکرده است و حملات انسان در وسط را کاهش می‌دهد.

    نکته منفی این است که، چون چک‌سام‌ها از روی مصنوعات محاسبه می‌شوند، با هر نسخه تغییر می‌کنند و از شما می‌خواهد هر زمان که آنها را ارتقا می‌دهید، 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 می‌گوید که فهرستی از کلیدهای PGP و جمع‌های بازرسی برای تمام وابستگی‌هایی که در این پروژه استفاده می‌شوند، بسازد. تغییری در verification-metadata.xml خود با تعدادی ورودی مانند:

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

این به Gradle می‌گوید که اگر وابستگی از گروه maven androidx.activity ببیند، مطمئن می‌شود که فایل‌های .asc همراه (امضاهای ذخیره شده در مخزن) با آن کلید مطابقت دارند.

بوت استرپینگ همچنین gradle/verification-keyring.keys را ایجاد می کند که حاوی کلیدهای عمومی PGP است که توسط ساخت شما استفاده می شود. هر دوی این فایل ها را در سیستم ردیابی نسخه خود بررسی کنید. هر تغییری که در آینده ایجاد می‌کند verification-metadata.xml باید به دقت بررسی verification-keyring.keys .

نسخه ها را از کلیدهای قابل اعتماد حذف کنید

کلیدهای امضا به ندرت بین نسخه های یک کتابخانه تغییر می کنند. داده های تولید شده در فایل gradle/verification-metadata.xml حاوی جزئیات نسخه است، به این معنی که شما باید اطلاعات کلیدی را برای هر نسخه وابستگی جدید دوباره اضافه کنید.

برای جلوگیری از این امر و تعیین اینکه کلید برای همه نسخه های یک کتابخانه اعمال می شود، مشخصات نسخه را حذف کنید.

در ویرایشگر Android Studio، از Edit > Find > Replace... با استفاده از عبارت منظم برای جایگزینی تمامی مشخصات نسخه برای کلیدهای مورد اعتماد استفاده کنید.

  • از: <trusted-key(.*) version=\".*\"/>
  • به: <trusted-key$1/>

همگام سازی اندروید استودیو

تاکنون، ساخت خط فرمان شما کار می کند، اما اگر سعی کنید در 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 را (همراه با سایر منابع و اسناد) دانلود کند. ساده ترین راه برای تصحیح این، اعتماد به همه منابع و جاوادوک است. <trusted-artifacts> در gradle/verification-metadata.xml اضافه کنید:

<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>

اکنون بیلد شما از طریق خط فرمان و اندروید استودیو به درستی کار خواهد کرد.