تشكّل تبعيات 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 إنشاء قائمة بمفاتيح 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، استخدِم تعديل > بحث > استبدال... باستخدام تعبير عادي لاستبدال جميع مواصفات الإصدار للمفاتيح الموثوق بها.
- من:
<trusted-key(.*) version=\".*\"/>
- إلى:
<trusted-key$1/>
مزامنة "استوديو Android"
حتى الآن، يعمل الإصدار من سطر الأوامر، ولكن إذا حاولت المزامنة في 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" تنزيل مصادر Gradle (بالإضافة إلى المصادر
والمستندات الأخرى). إنّ أسهل طريقة لتصحيح هذا الخطأ هي الوثوق بجميع ملفات المصدر وjavadoc.
أضِف <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>
سيعمل الإصدار الآن بشكلٍ سليم من سطر الأوامر و"استوديو Android".