Verifikasi dependensi

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.