ปลั๊กอิน AutoRepro Gradle สร้างขึ้นจากแพลตฟอร์มทดสอบของ Android Trade Federation เพื่อทดสอบอุปกรณ์ Android ทั้งหมดสำหรับการทดสอบแพตช์ความปลอดภัยเพื่อหาช่องโหว่ในกระดานข่าวสารด้านความปลอดภัยของ Android การทดสอบเหล่านี้มีไว้สำหรับข้อแก้ไขที่เชื่อมโยงหรือจะเชื่อมโยงกับ Common Vulnerabilities and Exposures (CVE) โดยเฉพาะ
ปลั๊กอินนี้ช่วยให้พัฒนาการทดสอบ Tradefed นอกซอร์สโค้ด Android ได้โดยใช้ Android Studio หรือ Android SDK มาตรฐาน ซึ่งรวมถึงยูทิลิตีทั้งหมดที่จําเป็นในการสร้างและเรียกใช้การทดสอบ Tradefed
โดยหลักๆ แล้วจะใช้เพื่อส่งการพิสูจน์แนวคิดที่ทําซ้ำได้อัตโนมัติสําหรับโปรแกรมรางวัลสำหรับช่องโหว่ของ Android
สิ่งที่ต้องมีก่อน
วิธีการมีไว้สำหรับ PC ที่ใช้ Linux 64 บิต
- Android Studio Ladybug ขึ้นไป - ติดตั้งได้จากเครื่องมือจัดการแพ็กเกจของดิสโทรด้วย
- เครื่องมือแพลตฟอร์ม Android SDK (
adb
,fastboot
) - ต้องติดตั้งและอยู่ใน$PATH
(กล่าวคือ คุณควรเรียกใช้adb
จากบรรทัดคำสั่งได้) วิธีที่ง่ายที่สุดในการติดตั้งเครื่องมือแพลตฟอร์มคือการใช้เครื่องมือจัดการแพ็กเกจของดิสโทร- หากใช้เครื่องมือจัดการ SDK ของ Android Studio แทนเครื่องมือแพลตฟอร์มแบบสแตนด์อโลน อย่าลืมเพิ่มไดเรกทอรี
platform-tools
ของ SDK ลงใน$PATH
ของคุณสำหรับการพัฒนาแบบบรรทัดคำสั่ง
- หากใช้เครื่องมือจัดการ SDK ของ Android Studio แทนเครื่องมือแพลตฟอร์มแบบสแตนด์อโลน อย่าลืมเพิ่มไดเรกทอรี
- AAPT2 - ติดตั้งโดยใช้โปรแกรมจัดการแพ็กเกจของดิสโทรได้เช่นกัน
- Java JDK 21 ขึ้นไป - เข้ากันได้กับ Android SDK และ Gradle
เริ่มต้นใช้งาน Android Studio
หลังจากแตกไฟล์ตัวอย่างหรือเทมเพลตแล้ว ให้เปิดไดเรกทอรีใน Android Studio เป็นโปรเจ็กต์ที่มีอยู่ แล้วรอให้ Gradle ซิงค์เสร็จสมบูรณ์ การกำหนดค่าการเรียกใช้ Android Studio ที่กําหนดค่าไว้ล่วงหน้ามีอยู่หลายรายการ
งาน Gradle
assembleSubmissionSources
- รวบรวมไฟล์ต้นฉบับสำหรับไฟล์ ZIP ที่ส่งassembleSubmissionZip
- รวบรวมไฟล์ 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}
โดยทั่วไปแล้ว เราขอแนะนำให้ใช้ตัวเลือกที่ไม่ใช่รูทเนื่องจากช่องโหว่ที่ต้องใช้รูทมีความรุนแรงน้อยกว่า อย่างไรก็ตาม การใช้สิทธิ์ระดับรูทในการตั้งค่าหรือล้างข้อมูลอาจยอมรับได้ ตราบใดที่มีการบันทึกไว้อย่างชัดเจนและเป็นที่ยอมรับโดยทั่วไปว่าเป็นสถานะที่ไม่ใช้สิทธิ์ระดับรูทที่ถูกต้อง เช่น อนุญาตให้ใช้สิทธิ์รูทเพื่อส่ง SMS ปลอมไปยังอุปกรณ์เพื่อหลีกเลี่ยงการใช้อุปกรณ์เครื่องที่ 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")
การโจมตีเพื่อพิสูจน์แนวคิดที่ใช้ NDK ซึ่งไม่บังคับ ซึ่งระบบจะพุชไปยังอุปกรณ์ผ่านadb push
และดำเนินการโดยทดสอบฝั่งโฮสต์ ตัวอย่างนี้ใช้ไดเรกทอรีsubmission/ndkTest/
โดยทั่วไปแล้ว ขั้นตอนการทดสอบ AutoRepro จะเป็นไปตามรูปแบบใดรูปแบบหนึ่งต่อไปนี้
แอปทดสอบที่มีเครื่องควบคุม
- การทดสอบฝั่งโฮสต์จะพุช APK ที่ประกอบด้วยแอปหรือบริการที่มีเครื่องมือวัดไปยังอุปกรณ์
- การทดสอบฝั่งโฮสต์จะเริ่มต้นการทดสอบ JUnit ฝั่งอุปกรณ์ที่รวมอยู่ใน APK ผ่าน
runDeviceTest()
- การทดสอบ JUnit ฝั่งอุปกรณ์จะแตะปุ่มและดูแอปโดยใช้ UIAutomator หรือเข้าถึง Android API ในลักษณะที่เปิดเผยช่องโหว่ด้านความปลอดภัย
- ระบบจะแสดงผลลัพธ์ของการทดสอบ JUnit ฝั่งอุปกรณ์ไปยังการทดสอบฝั่งโฮสต์ ซึ่งสามารถใช้เพื่อระบุว่าการทดสอบผ่านหรือไม่ ข้อความแสดงข้อผิดพลาดควรมีรายละเอียดเกี่ยวกับสาเหตุที่การยืนยันไม่สำเร็จ รวมถึงออบเจ็กต์ ค่า ข้อยกเว้น สแต็กเทรซ หรืออาร์ติแฟกต์อื่นๆ ที่เฉพาะเจาะจงเพื่อเป็นหลักฐานแสดงช่องโหว่
การพิสูจน์แนวคิด NDK
- การทดสอบฝั่งโฮสต์จะพุชและเปิดใช้งานไฟล์ปฏิบัติการ Linux ในอุปกรณ์
- โปรแกรมเนทีฟขัดข้องหรือแสดงรหัสออกที่เฉพาะเจาะจง
- การทดสอบฝั่งโฮสต์จะตรวจหาข้อขัดข้อง ดูการย้อนกลับของ Logcat หรือมองหารหัสออกที่เฉพาะเจาะจงเพื่อระบุว่าการโจมตีสำเร็จหรือไม่ ข้อความแสดงข้อผิดพลาดควรมีรายละเอียดเกี่ยวกับสาเหตุที่การยืนยันไม่สําเร็จ รวมถึงโครงสร้าง ค่า สแต็กเทรซ หรืออาร์ติแฟกต์อื่นๆ ที่เฉพาะเจาะจงเพื่อเป็นหลักฐานแสดงช่องโหว่
นอกจากนี้ คุณยังใช้ทั้ง 2 รูปแบบร่วมกันได้ (เช่น การเรียกใช้โปรแกรมเนทีฟร่วมกับการทดสอบฝั่งอุปกรณ์) นอกจากนี้ คุณยังใช้เฟรมเวิร์กเครื่องมือวัดอื่นๆ เช่น frida-inject
ได้ด้วย โปรดดูรายละเอียดที่หัวข้อเอกสารอ้างอิงชุดทดสอบความปลอดภัยและหัวข้อเอกสารอ้างอิง Tradefed
การโจมตีเพื่อพิสูจน์แนวคิดของฉันไม่จำเป็นต้องใช้แอปทดสอบหรือไฟล์ปฏิบัติการแบบเนทีฟ
การทดสอบส่วนใหญ่ไม่จําเป็นต้องใช้ทั้งแอปฝั่งอุปกรณ์และไฟล์ปฏิบัติการแบบเนทีฟ
หากการทดสอบไม่ได้เกี่ยวข้องกับการใช้ฟีเจอร์ ให้ลบไดเรกทอรีโปรเจ็กต์ย่อย gradle ที่ไม่จำเป็น
การโจมตีเพื่อพิสูจน์แนวคิดของฉันเกี่ยวข้องกับแอป/บริการที่ 2
เพิ่มโปรเจ็กต์ย่อย Gradle ที่มีปลั๊กอิน AutoRepro ได้มากเท่าที่ต้องการ
ส่งการทดสอบ AutoRepro
วิธีรวมผลการทดสอบจากอุปกรณ์ของคุณเป็นส่วนหนึ่งของข้อมูลที่ส่ง
- (ไม่บังคับ) เรียกใช้งาน Gradle
clean
เพื่อลบการทดสอบเก่า - เรียกใช้การกําหนดค่าการเรียกใช้ AutoRepro ที่เหมาะสมเพื่อเรียกใช้ Tradefed สําหรับการทดสอบ และรวบรวมบันทึกและผลลัพธ์
- เรียกใช้งาน
copyInvocationResultsToSubmission
เพื่อคัดลอกบันทึกและผลลัพธ์ไปยังไดเรกทอรีแหล่งที่มาของข้อมูลที่ส่ง
เรียกใช้ assembleSubmissionZip
เพื่อสร้างไฟล์ submission/build/autorepro-submission.zip
อัปโหลดไฟล์ดังกล่าวพร้อมกับข้อมูลที่ส่งไปยังโปรแกรมสะสมคะแนนสำหรับช่องโหว่ของ Android ตรวจสอบว่าไฟล์แนบตรงกับรูปแบบ *autorepro-submission*.zip
และอัปโหลดพร้อมกับรายงานฉบับแรก การอัปโหลดข้อมูลล่าช้าจะส่งผลต่อความสามารถในการตรวจสอบรายงานของคุณอย่างเหมาะสม