Güvenliği ihlal edilmiş Gradle bağımlılıkları güvenlik riski oluşturur. Kötü amaçlı bir kişi, örneğin bağımlılık çözümleme sırasında ortadaki adam saldırısı yoluyla derleme sürecine değiştirilmiş bir bağımlılık ekleyebilir.
Bir derleme bağımlılığının (kitaplık) güvenliği ihlal edilmişse bu durum, uygulamanızın bir cihazda çalışma şeklini etkileyebilir. Bir eklenti bağımlılığının güvenliği ihlal edilmişse derlemenizin çalışma şekli değişebilir veya derleme makinesinde harici komutlar çalıştırılabilir.
Bu sorunu azaltmak için derlemenizde Bağımlılık doğrulamasını etkinleştirebilirsiniz.
Kitaplık sağlama toplamları ve imzaları
Kitaplık yazarları, indirdiğiniz bağımlılıkların özgünlüğünü doğrulamaya yardımcı olabilecek iki meta veri sağlayabilir. Onaylamak istediğiniz değerleri belirtmek için gradle/verification-metadata.xml
adlı bir dosya tanımlarsınız. Şunları içerebilir:
Karma değerler: Bir yapının, aktarım sırasında bozulmadığını doğrulamak için kullanabileceğiniz karma değeridir. Karma kontrol değeri güvenilir bir kaynaktan alınmışsa yapının değişmediği anlaşılır ve bu da ortadaki adam saldırılarını azaltır.
Dezavantajı ise sağlama toplamları yapılardan hesaplandığı için her sürümde değişir. Bu da her yükseltme yaptığınızda
gradle/verification-metadata.xml
öğesini güncellemenizi gerektirir.İmzalar: Bağımlılık kullanıcılarının, belirli bir yapının ortak anahtarının kimliği doğrulanmış sahibi olan kütüphane yazarı tarafından derlenip imzalandığını doğrulamak için söz konusu yapı için bir ortak anahtar belirtmesine olanak tanır. Bu, kitaplık yazarı için daha fazla iş olsa da özel anahtarının güvenliği ihlal edilmediği sürece imza, kitaplığın meşru olduğunu gösterir.
Kitaplık yazarı, bir yapının her sürümünü aynı anahtarla imzalarsa yükseltme yaparken
gradle/verification-metadata.xml
öğesini güncellemeniz gerekmez.
Bağımlılık doğrulamasını etkinleştirme
Gradle bağımlılık doğrulaması, derleme işleminiz sırasında sağlama toplamlarını ve imzaları karşılaştırır.
Aşağıdakileri içeren bir gradle/verification-metadata.xml
dosyası oluşturun:
<?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>
Bu, başlangıç noktası olarak kullanılır ve kısa süre içinde güncellenir.
Bu değişikliğin derlemeyi nasıl etkilediğini görmek için ./gradlew assembleDebug
'ü çalıştırın. Aşağıdaki gibi mesajlar görürsünüz:
* 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, açıkça onaylamadığınız bağımlılık sürümlerini dahil ettiğinizi bildiriyor.
Özet kodu ve imza verilerini önyükleme
İlk güvenilir anahtar ve bileşen grubunu başlatabilirsiniz. Bu işlem, projeniz tarafından kullanılan tüm kitaplıkların mevcut imzalarını ve sağlama toplamlarını toplar.
Aşağıdaki komutu çalıştırarak ilk meta verileri oluşturun:
./gradlew --write-verification-metadata pgp,sha256 --export-keys help
Bu komut, Gradle'e bu projede kullanılan tüm bağımlılıklara ait PGP anahtarlarının ve yedek sağlama toplamalarının listesini oluşturmasını söyler. verification-metadata.xml dosyanızda aşağıdaki gibi çeşitli girişler içeren bir değişiklik görürsünüz:
<trusted-key id="8461EFA0E74ABAE010DE66994EB27DB2A3B88B8B">
<trusting group="androidx.activity"/>
</trusted-key>
Bu, Gradle'e androidx.activity
maven grubundan bir bağımlılık görürse birlikte gelen .asc dosyalarının (depoda depolanan imzalar) bu anahtarla eşleşeceği bilgisini verir.
İlk başlatma işlemi, derlemeniz tarafından kullanılan herkese açık PGP anahtarlarını içeren gradle/verification-keyring.keys
dosyasını da oluşturur. Bu dosyaların ikisini de sürüm izleme sisteminize kaydedin. Gelecekte verification-metadata.xml
veya verification-keyring.keys
'ta yapılacak değişiklikler dikkatlice incelenmelidir.
Güvenilir anahtarlardan sürümleri kaldırma
İmzalama anahtarları, bir kitaplığın sürümleri arasında nadiren değişir. gradle/verification-metadata.xml
dosyasında oluşturulan veriler sürüm ayrıntılarını içerir. Bu nedenle, her yeni bağımlılık sürümü için temel bilgileri yeniden eklemeniz gerekir.
Bunu önlemek ve anahtarın bir kitaplığın tüm sürümleri için geçerli olduğunu belirtmek üzere sürüm özelliklerini kaldırın.
Android Studio düzenleyicisinde, güvenilir anahtarların tüm sürüm özelliklerini normal ifade kullanarak değiştirmek için Düzenle > Bul > Değiştir...'i kullanın.
- Gönderen:
<trusted-key(.*) version=\".*\"/>
- to:
<trusted-key$1/>
Android Studio senkronizasyonu
Komut satırı derlemeniz şu ana kadar çalışıyor ancak Android Studio'da senkronize etmeye çalışırsanız aşağıdaki gibi hatalar görürsünüz:
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 kaynaklarını (diğer kaynaklar ve dokümanlarla birlikte) indirmek istiyor. Bu hatayı düzeltmenin en kolay yolu, tüm kaynak ve javadoc dosyalarına güvenmektir.
gradle/verification-metadata.xml
adlı ülkede <trusted-artifacts>
ekleyin:
<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>
Derlemeniz artık komut satırından ve Android Studio'dan düzgün şekilde çalışacaktır.