ปลั๊กอิน AutoRepro Gradle สร้างขึ้นบนชุดทดสอบของ Android Trade Federation เพื่อทดสอบอุปกรณ์ Android ทั้งหมดสำหรับการทดสอบแพตช์ความปลอดภัยเทียบกับช่องโหว่ในกระดานข่าวความปลอดภัยของ Android การทดสอบเหล่านี้มีไว้สำหรับการแก้ไขที่เชื่อมโยงหรือจะเชื่อมโยงกับ Common Vulnerabilities and Exposures (CVE) โดยเฉพาะ
ปลั๊กอินนี้ช่วยให้พัฒนาการทดสอบ Tradefed นอกซอร์สโค้ด Android โดยใช้ Android Studio หรือ Android SDK มาตรฐานได้ ซึ่งรวมถึงยูทิลิตีทั้งหมด ที่จำเป็นในการสร้างและเรียกใช้การทดสอบ Tradefed
โดยส่วนใหญ่จะใช้เพื่อส่งหลักฐานแนวคิดที่ทำซ้ำได้โดยอัตโนมัติสำหรับโปรแกรมให้รางวัลด้านช่องโหว่ของ Android
สิ่งที่ต้องมีก่อน
วิธีการนี้มีไว้สำหรับพีซี Linux 64 บิต
- Android Studio Ladybug หรือใหม่กว่า - ติดตั้งจากตัวจัดการแพ็กเกจของ Distro ได้ด้วย
- เครื่องมือแพลตฟอร์ม Android SDK
(
adb
,fastboot
) - ต้องติดตั้งและอยู่ใน$PATH
(กล่าวคือ คุณ ควรเรียกใช้adb
จากบรรทัดคำสั่งได้) วิธีที่ง่ายที่สุดในการ ติดตั้งเครื่องมือแพลตฟอร์มคือการใช้โปรแกรมจัดการแพ็กเกจของ Distro- หากใช้ SDK Manager ของ Android Studio แทนเครื่องมือแพลตฟอร์มแบบสแตนด์อโลน
โปรดอย่าลืมเพิ่มไดเรกทอรี
platform-tools
ของ SDK ลงใน$PATH
สำหรับการพัฒนาผ่านบรรทัดคำสั่ง
- หากใช้ SDK Manager ของ Android Studio แทนเครื่องมือแพลตฟอร์มแบบสแตนด์อโลน
โปรดอย่าลืมเพิ่มไดเรกทอรี
- AAPT2 - ติดตั้งได้โดยใช้โปรแกรมจัดการแพ็กเกจของ distro
- Java JDK 21 ขึ้นไป - เข้ากันได้กับ Android SDK และ Gradle
เริ่มต้นใช้งาน Android Studio
หลังจากแตกไฟล์ตัวอย่างหรือเทมเพลตแล้ว ให้เปิดไดเรกทอรีใน Android Studio เป็นโปรเจ็กต์ที่มีอยู่ แล้วรอให้การซิงค์ Gradle เสร็จสมบูรณ์ มี การกำหนดค่าการเรียกใช้ Android Studio ที่กำหนดค่าไว้ล่วงหน้าหลายรายการ
งาน Gradle
assembleSubmissionSources
- รวบรวมไฟล์ต้นฉบับสำหรับการส่ง zipassembleSubmissionZip
- รวบรวมไฟล์ ZIP ที่ส่งเพื่ออัปโหลดcopyInvocationResultsToSubmission
- คัดลอกผลลัพธ์จากการเรียกใช้ Tradefed ครั้งก่อนหน้า ลงในไดเรกทอรีแหล่งที่มาของการส่ง AutoRepro เพื่อ ช่วยในกระบวนการตรวจสอบ โปรดทราบว่าไฟล์นี้มีบันทึกจากทั้งโฮสต์และอุปกรณ์ โปรดตรวจสอบเนื้อหาก่อนหรือหลังจากเรียกใช้
การเรียกใช้ AutoRepro ในการกำหนดค่าการเรียกใช้ Android Studio
autorepro_nonroot_arm64
autorepro_nonroot_x86_64
autorepro_root_arm64
autorepro_root_x86_64
การกำหนดค่า Launcher อยู่ในรูปแบบ
autorepro_{device_root}_{device_arch}
โดยทั่วไปแล้ว เราขอแนะนำให้ใช้
ที่ไม่ใช่รูทเนื่องจากช่องโหว่ที่ต้องใช้รูทมีความรุนแรงน้อยกว่า อย่างไรก็ตาม การใช้
รูทเพื่อทำการตั้งค่าหรือล้างข้อมูลอาจเป็นที่ยอมรับได้ตราบใดที่มีการ
บันทึกไว้อย่างชัดเจนและเป็นที่ยอมรับโดยทั่วไปว่าเป็นสถานะที่ไม่ใช่รูทที่ถูกต้อง เช่น คุณสามารถใช้รูทเพื่อจำลองการส่งข้อความไปยังอุปกรณ์เพื่อหลีกเลี่ยงการต้องใช้อุปกรณ์เครื่องที่ 2 และซิมการ์ดหลายอัน
ซึ่งจะเปิดใช้ Tradefed สำหรับการทดสอบ Tradefed จะรอให้อุปกรณ์ที่ถูกต้องเชื่อมต่อ ดังนั้นโปรดตรวจสอบว่าได้เชื่อมต่ออุปกรณ์และให้สิทธิ์การแก้ไขข้อบกพร่องของ ADB แล้ว
เขียนการทดสอบ AutoRepro
การทดสอบ AutoRepro มี 3 ส่วนและมีปลั๊กอิน Gradle ที่เกี่ยวข้อง 3 รายการ ดังนี้
- ปลั๊กอิน Gradle
id("com.android.security.autorepro.javahosttest")
การทดสอบ Tradefed ด้านโฮสต์เดียว ที่โต้ตอบกับอุปกรณ์ผ่าน ADB ตัวอย่าง ใช้ในไดเรกทอรีsubmission/hostTest/
- ปลั๊กอิน Gradle
id("com.android.security.autorepro.apptest")
APK ของแอปหรือบริการที่ติดตั้งลงในอุปกรณ์ผ่านadb install
และ เปิดโดยการทดสอบฝั่งโฮสต์ แอปหรือบริการยังอาจมีชุดการยืนยัน JUnit ของตัวเองซึ่งจะรายงานไปยังโปรแกรมเรียกใช้ฝั่งโฮสต์ด้วย ตัวอย่างใช้ในsubmission/appTest/
และไดเรกทอรี - ปลั๊กอิน Gradle
id("com.android.security.autorepro.ndktest")
การโจมตีแบบ Proof-of-Concept ที่อิงตาม NDK ซึ่งไม่บังคับ ซึ่งจะพุชไปยังอุปกรณ์ผ่านadb push
และดำเนินการโดยการทดสอบฝั่งโฮสต์ ตัวอย่างนี้ใช้ในไดเรกทอรีsubmission/ndkTest/
โดยปกติแล้วโฟลว์การทดสอบ AutoRepro มักจะเป็นไปตามรูปแบบใดรูปแบบหนึ่งใน 2 รูปแบบต่อไปนี้
แอปทดสอบแบบมีเครื่องควบคุม:
- การทดสอบฝั่งโฮสต์จะพุช APK ที่ประกอบด้วยแอปหรือ บริการที่ใช้เครื่องมือไปยังอุปกรณ์
- การทดสอบฝั่งโฮสต์จะเริ่มการทดสอบ JUnit ฝั่งอุปกรณ์ที่รวมอยู่ใน
APK ผ่าน
runDeviceTest()
- การทดสอบ JUnit ฝั่งอุปกรณ์จะแตะปุ่มและดูแอปโดยใช้ UIAutomator หรือเข้าถึง Android API ในลักษณะที่เผยให้เห็น ช่องโหว่ด้านความปลอดภัย
- ระบบจะส่งคืนความสำเร็จหรือความล้มเหลวของการทดสอบ JUnit ฝั่งอุปกรณ์ไปยังการทดสอบฝั่งโฮสต์ ซึ่งสามารถใช้เพื่อพิจารณาว่าการทดสอบผ่านหรือไม่ ข้อความแสดงความล้มเหลวควรมีข้อมูลโดยละเอียดเกี่ยวกับสาเหตุที่ การยืนยันล้มเหลว รวมถึงออบเจ็กต์ ค่า ข้อยกเว้น สแต็กเทรซ หรืออาร์ติแฟกต์อื่นๆ ที่เฉพาะเจาะจงเป็นหลักฐานแสดงช่องโหว่
การพิสูจน์แนวคิด NDK:
- การทดสอบฝั่งโฮสต์จะพุชและเปิดใช้ไฟล์ที่ดำเนินการได้ของ Linux บนอุปกรณ์
- โปรแกรมเนทีฟขัดข้องหรือแสดงรหัสออกที่เฉพาะเจาะจง
- การทดสอบฝั่งโฮสต์จะตรวจสอบข้อขัดข้อง ดูการย้อนรอยของ Logcat หรือ มองหารหัสออกที่เฉพาะเจาะจงเพื่อพิจารณาว่าการโจมตี สําเร็จหรือไม่ ข้อความแจ้งว่าไม่สำเร็จควรมีข้อมูลโดยละเอียดเกี่ยวกับ สาเหตุที่ยืนยันไม่สำเร็จ รวมถึงโครงสร้าง ค่า สแต็กเทรซ หรืออาร์ติแฟกต์อื่นๆ ที่เฉพาะเจาะจงเพื่อเป็นหลักฐานของช่องโหว่
นอกจากนี้ คุณยังใช้รูปแบบทั้ง 2 แบบร่วมกันได้ด้วย (เช่น การเรียกใช้โปรแกรมเนทีฟร่วมกับการทดสอบฝั่งอุปกรณ์) นอกจากนี้ยังมีเฟรมเวิร์กการวัดผลอื่นๆ เช่น frida-inject
โปรดดูรายละเอียดที่
เอกสารอ้างอิงของชุดเครื่องมือทดสอบความปลอดภัยและ
เอกสารอ้างอิงของ Tradefed
การโจมตีแบบ Proof-of-Concept ของฉันไม่จำเป็นต้องมีแอปทดสอบหรือไฟล์ที่เรียกใช้งานได้แบบเนทีฟ
การทดสอบส่วนใหญ่ไม่จำเป็นต้องมีทั้งแอปฝั่งอุปกรณ์และไฟล์ที่เรียกใช้งานได้แบบเนทีฟ
หากการทดสอบไม่ได้เกี่ยวข้องกับการใช้ฟีเจอร์ ให้ลบไดเรกทอรีย่อย gradle ที่ไม่จำเป็นออก
การโจมตีแบบ Proof-of-Concept ของฉันเกี่ยวข้องกับแอป/บริการที่ 2
เพิ่มโปรเจ็กต์ย่อยของ Gradle ที่มีปลั๊กอิน AutoRepro ได้มากเท่าที่ต้องการ
ส่งการทดสอบ AutoRepro
หากต้องการรวมผลการทดสอบจากอุปกรณ์เป็นส่วนหนึ่งของการส่ง ให้ทำดังนี้
- หรือจะเรียกใช้ทาสก์ Gradle
clean
เพื่อลบการทดสอบเก่าก็ได้ - เรียกใช้การกำหนดค่าการเรียกใช้ AutoRepro ที่เหมาะสมเพื่อเรียกใช้ Tradefed สำหรับ การทดสอบของคุณ และรวบรวมบันทึกและผลลัพธ์
- เรียกใช้
copyInvocationResultsToSubmission
เพื่อคัดลอกบันทึกและ ผลลัพธ์ไปยังไดเรกทอรีแหล่งที่มาของการส่ง
เรียกใช้ assembleSubmissionZip
เพื่อสร้างไฟล์
submission/build/autorepro-submission.zip
อัปโหลดไฟล์ดังกล่าวพร้อมกับ
การส่งของคุณไปยังโปรแกรมสะสมคะแนนสำหรับช่องโหว่ของ Android ตรวจสอบว่าไฟล์แนบตรงกับรูปแบบ *autorepro-submission*.zip
และอัปโหลดพร้อมกับรายงานเริ่มต้น การอัปโหลดข้อมูลที่ส่งล่าช้าจะส่งผลต่อความสามารถของเราในการตรวจสอบรายงานของคุณอย่างเหมาะสม