Bu sayfada, Android cihazınıza yüklenen APK'nın hak talebinde bulunan modelde yapılan hak talebine uygun olmasını sağlamaya yönelik çeşitli yöntemler açıklanmaktadır. Bu işlem, söz konusu APK'yı cihazınızdan alma, kod bütünlüğünü kontrol etme ve ayıklanan yapı üzerinde günlük dahil etme kanıtı gerçekleştirmeyi içerir.
Doğrulama süreci
Şeffaflık günlüğü, karma oluşturma işlemlerinden oluşan bir Merkle ağacıyla uygulanır. Yaprak düğümler veri içerir, üst düğümler ise alt düğümlerinin karma değerini içerir.
Şeffaflık günlüklerinin bozulmaya karşı dayanıklı özelliğini doğrulamak için Merkle ağacında temel olarak iki hesaplama yapılır: dahil etme kanıtı ve tutarlılık kanıtı. İlki, günlükte belirli bir APK sürümüne karşılık gelen bir giriş olduğunu kanıtlar. Günlük girişi, ilgili APK'lardan elde edilebilen JSON Web Jetonu (JWT) biçiminde kod imza jetonunun SHA256 özeti olan bir karma içerir. İkincisi, ağaca yeni girişler eklendiğinde yeni kontrol noktasının (kriptografik olarak) ağacın önceki sürümüyle tutarlı olduğunu kanıtlar.
Kapsanan bir APK'yı doğrulamak için tanık olunan bir kontrol noktasına dayalı bir dahil etme kanıtı testi yapın. Bu günlüğü standartlaştırılmış bir şahit protokolü kullanarak herkese açık bir tanık ağı ile entegre etmeyi planladığımızı unutmayın. Bu işlem, günlük tutarlılığını garanti eden bir tanık kontrol noktası sağlar.
Cihazınızdaki APK'nın, hak talebinde bulunan modelde yapılan iddiaya uygun olduğundan emin olmak istiyorsanız aşağıdaki makaleyi inceleyin.
Dahil Etme Kanıtı
Android kullanıcıları, cihazlarındaki kapsanan bir APK'nın günlükte olup olmadığını kontrol etmek için önce APK'yı ve ilgili meta verilerini ayıklayıp yeniden hesaplanan kök karmasını yayınlanan kontrol noktasındaki kök karmasıyla karşılaştırabilir. Eşleşirse Android kullanıcısı, Tehdit Modeli'nde açıklanan bazı korumalardan yararlanabilir.
APK'nın Günlüğe Eklendiğini Doğrulama
Daha önce de belirtildiği gibi, şu anda kapsama dahil olan APK'ların listesini Genel bakış sayfasında bulabilirsiniz.
Doğrulama Ön Koşulları
Cihazınızdan yeni çıkardığınız APK'nın hak talebimizle uyumlu olduğunu doğrulamaya başlamadan önce, aşağıdaki araçları ağ bağlantılı bir bilgisayardan yüklemeniz gerekir.
Android Debug Bridge (ADB)
ADB
, Android SDK Platform Tools web sitesinde bulunan ve Android cihazla iletişim kuran bir araçtır.
bundletool
bundletool
, Android App Bundle (AAB) oluşturmak için kullanılan bir araçtır. Ayrıca, AAB'leri cihazlara yüklenebilecek APK'lara dönüştürmek için de kullanılabilir.
GitHub'dan indirilebilir.
Androguard
Androguard, APK'ları analiz etmek için kullanılan bir araç koleksiyonudur. Androguard web sitesinden indirilip yüklenebilir.
Dahiliyet Kanıtı doğrulayıcısı
Bu, Android Açık Kaynak Projesi (AOSP) kapsamındaki avb
adlı bir git deposunda yayınladığımız bir Go modülüdür.
Google System Services APK şeffaflık günlüğünü sorgulayabilir ve bir paketin günlükte bulunup bulunmadığını gösterir.
Bunun nasıl kullanıldığına dair bir örneği daha sonraki bir bölümün içinde bulabilirsiniz.
Bu aracı indirmek için önce avb
deposunu klonlamanız gerekir.
computer:~$ git clone https://android.googlesource.com/platform/external/avb
Doğrulayıcının kaynak kodu, avb
deposundaki tools/transparency/verify
bölümünde bulunabilir.
Doğrulama için bir yığın oluşturma
Cihazınızdan çıkardığınız APK'nın iddialarımıza uygun olduğunu doğrulamak için APK'dan elde edilen bilgilerden bir günlük yükü oluşturmanız gerekir.
Başlamadan önce, cihazınızda adb hata ayıklama özelliğini etkinleştirerek adb
'ün cihazınızda kullanılabildiğinden emin olun.
Ardından, APK'nın cihazınızda yüklü olduğu yeri bulun. Bu kılavuzda, çalışma örneği olarak Android System Key Verifier APK'sini (com.google.android.contactkeys) kullanacağız.
computer:~$ adb shell pm list packages -f | grep contactkeys
package:/data/app/~~i5WYSO4PuAAv798-eHdM7A==/com.google.android.contactkeys-PQCKjnn7xDqjeVhcUDibBA==/base.apk=com.google.android.contactkeys
Android System Key Verifier APK'sı cihazınıza yüklüyse yukarıdaki komut, cihazınızda yüklü olduğu yolu döndürür. Aksi takdirde herhangi bir çıkış görmezsiniz.
Ardından, APK'yı Android cihazınızdan şu komutu kullanarak çalıştığınız bilgisayara indirin (cihazınızdaki gerçek konumun ve APK dosya adının değişiklik gösterebileceğini unutmayın):
computer:~$ mkdir -p /tmp/testdir && cd /tmp/testdir
computer:/tmp/testdir$ adb pull /data/app/~~i5WYSO4PuAAv798-eHdM7A==/com.google.android.contactkeys-PQCKjnn7xDqjeVhcUDibBA==/base.apk ./contactkeys_candidate.apk
İndirdiğiniz APK'nın paket adını almak ve doğrulamak için APK'yı açmanız gerekir. APK, özel bir ZIP dosyası olduğundan bu işlem için önce APK'yı açmanız gerekir.
computer:/tmp/testdir$ mkdir extracted && unzip contactkeys_candidate.apk -d extracted/
Bu adımda, APK'yı oluşturan tüm dosyalar ayıklanır. Paket adı ve sürümü, APK'nın manifest dosyasında bulunabilir. Bu dosya genellikle AndroidManifest.xml
adlı bir dosyadadır.
Ancak elde edilen manifest dosyası, insan tarafından okunamayan ikili bir biçimdedir. İkili XML'i okunabilir bir forma dönüştürmek için androguard
paketindeki axml
aracını kullanırız (ön koşul bölümünde belirtildiği şekilde yüklenmesi gerekir).
computer:/tmp/testdir$ androguard axml extracted/AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1413" android:versionName="1.48.688082145" android:compileSdkVersion="35" android:compileSdkVersionCodename="VanillaIceCream" android:requiredSplitTypes="" android:splitTypes="" package="com.google.android.contactkeys" platformBuildVersionCode="35" platformBuildVersionName="VanillaIceCream">
Yukarıdaki çıktıdan, bu APK'nın paket adının com.google.android.contactkeys
ve sürüm numarasının (versionCode) 1413
olduğundan emin olabiliriz.
Şimdi APK'da kod şeffaflığı imzasını arayacağız. APK'dan ayıklanan diğer dosyalar arasında META-INF
klasöründe code_transparency_signed.jwt
adlı bir dosya bulunmalıdır.
computer:/tmp/testdir$ sha256sum extracted/META-INF/code_transparency_signed.jwt
1779a2aee029112c2c9bfc9390b9678f3e5f4595b39705e8528dd522e8042f11 code_transparency_signed.jwt
Bu karma oluşturma dizesi sayesinde, Günlük İçeriği bölümünde açıklanan biçime göre bir günlük yükü oluşturmak için gereken tüm bilgilere sahip oluruz. Bu örnekte, karşılık gelen günlük yükü aşağıdaki gibi görünmelidir:
1779a2aee029112c2c9bfc9390b9678f3e5f4595b39705e8528dd522e8042f11
SHA256(Signed Code Transparency JWT)
com.google.android.contactkeys
1143
Paket sürümünden sonra gelen yeni satır karakterine de dikkat edin.
İçeriği payload.txt
gibi bir dosyaya kaydedebilirsiniz. Bu, daha sonra dahil etme kanıtı testi yaparken işinize yarayacaktır.
APK Kod İmzasının Orijinalliğini Doğrulama
Şimdi, APK'ya yerleştirilmiş kod imza jetonunun özgünlüğünü doğrulamamız gerekiyor. Bunun için bundletool
ve ilk başta imzalamak için kullanılan anahtar çiftinin ortak anahtarını kullanırız. Bunlar, ilgili APK'ların her bölümünde yayınlanır. Ortak anahtar sertifikasını (ör. Android System Key Verifier için) signing_cert_pubkey.pem
adlı bir dosyaya kaydettiğinizi varsayarak kod imza doğrulamasını gerçekleştirmek için aşağıdaki kılavuzu uygulayın.
Öncelikle bir zip arşivi oluşturmanız ve aday APK'yı zip arşivine eklemeniz gerekir.
computer:/tmp/testdir$ zip -u test.zip contactkeys_candidate.apk
zip warning: test.zip not found or empty
adding: contactkeys_candidate.apk (deflated 58%)
computer:/tmp/testdir$ file test.zip
test.zip: Zip archive data, at least v2.0 to extract, compression method=deflate
Aday APK'ya yerleştirilen kod imzasının, yayınlananla eşleşip eşleşmediğini doğrulamak için bundletool
'ın check-transparency
komutunu kullanmaya hazırız.
computer:/tmp/testdir$ java -jar BUNDLETOOL_INSTALL_PATH/bundletool-all-version.jar check-transparency \
--mode=apk \
--apk-zip=test.zip \
--transparency-key-certificate=signing_cert_pubkey.pem
APK signature is valid. SHA-256 fingerprint of the apk signing key certificate (must be compared with the developer's public key manually): D9 E1 73 5B 2A 39 51 27 3A 87 35 B7 66 9E F1 9E F5 3A F1 C1 27 5C BA 31 39 3C 18 40 8B 03 79 D0
Code transparency signature verified for the provided code transparency key certificate.
Code transparency verified: code related file contents match the code transparency file.
Yukarıdaki komutun çıkışında hem kod şeffaflığı imzasının hem de kod şeffaflığının doğrulandığından emin olun.
Aksi takdirde, örneğin Code transparency verification failed because the provided public key
certificate does not match the transparency file
gibi bir sonuç görüyorsanız söz konusu APK'nın kod bütünlüğünün ihlal edilmiş olabileceği anlamına gelir ve APK'ya güvenmemeniz gerekir.
Bunları doğru herkese açık anahtar sertifikasıyla doğruladığınızdan emin olmak için iki kez kontrol etmeyi unutmayın.
Aksi takdirde, diğer her şey kontrol edildiğinde, doğruladığınız APK için kod imzasının orijinalliğinin doğrulandığı anlamına gelir.
Paket Dahil Edildiğini Doğrulama (Dahil Edildiğinin Kanıtı)
Daha önce oluşturduğunuz yükleyiciyi kullanarak söz konusu paketin şeffaflık günlüğüne eklenip eklenmediğini test etmeye hazırsınız.
Android Açık Kaynak Projesi'ndeki avb
depoda dahiliyet kanıtı aracı yayınlandı. Çalıştırmak için:
computer:external/avb/tools/transparency/verify$ PAYLOAD_PATH=PATH_TO_PAYLOAD_DIR/payload.txt
computer:external/avb/tools/transparency/verify$ go build cmd/verifier/verifier.go
computer:external/avb/tools/transparency/verify$ ./verifier --payload_path=${PAYLOAD_PATH} --log_type=google_system_apk
Doğrulayıcı, APK yükünüzün şeffaflık günlüğünde olup olmadığını kontrol etmek için ilgili kontrol noktasını ve günlük içeriğini (karton liste dizininde bulunur) kullanır. Böylece, yükün gerçekten Google tarafından yayınlandığını doğrular.
Komutun çıkışı stdout'a yazılır:
OK. inclusion check success!
paketin kodu günlüke dahil edilmişse,FAILURE
ise