Android Security AutoRepro

Trình bổ trợ Gradle AutoRepro được xây dựng dựa trên bộ kiểm thử Android Trade Federation để kiểm thử tất cả thiết bị Android cho các bản vá bảo mật chống lại các lỗ hổng trong Bản tin bảo mật Android. Các kiểm thử này chỉ dành cho các bản sửa lỗi được liên kết hoặc sẽ được liên kết với một Lỗ hổng và vấn đề rò rỉ phổ biến (CVE).

Trình bổ trợ này cho phép phát triển các kiểm thử Tradefed bên ngoài cây nguồn Android bằng Android Studio hoặc SDK Android tiêu chuẩn. Trong đó có tất cả các tiện ích cần thiết để tạo và chạy kiểm thử Tradefed.

Công cụ này chủ yếu dùng để gửi bằng chứng về khái niệm có thể tái tạo tự động cho Chương trình phần thưởng về lỗ hổng bảo mật trên Android.

Tải ví dụ về AutoRepro xuống

Điều kiện tiên quyết

Chúng tôi cung cấp hướng dẫn dành cho máy tính Linux 64 bit.

  • Android Studio Ladybug trở lên – Cũng có thể cài đặt từ trình quản lý gói của bản phân phối.
  • Công cụ nền tảng SDK Android (adb, fastboot) – Cần được cài đặt và nằm trong $PATH (Tức là bạn có thể chạy adb từ dòng lệnh). Cách dễ nhất để cài đặt các công cụ nền tảng là sử dụng trình quản lý gói của bản phân phối.
    • Nếu sử dụng trình quản lý SDK của Android Studio thay vì các công cụ nền tảng độc lập, hãy nhớ thêm thư mục platform-tools của SDK vào $PATH để phát triển dòng lệnh.
  • AAPT2. – Cũng có thể cài đặt bằng trình quản lý gói của bản phân phối.
  • Java JDK 21 trở lên – tương thích với SDK Android và Gradle.

Bắt đầu sử dụng Android Studio

Sau khi trích xuất ví dụ hoặc mẫu, hãy mở thư mục trong Android Studio dưới dạng một dự án hiện có và chờ quá trình đồng bộ hoá Gradle hoàn tất. Có một số cấu hình chạy Android Studio được định cấu hình sẵn.

Tác vụ Gradle:

  • assembleSubmissionSources – Tập hợp các tệp nguồn để gửi tệp zip.
  • assembleSubmissionZip – Tập hợp tệp zip gửi để tải lên.
  • copyInvocationResultsToSubmission – Sao chép kết quả từ các lệnh gọi Tradefed trước đó vào thư mục nguồn gửi AutoRepro để hỗ trợ quy trình xem xét. Xin lưu ý rằng tệp này chứa nhật ký của cả máy chủ và thiết bị; hãy xem lại nội dung trước hoặc sau khi chạy tệp này.

Cấu hình chạy Android Studio của lệnh gọi AutoRepro:

  • autorepro_nonroot_arm64
  • autorepro_nonroot_x86_64
  • autorepro_root_arm64
  • autorepro_root_x86_64

Cấu hình trình chạy có dạng autorepro_{device_root}_{device_arch}. Bạn nên sử dụng chế độ không có quyền truy cập thư mục gốc vì các lỗ hổng yêu cầu quyền truy cập thư mục gốc ít nghiêm trọng hơn. Tuy nhiên, bạn có thể chấp nhận việc sử dụng quyền truy cập gốc để thiết lập hoặc dọn dẹp, miễn là bạn ghi lại rõ ràng và thường chấp nhận quyền truy cập gốc là trạng thái hợp lệ không phải quyền truy cập gốc. Ví dụ: bạn có thể sử dụng quyền truy cập thư mục gốc để giả mạo việc gửi tin nhắn văn bản đến thiết bị nhằm tránh yêu cầu thiết bị thứ hai và nhiều thẻ SIM.

Các lệnh này sẽ khởi chạy Tradefed cho kiểm thử của bạn. Tradefed sẽ chờ một thiết bị hợp lệ được kết nối, vì vậy, hãy đảm bảo rằng một thiết bị được kết nối và tính năng gỡ lỗi ADB được uỷ quyền.

Viết mã kiểm thử AutoRepro

Kiểm thử AutoRepro có 3 phần và 3 trình bổ trợ Gradle tương ứng:

  1. Trình bổ trợ Gradle id("com.android.security.autorepro.javahosttest") Một kiểm thử Tradefed phía máy chủ tương tác với thiết bị thông qua ADB. Ví dụ này sử dụng thư mục này trong thư mục submission/hostTest/.
  2. Trình bổ trợ Gradle id("com.android.security.autorepro.apptest") Một ứng dụng hoặc APK dịch vụ được cài đặt trên thiết bị thông qua adb install và được chạy bằng kiểm thử phía máy chủ. Ứng dụng hoặc dịch vụ cũng có thể chứa một tập hợp các câu nhận định JUnit riêng được báo cáo cho trình chạy phía máy chủ. Ví dụ này sử dụng thư mục và submission/appTest/.
  3. Trình bổ trợ Gradle id("com.android.security.autorepro.ndktest") Một cuộc tấn công chứng minh khái niệm dựa trên NDK (không bắt buộc) được đẩy vào thiết bị thông qua adb push và được thực thi bằng kiểm thử phía máy chủ. Ví dụ này sử dụng tệp này trong thư mục submission/ndkTest/.

Quy trình kiểm thử AutoRepro điển hình thường tuân theo một trong hai mẫu:

  • Ứng dụng kiểm thử đo lường:

    1. Kiểm thử phía máy chủ đẩy một tệp APK bao gồm một ứng dụng hoặc dịch vụ được đo lường vào thiết bị.
    2. Kiểm thử phía máy chủ sẽ bắt đầu các kiểm thử JUnit phía thiết bị được đóng gói với APK thông qua runDeviceTest().
    3. Kiểm thử JUnit phía thiết bị nhấn vào các nút và theo dõi ứng dụng bằng UIAutomator hoặc truy cập vào các API Android theo cách cho thấy các lỗ hổng bảo mật.
    4. Kết quả thành công hoặc không thành công của các chương trình kiểm thử JUnit phía thiết bị sẽ được trả về cho chương trình kiểm thử phía máy chủ. Kết quả này có thể được dùng để xác định xem chương trình kiểm thử có đạt hay không. Thông báo lỗi phải chứa thông tin chi tiết về lý do xác nhận không thành công và mọi đối tượng, giá trị, ngoại lệ, dấu vết ngăn xếp hoặc cấu phần phần mềm khác cụ thể làm bằng chứng về lỗ hổng bảo mật.
  • Bằng chứng về khái niệm NDK:

    1. Kiểm thử phía máy chủ đẩy và chạy một tệp thực thi Linux trên thiết bị.
    2. Chương trình gốc gặp sự cố hoặc trả về một mã thoát cụ thể.
    3. Kiểm thử phía máy chủ sẽ kiểm tra sự cố, xem dấu vết lui logcat hoặc tìm mã thoát cụ thể để xác định xem cuộc tấn công có thành công hay không. Thông báo lỗi phải chứa thông tin chi tiết về lý do xác nhận không thành công và mọi cấu trúc, giá trị, dấu vết ngăn xếp hoặc cấu phần phần mềm cụ thể khác làm bằng chứng về lỗ hổng bảo mật.

Bạn cũng có thể kết hợp hai mẫu này (ví dụ: chạy một chương trình gốc cùng với các kiểm thử phía thiết bị). Một số khung đo lường khác, chẳng hạn như frida-inject, cũng có sẵn. Để biết thông tin chi tiết, hãy xem tài liệu tham khảo về Bộ kiểm thử bảo mậttài liệu tham khảo về Tradefed.

Cuộc tấn công chứng minh khái niệm của tôi không cần ứng dụng kiểm thử hoặc tệp thực thi gốc

Hầu hết các bài kiểm thử sẽ không cần cả ứng dụng phía thiết bị và tệp thực thi gốc.

Nếu kiểm thử của bạn không liên quan đến việc sử dụng một tính năng, hãy xoá các thư mục dự án phụ gradle không cần thiết.

Cuộc tấn công minh hoạ của tôi liên quan đến một ứng dụng/dịch vụ thứ hai

Thêm bao nhiêu dự án phụ Gradle có trình bổ trợ AutoRepro tuỳ ý.

Gửi kiểm thử AutoRepro

Cách thêm kết quả kiểm thử từ thiết bị của bạn vào nội dung gửi:

  • Bạn có thể chạy tác vụ clean của Gradle để xoá mọi lần chạy kiểm thử cũ.
  • Chạy cấu hình chạy AutoRepro thích hợp để gọi Tradefed cho kiểm thử và thu thập nhật ký cũng như kết quả.
  • Chạy tác vụ copyInvocationResultsToSubmission để sao chép nhật ký và kết quả vào thư mục nguồn gửi.

Chạy assembleSubmissionZip để tạo tệp submission/build/autorepro-submission.zip. Tải tệp đó lên cùng với nội dung bạn gửi đến Chương trình phần thưởng phát hiện lỗ hổng bảo mật trên Android. Đảm bảo rằng tệp đính kèm khớp với mẫu *autorepro-submission*.zip và được tải lên cùng với báo cáo ban đầu. Việc tải tệp gửi lên muộn sẽ ảnh hưởng đến khả năng chúng tôi xem xét báo cáo của bạn một cách chính xác.