Google System Services APK Şeffaflık Tam Doğrulaması

Bu sayfada, Android cihazınıza yüklenen APK'nın Hak Talebinde Bulunan Taraf Modeli'nde belirtilen hak talebiyle eşleşmesini sağlamaya yönelik çeşitli yöntemler açıklanmaktadır. Bu işlemde, söz konusu APK cihazınızdan çekilir, kod bütünlüğü kontrol edilir ve çıkarılan yapıda günlük dahil etme kanıtı gerçekleştirilir.

Doğrulama süreci

Şeffaflık günlüğü, karma değerlerden oluşan bir Merkle ağacıyla uygulanır. Bir yaprak düğüm veri içerir ve bir üst düğüm, alt öğelerinin karma değerini içerir.

Temel olarak, şeffaflık günlüklerinin kurcalamaya karşı korumalı özelliğini doğrulamak için Merkle ağacında iki hesaplama yapılır: dahil etme kanıtı ve tutarlılık kanıtı. İlk yöntem, 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 alınabilen bir JSON Web Jetonu (JWT) biçimindeki kod imzası jetonunun SHA256 özetini içeren bir karma içerir. İkincisi, ağaca yeni girişler eklendiğinde yeni kontrol noktasının ağacın önceki sürümüyle (kriptografik olarak) tutarlı olduğunu kanıtlar.

Kapsam dahilindeki bir APK'yı doğrulamak için, şahitli bir kontrol noktasına dayalı olarak dahil etme kanıtı testi 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 planladığımızı belirtmek isteriz. Bu işlem, günlüğün tutarlılığını garanti eden, tanıklı bir kontrol noktası sağlar.

Cihazınızdaki APK'nın, hak talebinde bulunan modelde belirtilen iddiaya uygun olduğundan emin olmak istiyorsanız aşağıdaki yazıyı 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 çıkarıp yeniden hesaplanan kök karmalarını yayınlanan kontrol noktasında bulunan kök karmasıyla karşılaştırabilir. Eşleşme varsa Android kullanıcısı, tehdit modelinde açıklanan bazı korumalardan yararlanabilir.

APK'nın günlükte yer aldığını doğrulama

Daha önce açıklandığı gibi, şu anda kapsanan APK'ların listesini Genel bakış sayfasında bulabilirsiniz.

Doğrulama Ön Koşulları

Yapıtın (cihaz yazılımı veya APK) hak talebine 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, resmi incelemek veya APK'ları çıkarmak için bir Android cihazla iletişim kuran bir araçtır.

Inclusion Proof doğrulayıcı

Dahil etme 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. Bu kitaplık, android-binary-transparency GitHub deposunda yayınlanmıştı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 uygulamalarının kaynaklarını derlemek ve paketlemek için kullanılan bir derleme aracıdır. Bu araç, Android SDK Derleme Araçları'nın 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 kodu imzalarını doğrulamak için de kullanılabilir. Bu araç GitHub'dan indirilebilir.

wget veya curl

wget ve curl İnternet'ten 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 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 içindeki tek tek bileşenleri açmak için kullanılan bir Python komut dosyasıdır. APK'ları doğruluyorsanız bu bilgiye ihtiyacınız yoktur. Bu araç, avbtool.py'nın doğrulama için gerekli resimleri bulmasını sağladığı için önemlidir.

Bu aracı kullanmak için aşağıdaki üç 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://source.android.com/devices/bootloader/tools/pixel/fw_unpack/fbpacktool.py \
https://source.android.com/devices/bootloader/tools/pixel/fw_unpack/fbpack.py \
https://source.android.com/devices/bootloader/tools/pixel/fw_unpack/packedstruct.py
computer:dir_to_avbtool$ chmod +x fbpacktool.py
computer:dir_to_avbtool$ ln -s fbpacktool.py fbpacktool

curl kullanıyorsanız:

computer:dir_to_avbtool$ curl -O https://source.android.com/devices/bootloader/tools/pixel/fw_unpack/fbpacktool.py
computer:dir_to_avbtool$ curl -O https://source.android.com/devices/bootloader/tools/pixel/fw_unpack/fbpack.py
computer:dir_to_avbtool$ curl -O https://source.android.com/devices/bootloader/tools/pixel/fw_unpack/packedstruct.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. Sisteminize yüklendiğinden emin olun. Aşağıdaki komutu çalıştırıp döndürülen sonucun boş olmadığından emin olarak terminalinizde kontrol edebilirsiniz:

computer:~$ which openssl
/usr/bin/openssl

Doğrulama için Yük Oluşturma

Cihazınızdan iddialarımıza göre çıkardığınız APK'nın doğruluğunu onaylamak için, APK'dan elde edilen bilgilerle bir günlük yükü oluşturmanız gerekir.

Başlamadan önce cihazınızda adb özelliğini kullanabilmek için cihazınızda adb hata ayıklamayı etkinleştirin.

Ardından, APK'nın cihazınızda yüklendiği yeri bulun. Bu kılavuzda, çalışma örneğimiz olarak Android System Key Verifier APK'sını (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 konumu gösteren bir yol döndürür. Aksi takdirde herhangi bir çıkış görmezsiniz.

Ardından, aşağıdaki komutu kullanarak Android cihazınızdaki APK'yı çalıştığınız bilgisayara indirin (cihazınızdaki gerçek konumun ve APK dosya adının farklı olabileceğ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

Yeni indirdiğiniz APK'nın paket adını alıp doğrulayabilmek için öncelikle APK'yı açmanız gerekir. APK'lar nihayetinde özel bir ZIP dosyasıdır.

computer:/tmp/testdir$ mkdir extracted && unzip contactkeys_candidate.apk -d extracted/

Bu adımda, APK'yı oluşturan tüm dosyalar açılır. Paket adı ve sürümü, genellikle AndroidManifest.xml adlı bir dosyada bulunan APK'nın manifestinde yer alır.

Ancak, elde edilen manifest dosyası, insan tarafından okunabilir olmayan ikili biçimdedir. İkili XML'yi insanlar tarafından okunabilir bir forma dönüştürmek için daha önce yüklenen aapt2 aracını kullanırız (ön koşul bölümünde yüklenmesi gerektiği gibi).

computer:/tmp/testdir$ aapt2 dump badging ./contactkeys_candidate.apk
package: name='com.google.android.contactkeys' versionCode='7805' versionName='1.219.791156583' platformBuildVersionName='Baklava' platformBuildVersionCode='36' compileSdkVersion='36' compileSdkVersionCodename='Baklava'

Yukarıdaki çıktıyı incelediğimizde bu APK'nın paket adının com.google.android.contactkeys ve sürüm numarasının (versionCode) 1413 olduğunu doğrulayabiliriz.

Şimdi APK'da kod şeffaflığı imzasını arayacağız. Bu dosya, APK'dan çıkarılan diğer dosyaların bulunduğu META-INF klasöründe yer alan code_transparency_signed.jwt adlı bir dosya olmalıdır.

computer:/tmp/testdir$ sha256sum extracted/META-INF/code_transparency_signed.jwt
1779a2aee029112c2c9bfc9390b9678f3e5f4595b39705e8528dd522e8042f11  code_transparency_signed.jwt

Bu karma dizesiyle artık 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 sahibiz. Bu örnekte, ilgili 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 sonraki yeni satır karakterini de unutmayın.

İçeriği payload.txt gibi bir dosyaya kaydedebilirsiniz. Bu, daha sonra dahil etme kanıtı testi yaparken işinize yarayacaktır.

APK kodu imzasının gerçekliğini doğrulama

Şimdi, APK'ya yerleştirilmiş kod imzası jetonunun gerçekliğini doğrulamamız gerekir. Bunu yapmak 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 imzası doğrulama işlemini gerçekleştirmek için aşağıdaki kılavuzu uygulayın.

Öncelikle bir zip arşivi oluşturup 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

Artık bundletool'nın check-transparency komutunu kullanarak aday APK'ya yerleştirilmiş kod imzasının yayınlanmış olanla eşleşip eşleşmediğini doğrulayabiliriz.

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 çıktısında hem kod şeffaflığı imzası hem de kod şeffaflığı özelliğinin doğrulandığından emin olmalısınız. Örneğin, Code transparency verification failed because the provided public key certificate does not match the transparency file gibi bir çıktı görüyorsanız bu, söz konusu APK'nın kod bütünlüğünün tehlikeye girmiş olabileceği anlamına gelir ve APK'ya güvenmemelisiniz. Bunları doğru genel anahtar sertifikasıyla doğruladığınızdan emin olmak için iki kez kontrol etmeyi unutmayın. Aksi takdirde, diğer her şey doğruysa bu, doğrulamakta olduğunuz APK'nın kod imzasının gerçekliğinin doğrulandığı anlamına gelir.

Paket dahil etme işlemini doğrulama (dahil etme kanıtı)

Daha önce oluşturduğunuz yükü kullanarak söz konusu paketin şeffaflık günlüğüne dahil edilip edilmediğini test etmeye hazırsınız.

Android Açık Kaynak Projesi'ndeki avb depoda bir dahil etme 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_1p_code

Doğrulayıcı, APK yükünüzün şeffaflık günlüğünde olduğunu kontrol etmek için ilgili kontrol noktasını ve günlük içeriklerini (tile dizininde bulunur) kullanır. Bu sayede, yükün gerçekten Google tarafından yayınlandığı doğrulanır.

Komutun çıktısı stdout'a yazılır:

  • Paketin kodu günlükte yer alıyorsa OK. inclusion check success!
  • FAILURE değilse.