Manipulierte Gradle-Abhängigkeiten stellen ein Sicherheitsrisiko dar. Ein böswilliger Akteur könnte eine geänderte Abhängigkeit in den Build-Prozess einschleusen, z. B. durch einen Man-in-the-Middle-Angriff während der Abhängigkeitsauflösung.
Wenn eine Buildabhängigkeit (eine Bibliothek) manipuliert wurde, kann sich das auf die Ausführung Ihrer Anwendung auf einem Gerät auswirken. Wenn eine Plug-in-Abhängigkeit manipuliert wurde, kann sich das auf die Funktionsweise Ihres Builds auswirken oder sogar externe Befehle auf dem Build-Computer ausführen.
Sie können dieses Problem jedoch vermeiden, indem Sie die Abhängigkeitsprüfung in Ihrem Build aktivieren.
Bibliotheksprüfsummen und ‑signaturen
Bibliotheksautoren können zwei Metadaten angeben, mit denen sich die Authentizität der heruntergeladenen Abhängigkeiten überprüfen lässt. Sie definieren eine Datei mit dem Namen gradle/verification-metadata.xml
, um anzugeben, welche Werte Sie genehmigen. Sie kann Folgendes enthalten:
Prüfsummen: Ein Hash eines Artefakts, mit dem Sie prüfen können, ob das Artefakt während des Transports nicht beschädigt wurde. Wenn die Prüfsumme aus einer vertrauenswürdigen Quelle abgerufen wurde, bedeutet das, dass sich das Artefakt nicht geändert hat. Das reduziert Man-in-the-Middle-Angriffe.
Der Nachteil ist, dass sich die Prüfsummen, da sie aus den Artefakten berechnet werden, mit jeder Version ändern. Sie müssen
gradle/verification-metadata.xml
also jedes Mal aktualisieren, wenn Sie ein Upgrade durchführen.Signaturen: Damit können Nutzer von Abhängigkeiten einen öffentlichen Schlüssel für ein bestimmtes Artefakt angeben, um zu prüfen, ob dieses Artefakt vom Autor der Bibliothek erstellt und signiert wurde, der der authentifizierte Inhaber dieses öffentlichen Schlüssels ist. Das bedeutet mehr Arbeit für den Bibliotheksautor, aber solange sein privater Schlüssel nicht manipuliert wurde, gibt die Signatur an, dass die Bibliothek legitim ist.
Wenn der Bibliotheksautor jede Version eines Artefakts mit demselben Schlüssel signiert, müssen Sie
gradle/verification-metadata.xml
nicht aktualisieren, wenn Sie ein Upgrade durchführen.
Abhängigkeitsüberprüfung aktivieren
Bei der Gradle-Abhängigkeitsprüfung werden während des Builds Prüfsummen und Signaturen verglichen.
Erstellen Sie eine gradle/verification-metadata.xml
-Datei, die Folgendes enthält:
<?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>
Dieser Wert dient als Ausgangspunkt und wird demnächst aktualisiert.
Führen Sie ./gradlew assembleDebug
aus, um zu sehen, wie sich das auf den Build auswirkt. Sie sehen dann Meldungen wie
* 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 teilt Ihnen mit, dass Sie Versionen von Abhängigkeiten einbinden, die Sie nicht explizit genehmigt haben.
Prüfsummen- und Signaturdaten initialisieren
Sie können die ersten vertrauenswürdigen Schlüssel und Komponenten initialisieren. Dabei werden die aktuellen Signaturen und Prüfsummen für alle Bibliotheken erfasst, die in Ihrem Projekt verwendet werden.
Erstellen Sie die ersten Metadaten mit dem Befehl
./gradlew --write-verification-metadata pgp,sha256 --export-keys help
Mit diesem Befehl wird Gradle angewiesen, eine Liste von PGP-Schlüsseln und Fallback-Prüfsummen für alle Abhängigkeiten zu erstellen, die in diesem Projekt verwendet werden. Sie sehen eine Änderung an „verification-metadata.xml“ mit einer Reihe von Einträgen wie:
<trusted-key id="8461EFA0E74ABAE010DE66994EB27DB2A3B88B8B">
<trusting group="androidx.activity"/>
</trusted-key>
So wird Gradle mitgeteilt, dass bei einer Abhängigkeit von der Maven-Gruppe androidx.activity
überprüft werden muss, ob die zugehörigen .asc-Dateien (im Repository gespeicherte Signaturen) mit diesem Schlüssel übereinstimmen.
Beim Bootstrapping wird auch gradle/verification-keyring.keys
generiert, das die öffentlichen PGP-Schlüssel enthält, die in Ihrem Build verwendet werden. Prüfen Sie beide Dateien in Ihrem Versions-Tracking-System. Alle zukünftigen Änderungen, die entweder verification-metadata.xml
oder verification-keyring.keys
ändern, sollten sorgfältig geprüft werden.
Versionen aus vertrauenswürdigen Schlüsseln entfernen
Signaturschlüssel ändern sich zwischen den Releases einer Bibliothek selten. Die generierten Daten in der Datei gradle/verification-metadata.xml
enthalten Versionsdetails. Das bedeutet, dass Sie für jede neue Abhängigkeitsversion wichtige Informationen neu hinzufügen müssen.
Entfernen Sie die Versionsspezifikationen, um dies zu vermeiden und anzugeben, dass der Schlüssel für alle Versionen einer Bibliothek gilt.
Wählen Sie im Android Studio-Editor Bearbeiten > Suchen > Ersetzen… aus und ersetzen Sie mit einem regulären Ausdruck alle Versionsspezifikationen für vertrauenswürdige Schlüssel.
- von:
<trusted-key(.*) version=\".*\"/>
- an:
<trusted-key$1/>
Android Studio-Synchronisierung
Bisher funktioniert Ihr Befehlszeilen-Build, aber wenn Sie versuchen, in Android Studio zu synchronisieren, werden Fehler wie
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 möchte die Gradle-Quellen (zusammen mit anderen Quellen und Dokumenten) herunterladen. Am einfachsten lässt sich das Problem beheben, indem Sie allen Quell- und Javadocs vertrauen.
<trusted-artifacts>
in gradle/verification-metadata.xml
hinzufügen:
<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>
Ihr Build funktioniert jetzt über die Befehlszeile und Android Studio ordnungsgemäß.