Android 보안 AutoRepro

AutoRepro Gradle 플러그인은 Android Trade Federation 테스트 하네스를 기반으로 빌드되어 Android 보안 게시판의 취약점에 대한 보안 패치 테스트를 위해 모든 Android 기기를 테스트합니다. 이러한 테스트는 일반적인 취약점 및 노출 (CVE)과 연결되거나 연결될 예정인 수정사항에만 독점적으로 사용됩니다.

이 플러그인을 사용하면 Android 스튜디오 또는 표준 Android SDK를 사용하여 Android 소스 트리 외부에서 Tradefed 테스트를 개발할 수 있습니다. 여기에는 Tradefed 테스트를 빌드하고 실행하는 데 필요한 모든 유틸리티가 포함되어 있습니다.

이 도구는 주로 Android 취약점 리워드 프로그램에 대해 자동으로 재현 가능한 개념 증명을 제출하는 데 사용됩니다.

AutoRepro 예시 다운로드

기본 요건

64비트 Linux PC용 안내가 제공됩니다.

  • Android 스튜디오 Ladybug 이상 - 배포판의 패키지 관리자에서도 설치할 수 있습니다.
  • Android SDK 플랫폼 도구(adb, fastboot) - $PATH에 설치되어 있어야 합니다 (즉, 명령줄에서 adb를 실행할 수 있어야 함). 플랫폼 도구를 설치하는 가장 쉬운 방법은 배포판의 패키지 관리자를 사용하는 것입니다.
    • 독립형 플랫폼 도구 대신 Android 스튜디오의 SDK Manager를 사용하는 경우 명령줄 개발을 위해 $PATH에 SDK의 platform-tools 디렉터리를 추가해야 합니다.
  • AAPT2. - 배포판의 패키지 관리자를 사용하여 설치할 수도 있습니다.
  • Java JDK 21 이상 - Android SDK 및 Gradle과 호환됩니다.

Android 스튜디오를 사용하여 시작하기

예시 또는 템플릿을 추출한 후 Android 스튜디오에서 디렉터리를 기존 프로젝트로 열고 Gradle 동기화가 완료될 때까지 기다립니다. 사전 구성된 Android 스튜디오 실행 구성에는 여러 가지가 있습니다.

Gradle 작업:

  • assembleSubmissionSources - 제출 ZIP의 소스 파일을 조합합니다.
  • assembleSubmissionZip - 업로드할 제출 zip 파일을 조합합니다.
  • copyInvocationResultsToSubmission - 이전 Tradefed 호출의 결과를 AutoRepro 제출 소스 디렉터리에 복사하여 검토 프로세스를 지원합니다. 여기에는 호스트와 기기의 로그가 모두 포함됩니다. 실행 전후에 콘텐츠를 검토하세요.

AutoRepro 호출 Android 스튜디오 실행 구성:

  • autorepro_nonroot_arm64
  • autorepro_nonroot_x86_64
  • autorepro_root_arm64
  • autorepro_root_x86_64

런처 구성은 autorepro_{device_root}_{device_arch} 형식입니다. 일반적으로 루트가 필요한 취약점은 심각도가 낮으므로 루트가 아닌 방법을 사용하는 것이 좋습니다. 하지만 루트를 사용하여 설정 또는 정리를 실행하는 것은 명확하게 문서화되어 있고 일반적으로 유효한 비루트 상태로 받아들여지는 한 허용될 수 있습니다. 예를 들어 두 번째 기기와 여러 SIM 카드가 필요하지 않도록 루트를 사용하여 기기에 문자 메시지를 보내는 척하는 것은 허용됩니다.

그러면 테스트를 위해 Tradefed가 실행됩니다. Tradefed는 유효한 기기가 연결될 때까지 기다리므로 기기가 연결되어 있고 ADB 디버깅이 승인되었는지 확인합니다.

AutoRepro 테스트 작성

AutoRepro 테스트에는 세 부분과 세 가지 상응하는 Gradle 플러그인이 있습니다.

  1. Gradle 플러그인 id("com.android.security.autorepro.javahosttest") ADB를 통해 기기와 상호작용하는 단일 호스트 측 Tradefed 테스트 이 예에서는 submission/hostTest/ 디렉터리에서 이를 사용합니다.
  2. Gradle 플러그인 id("com.android.security.autorepro.apptest") adb install을 통해 기기에 설치되고 호스트 측 테스트에서 실행되는 앱 또는 서비스 APK입니다. 앱 또는 서비스는 호스트 측 실행기에 보고되는 자체 JUnit 어설션 세트도 포함할 수 있습니다. 예에서는 submission/appTest/ 및 디렉터리에서 이를 사용합니다.
  3. Gradle 플러그인 id("com.android.security.autorepro.ndktest") adb push를 통해 기기로 푸시되고 호스트 측 테스트에 의해 실행되는 NDK 기반 개념 증명 공격(선택사항) 이 예에서는 submission/ndkTest/ 디렉터리에서 이를 사용합니다.

일반적인 AutoRepro 테스트 흐름은 대부분 다음 두 가지 패턴 중 하나를 따릅니다.

  • 계측 테스트 앱:

    1. 호스트 측 테스트는 계측된 앱 또는 서비스로 구성된 APK를 기기에 푸시합니다.
    2. 호스트 측 테스트는 runDeviceTest()를 통해 APK와 함께 번들로 제공되는 기기 측 JUnit 테스트를 시작합니다.
    3. 기기 측 JUnit 테스트는 UIAutomator를 사용하여 버튼을 탭하고 앱을 보거나 보안 취약점을 드러내는 방식으로 Android API에 액세스합니다.
    4. 기기 측 JUnit 테스트의 성공 또는 실패는 호스트 측 테스트에 반환되며 이는 테스트를 통과했는지 확인하는 데 사용할 수 있습니다. 오류 메시지에는 어설션이 실패한 이유와 취약점의 증거로 특정 객체, 값, 예외, 스택 트레이스 또는 기타 아티팩트에 관한 자세한 정보가 포함되어야 합니다.
  • NDK 개념 증명:

    1. 호스트 측 테스트는 기기에서 Linux 실행 파일을 푸시하고 실행합니다.
    2. 네이티브 프로그램이 다운되거나 특정 종료 코드를 반환합니다.
    3. 호스트 측 테스트가 비정상 종료를 확인하거나, Logcat 백트레이스를 살펴보거나, 특정 종료 코드를 찾아 공격이 성공했는지 확인합니다. 실패 메시지에는 어설션이 실패한 이유와 취약점의 증거로 특정 구조체, 값, 스택 트레이스 또는 기타 아티팩트에 관한 자세한 정보가 포함되어야 합니다.

두 패턴의 조합(예: 기기 측 테스트와 함께 네이티브 프로그램을 실행)도 가능합니다. frida-inject와 같은 다른 계측 프레임워크도 사용할 수 있습니다. 자세한 내용은 보안 테스트 모음 참조 문서Tradefed 참조 문서를 확인하세요.

개념 증명 공격에 테스트 앱 또는 네이티브 실행 파일이 필요하지 않음

대부분의 테스트에는 기기 측 앱과 네이티브 실행 파일이 모두 필요하지는 않습니다.

테스트에 기능 사용이 포함되지 않은 경우 불필요한 Gradle 하위 프로젝트 디렉터리를 삭제합니다.

개념 증명 공격에 두 번째 앱/서비스가 사용됨

AutoRepro 플러그인을 사용하여 원하는 만큼 Gradle 하위 프로젝트를 추가합니다.

AutoRepro 테스트 제출

제출물에 기기의 테스트 결과를 포함하려면 다음 단계를 따르세요.

  • 원하는 경우 Gradle clean 작업을 실행하여 이전 테스트 실행을 삭제합니다.
  • 적절한 AutoRepro 실행 구성을 실행하여 테스트에 Tradefed를 호출하고 로그와 결과를 수집합니다.
  • copyInvocationResultsToSubmission 작업을 실행하여 로그와 결과를 제출 소스 디렉터리에 복사합니다.

assembleSubmissionZip를 실행하여 submission/build/autorepro-submission.zip 파일을 만듭니다. Android 취약점 리워드 프로그램에 제출하는 동시에 이 파일을 업로드합니다. 첨부파일이 *autorepro-submission*.zip 패턴과 일치하고 초기 신고와 함께 업로드되었는지 확인합니다. 제출물을 늦게 업로드하면 Google에서 신고를 제대로 검토하는 데 지장이 생깁니다.