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

Bu sayfada, Android cihazınıza yüklenen APK'nın Hak Sahibi Modeli'nde belirtilen iddiaya uygun olmasını 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 ekleme kanıtı gerçekleştirilir.

Doğrulama süreci

Karma değerlerden oluşan bir Merkle ağacıyla şeffaflık günlüğü 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üğün belirli bir APK sürümüne karşılık gelen bir giriş içerdiğini kanıtlar. Günlük girişi, ilgili APK'lardan alınabilen bir JSON Web Jetonu (JWT) biçimindeki kod imzası jetonunun SHA256 özeti olan 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, gözlemlenen bir kontrol noktasına dayalı olarak dahil etme kanıtı testi yapın. 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, 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ı

Cihazınızdan yeni çıkardığınız APK'nın iddiamıza uygun olduğunu doğrulamaya geçmeden önce, ağa bağlı bir bilgisayardan yükleyerek aşağıdaki araçları edinmeniz gerekir.

Android Debug Bridge (ADB)

ADB, Android SDK Platform Araçları web sitesinde bulunan ve bir Android cihazla iletişim kuran bir araçtır.

AAPT2

AAPT2 (Android Asset Packaging Tool), Android uygulamasının kaynaklarının derlenmesi ve paketlenmesi için kullanılan bir derleme aracıdır. Bu araç, Android SDK Derleme Araçları 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. AAB'yi cihazlara yüklenebilecek APK'lara dönüştürmek için de kullanılabilir. GitHub'dan indirilebilir.

Inclusion Proof doğrulayıcı

Bu, Android Açık Kaynak Projesi (AOSP) kapsamındaki bir Git deposunda avb adıyla yayınladığımız bir Go modülüdür. Google System Services APK şeffaflık günlüğüne sorgu gönderebilir ve bir paketin günlüğe dahil edilip edilmediğini belirtebilir. Bu özelliğin nasıl kullanıldığına dair bir örneği sonraki bölümde 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 kodunu tools/transparency/verify içindeki avb deposunda bulabilirsiniz.

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

Cihazınızdan iddialarımıza göre çıkardığınız APK'yı 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 ö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, Android cihazınızdaki APK'yı şu komutu kullanarak ç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. Çünkü 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 okunabilir bir biçime 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ıdan, 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 arasında META-INF klasöründe bulunan 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

Ayrıca paket sürümünden sonraki yeni satır karakterine de dikkat edin.

İçeriği payload.txt gibi bir dosyaya kaydedebilirsiniz. Bu, daha sonra kapsama alanı 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 başlangıçta imzalamak için kullanılan anahtar çiftinin ortak anahtarından yararlanı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 çıkışında hem kod şeffaflığı imzası hem de kod şeffaflığı doğrulandığından emin olmalısınız. Aksi takdirde, ö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 söz konusu APK'nın kod bütünlüğü tehlikeye girmiş olabilir 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 kontrol edildiyse bu, doğrulamakta olduğunuz APK'nın kod imzasının gerçekliğinin doğrulandığını gösterir.

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_system_apk

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 çıkışı stdout'a yazılır:

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