Dependensi Gradle yang disusupi menimbulkan risiko keamanan. Pelaku berbahaya dapat memasukkan dependensi yang dimodifikasi ke dalam proses build, misalnya, melalui serangan man-in-the-middle selama resolusi dependensi.
Jika dependensi build (library) telah disusupi, hal ini dapat memengaruhi cara aplikasi Anda dieksekusi di perangkat. Jika dependensi plugin telah dibobol, hal ini dapat mengubah cara kerja build Anda, atau bahkan menjalankan perintah eksternal di mesin build.
Untuk mengurangi hal ini, Anda dapat mengaktifkan Verifikasi dependensi dalam build.
Checksum dan tanda tangan library
Penulis library dapat memberikan dua bagian metadata yang dapat membantu memverifikasi
autentisitas dependensi yang Anda download. Anda menentukan file bernama
gradle/verification-metadata.xml
untuk menentukan nilai yang Anda setujui. File ini dapat
berisi:
Checksum - hash artefak yang dapat Anda gunakan untuk memverifikasi bahwa artefak tidak rusak selama pengiriman. Jika checksum diambil dari sumber tepercaya, checksum akan memberi tahu Anda bahwa artefak belum berubah, sehingga mengurangi serangan man-in-the-middle.
Kelemahannya adalah, karena checksum dihitung dari artefak, checksum akan berubah dengan setiap rilis, sehingga Anda harus mengupdate
gradle/verification-metadata.xml
setiap kali mengupgradenya.Signatures - memungkinkan pengguna dependensi menentukan kunci publik untuk artefak tertentu guna memvalidasi bahwa artefak ini dibuat dan ditandatangani oleh penulis library yang merupakan pemilik terautentikasi kunci publik tersebut. Ini adalah pekerjaan yang lebih berat bagi penulis library, tetapi selama kunci pribadinya sendiri belum disusupi, tanda tangan akan memberi tahu Anda bahwa library tersebut sah.
Jika penulis library menandatangani setiap versi artefak dengan kunci yang sama, Anda tidak perlu memperbarui
gradle/verification-metadata.xml
saat mengupgradenya.
Mengaktifkan verifikasi dependensi
Verifikasi dependensi Gradle membandingkan checksum dan tanda tangan selama build Anda.
Buat file gradle/verification-metadata.xml
yang berisi hal berikut:
<?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>
Ini berfungsi sebagai titik awal dan akan segera diperbarui.
Jalankan ./gradlew assembleDebug
untuk melihat pengaruhnya terhadap build. Anda akan melihat
pesan seperti
* 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 memberi tahu Anda bahwa Anda mengambil versi dependensi yang belum Anda setujui secara eksplisit.
Melakukan bootstrap data checksum dan tanda tangan
Anda dapat mem-bootstrap kunci dan komponen tepercaya yang ditetapkan awal. Proses ini mengumpulkan tanda tangan dan checksum saat ini untuk semua library yang digunakan oleh project Anda.
Buat metadata awal dengan menjalankan
./gradlew --write-verification-metadata pgp,sha256 --export-keys help
Perintah ini memberi tahu Gradle untuk membuat daftar kunci PGP dan checksum penggantian untuk semua dependensi yang digunakan dalam project ini. Anda akan melihat perubahan pada verification-metadata.xml dengan sejumlah entri seperti:
<trusted-key id="8461EFA0E74ABAE010DE66994EB27DB2A3B88B8B">
<trusting group="androidx.activity"/>
</trusted-key>
Hal ini memberi tahu Gradle bahwa jika melihat dependensi dari grup maven
androidx.activity
, Gradle akan memastikan bahwa file .asc yang menyertainya
(tanda tangan yang disimpan di repositori) cocok dengan kunci tersebut.
Bootstrapping juga akan menghasilkan gradle/verification-keyring.keys
yang
berisi kunci PGP publik yang digunakan oleh build Anda. Check in kedua file ini
ke dalam sistem pelacakan versi Anda. Setiap perubahan mendatang yang mengubah
verification-metadata.xml
atau verification-keyring.keys
harus ditinjau
dengan cermat.
Menghapus versi dari kunci tepercaya
Kunci penandatanganan jarang berubah di antara rilis library. Data yang dihasilkan dalam
file gradle/verification-metadata.xml
berisi detail versi, yang berarti
Anda harus menambahkan kembali informasi kunci untuk setiap versi dependensi baru.
Untuk menghindari hal ini, dan menentukan bahwa kunci berlaku untuk semua versi library, hapus spesifikasi versi.
Di editor Android Studio, gunakan Edit > Find > Replace... menggunakan ekspresi reguler untuk mengganti semua spesifikasi versi untuk kunci tepercaya.
- dari:
<trusted-key(.*) version=\".*\"/>
- ke:
<trusted-key$1/>
Sinkronisasi Android Studio
Sejauh ini, build command line Anda berfungsi, tetapi jika Anda mencoba menyinkronkan di Android Studio, Anda akan melihat error seperti
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 ingin mendownload sumber Gradle (beserta sumber dan dokumen
lainnya). Cara termudah untuk memperbaikinya adalah dengan memercayai semua sumber dan javadoc.
Tambahkan <trusted-artifacts>
di 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>
Build Anda sekarang akan berfungsi dengan baik dari command line dan Android Studio.