Bu sayfada, Android cihazınıza yüklenen APK veya APEX'in Hak Talebinde Bulunan Modeli'ndeki iddialara uygun olup olmadığını nasıl doğrulayacağınız açıklanmaktadır. Bu işlem, APK'nın cihazınızdan alınmasını ve ayıklanan yapı üzerinde günlük dahil etme kanıtı gerçekleştirilmesini içerir.
Doğrulama Süreci
Şeffaflık günlüğü, karma değerlerden oluşan bir Merkle ağacı ile uygulanır. Bir yaprak düğüm veri içerir ve bir üst düğüm, alt öğelerinin karma değerini içerir.
Şeffaflık günlüklerinin kurcalanmaya karşı koruma özelliğini doğrulamak için iki temel hesaplama kullanılır: dahil etme kanıtı ve tutarlılık kanıtı. Dahil etme kanıtı, günlükte belirli bir APK sürümüne ait bir giriş olduğunu onaylar. Bu günlük girişi, cihazda yüklü APK dosyasının SHA256 özeti olan bir karma içerir. Tutarlılık kanıtı, yeni girişler eklendiğinde yeni kontrol noktasının ağacın önceki sürümleriyle şifreleme açısından tutarlı kalmasını (veya ağacın değiştirilmemesini) sağlar. Bu kılavuzda, en son kontrol noktalarına karşı tutarlılık kanıtını sürekli olarak gerçekleştirmek için tanıklardan yararlanırken dahil etme kanıtını hesaplama sürecine odaklanıyoruz.
Kapsanan bir APK'yı doğrulamak için tanık olunan bir kontrol noktasına karşı dahil etme kanıtı gerçekleştirin. Bu günlüğü, standartlaştırılmış bir tanık protokolü kullanarak herkese açık bir tanık ağıyla entegre etmeyi planlıyoruz. Bu entegrasyon, tanık olunmuş kontrol noktaları sağlayarak günlüğün tutarlılığını garanti eder.
Cihazınızdaki Google uygulamalarının, hak talebinde bulunan modelde belirtilen iddialara uygun olduğunu doğrulamak için aşağıdaki adımları uygulayın.
Dahil etme kanıtı
Cihazınızdaki kapsanan bir APK'nın günlükte olduğunu doğrulamak için APK'yı çıkarabilir, karmasını hesaplayabilir ve bu karmanın yayınlanan kontrol noktasında olup olmadığını kontrol etmek için dahil etme kanıtı kullanabilirsiniz. Başarılı bir dahil etme kanıtı, tehdit modelinde açıklanan risklere karşı güvence sağlar ve uygulamanın meşru bir Google uygulaması olduğunu onaylar.
APK'nın günlükte yer aldığını doğrulama
Birinci taraf Google uygulaması olduğunu iddia eden tüm uygulamalar bu günlükle doğrulanabilir.
Doğrulama Ön Koşulları
Yapıtın (donanım yazılımı veya APK) iddiaya uygun olduğunu doğrulamaya geçmeden önce, ağa bağlı bir bilgisayarda aşağıdaki araçların bulunduğundan emin olun. Doğrulama hedefine bağlı olarak bunların hepsine ihtiyacınız olmayabilir.
Golang
Doğrulama aracı Go ile yazılmıştır. Aracı oluşturmak için Go sitesinden Go 1.24 veya sonraki bir sürümü yükleyin.
Android Debug Bridge (ADB)
ADB, Android SDK Platform Araçları web sitesinde bulunan, görüntüyü incelemek veya APK'ları ayıklamak için Android cihazla iletişim kuran bir araçtır.
Inclusion Proof doğrulayıcı
Dahil edilme kanıtı doğrulayıcı, şeffaflık günlüğünü sorgulayan ve bir yapının günlüğe dahil edilip edilmediğini belirten bir Go modülüdür.
android-binary-transparency GitHub deposunda yayınlanır:
https://github.com/android/android-binary-transparency/tree/main
AOSP avb deposunu klonlamak için:
computer:~$ git clone https://android.googlesource.com/platform/external/avb
android-binary-transparency GitHub deposunu klonlamak için:
computer:~$ git clone https://github.com/android/android-binary-transparency
AAPT2
AAPT2 (Android Asset Packaging Tool), Android uygulamasının kaynaklarını derlemek ve paketlemek için kullanılan bir derleme aracıdır. Bu araç, Android SDK Build Tools 26.0.2 ve sonraki sürümlerinde bağımsız bir araç olarak bulunur.
bundletool
bundletool, Android App Bundle (AAB) oluşturmak için kullanılan bir araçtır. APK kod imzalarını doğrulamak için de kullanılabilir.
GitHub'dan indirilebilir.
wget veya curl
wget ve curl, internetten dosya almak veya indirmek için kullanılabilen araçlardır. Doğrulama komut dosyaları bu araçlara bağlı olabileceğinden, bu araçlardan birinin yüklü olduğundan emin olun.
Avbtool
avbtool, fabrika ayarı görüntülerinin VBMeta özetini hesaplamak ve ikili dosyaları doğrulamak için kullanılır.
avb deposu klonlandıktan sonra (dahil etme kanıtı doğrulayıcı bölümünde gösterildiği gibi) avbtool.py, klonlanan avb dizininde bulunabilir.
Bu dizini $PATH ortam değişkeninize eklemeniz gerekir.
computer:~$ PATH=$PATH:DIRECTORY_CONTAINING_AVBTOOL
Fbpacktool
fbpacktool, Pixel'in bootloader.img dosyasındaki bağımsız bileşenleri açmak için kullanılan bir Python komut dosyasıdır.
APK'ları doğruluyorsanız buna ihtiyacınız yoktur.
Bu araç, avbtool.py'nın doğrulama için gerekli resimleri bulmasını sağladığı için önemlidir.
fbpacktool, Python 3.6 veya sonraki bir sürümü ve PyYAML paketini gerektirir (ör. python3 -m pip install pyyaml).
Bu araçtan yararlanmak için aşağıdaki altı Python komut dosyasını avbtool.py dosyanızın bulunduğu dizine indirmeniz, fbpacktool.py dosyasını yürütülebilir hale getirmeniz ve kolaylık sağlamak için fbpacktool.py dosyasına fbpacktool adlı bir sembolik bağlantı oluşturmanız gerekir.
wget kullanıyorsanız:
computer:dir_to_avbtool$ wget https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/fbpacktool.py \
https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/fbpack.py \
https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/packedstruct.py \
https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/xmlparser.py \
https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/xmlserializer.py \
https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/yamlparser.py
computer:dir_to_avbtool$ chmod +x fbpacktool.py
computer:dir_to_avbtool$ ln -s fbpacktool.py fbpacktool
curl varsa:
computer:dir_to_avbtool$ curl -LO https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/fbpacktool.py
computer:dir_to_avbtool$ curl -LO https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/fbpack.py
computer:dir_to_avbtool$ curl -LO https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/packedstruct.py
computer:dir_to_avbtool$ curl -LO https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/xmlparser.py
computer:dir_to_avbtool$ curl -LO https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/xmlserializer.py
computer:dir_to_avbtool$ curl -LO https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/yamlparser.py
computer:dir_to_avbtool$ chmod +x fbpacktool.py
computer:dir_to_avbtool$ ln -s fbpacktool.py fbpacktool
OpenSSL
openssl, doğrulama iş akışında terminali kullanarak çeşitli kriptografik işlemlerin gerçekleştirilmesine yardımcı olur. Sisteminizde yüklü olduğundan emin olun. Aşağıdaki komutu çalıştırıp döndürülen sonucun boş olmadığından emin olarak terminalinizi kontrol edebilirsiniz:
computer:~$ which openssl
/usr/bin/openssl
Doğrulama için yük oluşturma
Ayıklanan APK'nızı doğrulamak için APK'dan elde edilen bilgileri kullanarak bir günlük yükü oluşturmanız gerekir.
Başlamadan önce, adb bağlantılarına izin vermek için cihazınızda USB üzerinden hata ayıklamayı etkinleştirin.
Ardından, cihazınızda yüklü APK'yı bulun. Bu kılavuzda, çalışma örneği olarak Google Play Hizmetleri APK'sı (com.google.android.gms) kullanılmaktadır.
adb shell pm path com.google.android.gms
Şuna benzer bir çıkış alırsınız:
computer:~$ adb shell pm path com.google.android.gms
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/base.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_CronetDynamite_installtime.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_DynamiteLoader_installtime.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_DynamiteModulesA_installtime.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_DynamiteModulesC_installtime.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_GoogleCertificates_installtime.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_MapsDynamite_installtime.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_MeasurementDynamite_installtime.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_config.en.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_config.xxhdpi.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_maps_core_dynamite_ondemand.apk
Bu çıkış, cihazınızda com.google.android.gms için bir temel APK ve birkaç bölünmüş APK'nın yüklendiğini gösterir.
Bölünmüş APK'ların tam sayısı, cihazınızın yapılandırmasına bağlı olarak değişir.
Her bölünmüş APK, temel APK ile aynı paket adına ve sürüm koduna sahiptir.
Aşağıdaki komutu kullanarak listelenen APK'ları Android cihazınızdan bilgisayarınıza indirin (gerçek dosya yollarınızın farklı olabileceğini unutmayın):
mkdir -p /tmp/testdir/gms && cd /tmp/testdir/gms && \
adb shell pm path com.google.android.gms | cut -d':' -f2 | tr -d '\r' | xargs -n1 adb pull
İndirilen APK'ların paket adını ve sürümünü doğrulamak için manifest (AndroidManifest.xml) dosyalarını incelemeniz gerekir.
APK'nın içindeki manifest ikili biçimde olduğundan, bilgileri doğrudan APK'dan ayıklamak ve okumak için aapt2 aracını (ön koşullar adımında yüklenir) kullanın:
computer:/tmp/testdir/gms$ aapt2 dump badging ./base.apk
package: name='com.google.android.gms' versionCode='260834035' versionName='26.08.34 (260400-876566425)' platformBuildVersionName='Baklava' platformBuildVersionCode='36' compileSdkVersion='36' compileSdkVersionCodename='Baklava'
minSdkVersion:'35'
targetSdkVersion:'36'
...
Cihazınıza yüklenen tüm bölünmüş APK'ları hesaba katana kadar ilgili bilgileri almak için bu adımı tekrarlamanız gerekir.
Çıktı, APK'nın paket adının com.google.android.gms ve sürüm numarasının (versionCode) 260834035 olduğunu onaylar.
Ardından, her APK'nın kriptografik karmasını hesaplayın:
computer:/tmp/testdir/gms$ sha256sum *.apk
66aa2d7b9752cdd61065b55c8e16739d8367fa18a0f1c8c84122369f86958f1a base.apk
c20754aee886cc55a9de91ee15c623c59d94ad22b7e435a1a48afc43cf1a106c split_config.en.apk
68c09b63a1262e0d34020c139bc77deff3c32bd2b01177abac64790a62fb3be6 split_config.xxhdpi.apk
cd746820c27babd855fa5daea6fabcdf7b44abf3060bc547adc4219212410af0 split_CronetDynamite_installtime.apk
512ee48b60fdb0787a17f84a7dc448fdbf885b2b86a9cb50525d4c22d561b0f1 split_DynamiteLoader_installtime.apk
9e0c74bdc75c50c80d4e2e580a7eda6b8391423ab1161645f41ec6cadc07d678 split_DynamiteModulesA_installtime.apk
955780ac01f59b98bd9be12968f3824ad71b762620f7bf223c569c1a6ab7056c split_DynamiteModulesC_installtime.apk
34c4a2e32d31554d55fc1519e2cfc3ed5027a090fb29b54cfc99f42d1da43bc5 split_GoogleCertificates_installtime.apk
475e18dde92472cde9d8300c082b6dc269613db03398bcd9d1987dff3e68f7b5 split_maps_core_dynamite_ondemand.apk
f83faf40f08bc13f4879302e01c08c863ca2304b4b4e7c9eaf8cd1e869bb6573 split_MapsDynamite_installtime.apk
ec6d854ddda6cd1ba2ba7af2d9fdf4f28c5c78be8713c64521c785429296738c split_MeasurementDynamite_installtime.apk
Artık Günlük İçeriği bölümünde açıklandığı şekilde biçimlendirilmiş bir günlük yükü oluşturmak için gereken tüm bilgilere sahipsiniz. Sonuçlardan örnek olarak bir karma seçildiğinde (her bölünmüş APK'nın karmasını doğrulamanız gerekir) günlük yükü şu şekilde görünür:
66aa2d7b9752cdd61065b55c8e16739d8367fa18a0f1c8c84122369f86958f1a
SHA256(APK)
com.google.android.gms
260834035
Dosyanın sonuna yeni satır karakteri eklediğinizden emin olun. Bu içeriği, daha sonra verifier aracıyla kullanmak üzere payload.txt gibi bir dosyaya kaydedin.
Paket Dahil Edilme Durumunu Doğrulama (Dahil Edilme Kanıtı)
Yükünüz oluşturulduktan sonra paketin şeffaflık günlüğüne dahil edilip edilmediğini kontrol edebilirsiniz. Daha önce klonladığınız android-binary-transparency deposundan dahil etme kanıtı aracını oluşturun:
go build cmd/verifier/verifier.go
Bu işlem, ilgili dizinde verifier adlı bir yürütülebilir dosya oluşturur.
Doğrulayıcıyı çalıştırın, yükünüzün yolunu belirtin ve günlük türünü tanımlayın:
computer:android-binary-transparency$ PAYLOAD_PATH=PATH_TO_PAYLOAD_DIR/payload.txt
computer:android-binary-transparency$ ./verifier --payload_path=${PAYLOAD_PATH} --log_type=google_1p_apk
Doğrulayıcı, APK yükünüzün şeffaflık günlüğünde olup olmadığını kontrol etmek için kontrol noktasını ve günlük içeriklerini (karolar dizininden) kullanarak APK'nın Google tarafından yayınlandığını onaylar.
Komut, stderr'e çıkış verir:
- Paket günlükte yer alıyorsa
OK. inclusion check success!. FAILUREseçeneğini belirleyin.
Cihazdaki Tüm Paketleri Otomatik Olarak Doğrulama
Cihazınıza önceden yüklenmiş olabilecek Google uygulamalarının sayısı göz önüne alındığında, her bir uygulamayı listelemek ve dahil etme kanıtlarını ayrı ayrı gerçekleştirmek sıkıcı olabilir.
Cihazınızda yüklü olan tüm paketleri algılayıp ölçebilen Uraniborg adlı başka bir otomatik araç sunuyoruz.
Çıkışını doğrudan verifier aracına aktararak cihazınızdaki tüm uygulamaların şeffaflığını tek adımda keşfetmenize ve doğrulamanıza olanak tanır.
Bu otomatik iş akışını kullanmak için Android cihazınızın ADB üzerinden bilgisayarınıza bağlı olduğundan emin olun. Uraniborg kaynak kodu, android-binary-transparency deposuna da dahildir.
scripts/python dizininde bulunan automate_observation.py komut dosyasını çalıştırın:
python3 automate_observation.py --pull-all-apks --perform_inclusion_proof_check --verifier_path <path_to_verifier_executable>
Komut dosyası tamamlandığında şuna benzer bir çıkış görürsünüz:
INFO:automate_observation.py:main(858): SUCCESS! Hubble was successfully deployed and executed on connected device ABCDEFGHN01234.
INFO:automate_observation.py:main(860): Hubble output files can be found at: /Users/user/home/src/android-binary-transparency/uraniborg/scripts/python/results/google/lynx/lynx:16/BP4A.260105.004.E1/14587043:user/release-keys/001
Komut dosyasında belirtilen çıkış dizinine gidin.
İçeride packages_with_inclusion_proof_signal.txt adlı dosyayı bulun.
Bu dosyada, yüklenen her paket true veya false olarak ayarlanmış bir inclusion_proof_verified alanı ile birlikte listelenir.
true değeri, paketin şeffaflık günlüğüne göre kriptografik olarak doğrulandığını ve günlüğün iddialarına uyduğunu gösterir.