Android Security AutoRepro

AutoRepro Gradle eklentisi, Android Trade Federation test düzeneğinin üzerine kurulmuştur. Bu eklenti, Android Güvenlik Bülteni'ndeki güvenlik açıklarına karşı güvenlik yaması testleri için tüm Android cihazları test eder. Bu testler yalnızca Common Vulnerabilities and Exposures (CVE) ile ilişkili olan veya olacak düzeltmeler için yapılır.

Eklenti, Android Studio veya standart Android SDK kullanılarak Android kaynak ağacı dışında Tradefed testlerinin geliştirilmesine olanak tanır. Tradefed testi oluşturmak ve çalıştırmak için gereken tüm yardımcı programları içerir.

Öncelikli olarak Android Güvenlik Açığı Ödül Programı için otomatik olarak yeniden üretilebilen kavram kanıtlarını göndermek amacıyla kullanılır.

Direct Download AutoRepro Example

AutoRepro örneğine ve şablonlarına göz atın

Ön koşullar

Talimatlar, 64 bit Linux PC için sağlanır.

  • Android Studio Ladybug veya daha yeni bir sürüm - Dağıtımınızın paket yöneticisinden de yüklenebilir.
  • Android SDK platform araçları (adb, fastboot) - Yüklenmeli ve $PATH içinde olmalıdır (Yani, komut satırından adb komutunu çalıştırabilmelisiniz). Platform araçlarını yüklemenin en kolay yolu, dağıtımınızın paket yöneticisini kullanmaktır.
    • Bağımsız platform araçları yerine Android Studio'nun SDK yöneticisini kullanıyorsanız komut satırı geliştirme için SDK'nın platform-tools dizinini $PATH öğenize eklemeyi unutmayın.
  • AAPT2. - Dağıtımınızın paket yöneticisi kullanılarak da yüklenebilir.
  • Java JDK 21 veya daha yeni bir sürüm: Android SDK ve Gradle ile uyumludur.

Android Studio'yu kullanmaya başlama

Örneği veya şablonu çıkardıktan sonra dizini Android Studio'da mevcut bir proje olarak açın ve Gradle senkronizasyonunun tamamlanmasını bekleyin. Önceden yapılandırılmış çeşitli Android Studio çalıştırma yapılandırmaları vardır.

Gradle görevleri:

  • assembleSubmissionSources - Gönderim için kaynak dosyaları zip olarak birleştirin.
  • assembleSubmissionZip - Yüklemek için gönderim ZIP dosyasını oluşturun.
  • copyInvocationResultsToSubmission - İnceleme sürecine yardımcı olmak için önceki Tradefed çağrılarından elde edilen sonuçları AutoRepro gönderim kaynakları dizinine kopyalayın. Bu dosyanın hem ana makineye hem de cihaza ait günlükleri içerdiğini unutmayın. Bu komutu çalıştırmadan önce veya sonra içeriği inceleyin.

AutoRepro çağırma Android Studio çalıştırma yapılandırmaları:

  • autorepro_nonroot_arm64
  • autorepro_nonroot_x86_64
  • autorepro_root_arm64
  • autorepro_root_x86_64

Başlatıcı yapılandırmaları autorepro_{device_root}_{device_arch} biçimindedir. Genel olarak, root gerektiren güvenlik açıkları daha az ciddi olduğundan root olmayan cihazları kullanmak tercih edilir. Ancak, kurulum veya temizleme işlemlerini gerçekleştirmek için root kullanılması, açıkça belgelenmesi ve genellikle geçerli bir root olmayan durum olarak kabul edilmesi koşuluyla kabul edilebilir. Örneğin, ikinci bir cihaz ve birden fazla SIM kart gerektirmemek için cihazda sahte kısa mesaj göndermek üzere root kullanmak kabul edilebilir.

Bunlar, testiniz için Tradefed'i başlatır. Tradefed, geçerli bir cihazın bağlanmasını bekler. Bu nedenle, bir cihazın bağlı olduğundan ve ADB hata ayıklamasının yetkilendirildiğinden emin olun.

Kodlama aracıyla entegrasyon

Örnek ve şablonlar, Android Studio'da Gemini, Gemini CLI ve diğer kodlama aracılarıyla uyumlu bir AGENTS.md bağlam dosyası sağlar. Gönderim yapısının oluşturulmasıyla ilgili görüşler ve AutoRepro'nun kullanımıyla ilgili talimatlar içerir. Bu özelliği kullanarak:

  • Cihazınızda AutoRepro'yu otomatik olarak çalıştırma
  • Raporunuzun daha hızlı kabul edilmesine yardımcı olabilecek değişiklikler için mevcut bir gönderimi kod incelemesinden geçirme
  • Güvenlik açığıyla ilgili bilgiler ışığında yeni bir konsept kanıtı oluşturmaya yardımcı ol

Otomatik yeniden üretme testi yazma

AutoRepro testi üç bölümden ve üç ilgili Gradle eklentisinden oluşur:

  1. Gradle eklentisi id("com.android.security.autorepro.javahosttest") ADB aracılığıyla cihazla etkileşimde bulunan tek ana makine tarafı Tradefed testi. Örnekte, submission/hostTest/ dizininde kullanılıyor.
  2. Gradle eklentisi id("com.android.security.autorepro.apptest") adb install aracılığıyla cihaza yüklenen ve ana taraf testinde başlatılan bir uygulama veya hizmet APK'sı. Uygulama veya hizmet, ana makine tarafındaki çalıştırıcıya bildirilen kendi JUnit onaylamaları kümesini de içerebilir. Örnekte, submission/appTest/ ve dizinde kullanılır.
  3. Gradle eklentisi id("com.android.security.autorepro.ndktest") adb push aracılığıyla cihaza gönderilen ve ana bilgisayar tarafındaki test tarafından yürütülen, NDK tabanlı isteğe bağlı bir kavram kanıtı saldırısı. Örnekte, bu dosya submission/ndkTest/ dizininde kullanılmaktadır.

Tipik bir AutoRepro test akışı genellikle iki kalıptan birini izler:

  • Araçlı test uygulaması:

    1. Ana makine tarafı testi, cihaz üzerine enstrümanlı bir uygulama veya hizmetten oluşan bir APK gönderir.
    2. Ana makine tarafındaki test, runDeviceTest() aracılığıyla APK ile birlikte paketlenmiş cihaz tarafındaki JUnit testlerini başlatır.
    3. Cihaz tarafındaki JUnit testleri, UIAutomator'ı kullanarak düğmelere dokunur ve uygulamayı izler veya Android API'lerine güvenlik açıklarını ortaya çıkaracak şekilde erişir.
    4. Cihaz tarafındaki JUnit testlerinin başarılı veya başarısız olması, testin geçip geçmediğini belirlemek için kullanılabilecek ana makine tarafı testine döndürülür. Hata mesajı, onaylamanın neden başarısız olduğu ve güvenlik açığına dair kanıt olarak kullanılan belirli nesneler, değerler, istisnalar, yığın izleri veya diğer yapılar hakkında ayrıntılı bilgi içermelidir.
  • NDK kavram kanıtlama:

    1. Ana makine tarafındaki test, cihazda bir yürütülebilir Linux dosyası gönderip başlatır.
    2. Yerel program çöker veya belirli bir çıkış kodu döndürür.
    3. Ana makine tarafındaki test, kilitlenmeleri kontrol eder, logcat geri izlemesine bakar veya saldırının başarılı olup olmadığını belirlemek için belirli çıkış kodunu arar. Hata mesajı, onaylamanın neden başarısız olduğu ve güvenlik açığına dair kanıt olarak kullanılan belirli yapılar, değerler, yığın izlemeleri veya diğer yapılar hakkında ayrıntılı bilgi içermelidir.

İki kalıbın birleşimi (örneğin, cihaz tarafı testlerle birlikte yerel bir programın çalıştırılması) de mümkündür. frida-inject gibi başka enstrümantasyon çerçeveleri de mevcuttur. Ayrıntılar için Güvenlik Test Paketi referans belgeleri ve Tradefed referans belgeleri'ne bakın.

Kavram kanıtlama ile ilgili kanıtlanabilirlik yapılandırması

Yüksek kaliteli bir PoC, bir hatayı tetiklemekten daha fazlasını yapmalıdır. Bir güvenlik sınırının aşıldığına dair doğrulanabilir kanıt sunmalıdır. Bunu başarmak için konsept kanıtları, üç adımlı belirli bir "önce başarısız ol, sonra başarılı ol" kalıbını izleyebilir:

  1. Kurulum: Gerekli uygulamaları yükleyerek, dosyaları göndererek ve cihazın, saldırıdan hemen önce gerekli olan belirli durumda olduğundan emin olarak cihazı hazırlayın. (Gerekçelendirilmiş ve gerçekçi bir son kullanıcı durumunu temsil ediyorsa yapılandırma için root kullanımı izin verilir.)
  2. Sınırı Kanıtlama: Güvenlik açığını tetiklemeden önce hedef işlemi deneyin ve başarısız olduğunu onaylayın. Örneğin, güvenlik açığı korumalı bir dosyanın okunmasına izin veriyorsa önce dosyayı okumayı denemeli ve "İzin reddedildi" hatası aldığınızı onaylamalısınız.
  3. Tetikleme ve Doğrulama: Güvenlik açığını tetikleyin, ardından 2. adımdaki işlemi hemen tekrarlayın. Bu işlem, güvenlik açığı olan bir cihazda artık başarılı olmalıdır. Bunu doğrulamak için AUTOREPRO_VULNERABILITY_PROVEN: önekiyle başlayan bir mesaj içeren, güvenlik açığı olan bir cihazda başarısız olan bir onaylama kullanmanız gerekir. Bu mesajda, güvenlik açığının kısa bir açıklaması ve saldırının başarılı olduğunu kesin olarak kanıtlamak için yakalanan tüm yapılar (ör. sızdırılan veriler veya beklenmedik durumlar) yer almalıdır.

Örnek:

@Test
public void testPoc() throws Exception {
    // 1. Setup: Prepare the device.
    setup();

    // 2. Prove the Boundary: Assert the resource is protected BEFORE the exploit.
    // This passes on all devices (safe or vulnerable) before the trigger runs.
    assertDeviceIsSecure();

    // 3. Trigger & Verify: Execute the exploit logic, then immediately repeat
    // the action from Step 2. On a vulnerable device, this action should now
    // succeed, causing assertDeviceIsSecure() to fail with an
    // AUTOREPRO_VULNERABILITY_PROVEN message.
    triggerExploit();
    assertDeviceIsSecure();
}

private void assertDeviceIsSecure() {
    try {
        String content = readProtectedFile();

        // Where possible, put the content in the assertion message.
        // Start the assertion message with "AUTOREPRO_VULNERABILITY_PROVEN:".
        Assert.fail("AUTOREPRO_VULNERABILITY_PROVEN: Successfully read protected file. Content: '" + content + "'");
    } catch (ThisVulnSpecificException e) {
        Log.i(TAG, "protected against reading protected file", e);
    }
}

Kavram kanıtı saldırım için test uygulaması veya yerel yürütülebilir dosya gerekmiyor

Çoğu test için hem cihaz tarafı uygulaması hem de yerel yürütülebilir dosya gerekmez.

Testinizde bir özellik kullanılmıyorsa gereksiz gradle alt proje dizinlerini silin.

Kavram kanıtı saldırım ikinci bir uygulama veya hizmet içeriyor

İstediğiniz kadar Gradle alt projesi ekleyin.

AutoRepro testini gönderin

Cihazınızdaki test sonuçlarını gönderime dahil etmek için:

  • İsteğe bağlı olarak, eski test çalıştırmalarını silmek için Gradle clean görevini çalıştırın.
  • Testiniz için Tradefed'i çağırmak ve günlükleri ile sonuçları toplamak üzere uygun AutoRepro çalıştırma yapılandırmasını çalıştırın.
  • Günlükleri ve sonuçları gönderim kaynakları dizinine kopyalamak için copyInvocationResultsToSubmission görevini çalıştırın.

assembleSubmissionZip komutunu çalıştırarak submission/build/autorepro-submission.zip dosyasını oluşturun. Bu dosyayı, Android Güvenlik Açığı Ödül Programı'na gönderdiğiniz dosya ile birlikte yükleyin. Ekin *autorepro-submission*.zip kalıbına uygun olduğundan ve ilk raporla birlikte yüklendiğinden emin olun. Gönderilerin geç yüklenmesi, raporunuzu düzgün bir şekilde inceleme olanağımızı etkiler.