ข้อมูลนี้มีไว้สำหรับนักพัฒนาของแอปที่มีช่องโหว่ Path Traversal
สิ่งที่จะเกิดขึ้น
ตั้งแต่วันที่ 16 มกราคม 2018 Google Play ได้เริ่มบล็อกการเผยแพร่แอปใหม่ๆ หรือการอัปเดตใดก็ตามที่มีช่องโหว่ Path Traversal โปรดดูประกาศใน Play Console เราอาจนำแอปที่มีช่องโหว่ด้านความปลอดภัยที่ไม่ได้รับการแก้ไขออกจาก Google Play หลังพ้นกำหนดเวลาที่แสดงใน Play Console
สิ่งที่ต้องดำเนินการ
- ลงชื่อเข้าใช้ Play Console และไปที่ส่วนการแจ้งเตือนเพื่อดูแอปที่ได้รับผลกระทบและกำหนดเวลาในการแก้ไขปัญหาเหล่านี้
- อัปเดตแอปที่ได้รับผลกระทบและแก้ไขช่องโหว่
- ส่งเวอร์ชันอัปเดตของแอปที่ได้รับผลกระทบ
แอปของคุณจะได้รับการตรวจสอบอีกครั้งเมื่อมีการส่งใหม่ ขั้นตอนนี้อาจใช้เวลาหลายชั่วโมง หากแอปผ่านการตรวจสอบและเผยแพร่เรียบร้อยแล้ว คุณก็ไม่ต้องดำเนินการใดๆ เพิ่มเติม หากแอปไม่ผ่านการตรวจสอบ จะไม่มีการเผยแพร่แอปเวอร์ชันใหม่และคุณจะได้รับการแจ้งเตือนทางอีเมล
รายละเอียดเพิ่มเติม
การติดตั้งใช้งาน openFile ใน ContentProvider ที่ส่งออกอาจมีช่องโหว่หากไม่สามารถตรวจสอบพารามิเตอร์ Uri ที่ส่งเข้ามาได้อย่างถูกต้อง แอปที่ประสงค์ร้ายจะส่งคลาส Uri ที่มีกลโกง (เช่น คลาสที่มี "/../”) เข้ามาเพื่อหลอกให้แอปของคุณส่ง ParcelFileDescriptor ของไฟล์ที่อยู่นอกไดเรกทอรีที่เป็นเป้าหมายกลับไป ทำให้แอปที่ประสงค์ร้ายนั้นสามารถเข้าถึงไฟล์ใดก็ตามที่แอปของคุณเข้าถึงได้
ในการกำจัดช่องโหว่ Path Traversal ใน ContentProvider ขอแนะนำ 2 กลยุทธ์ด้วยกันดังนี้
1. หากไม่จำเป็นต้องเปิดเผย ContentProvider แก่แอปอื่นๆ ให้ทำดังนี้
- คุณแก้ไขแท็ก <provider> ของ ContentProvider ที่ได้รับผลกระทบในไฟล์ Manifest เพื่อตั้งค่า android:exported=”false” ได้ ซึ่งจะป้องกันไม่ให้แอปอื่นๆ ส่ง Intent ไปยัง ContentProvider ที่ได้รับผลกระทบ
- นอกจากนี้ คุณยังตั้งค่าแอตทริบิวต์ android:permission ให้เป็น permission ที่มี android:protectionLevel=“signature” ได้ เพื่อป้องกันไม่ให้แอปที่สร้างขึ้นโดยนักพัฒนาคนอื่นๆ ส่ง Intent ไปยัง ContentProvider ที่ได้รับผลกระทบ
2. หากจำเป็นต้องเปิดเผย ContentProvider แก่แอปอื่นๆ ให้ทำดังนี้
คุณต้องตรวจสอบอย่างรอบคอบว่าอินพุตของ openFile ที่มีลักษณะของ Path Traversal นั้นจะไม่ทำให้แอปของคุณส่งไฟล์ที่ไม่คาดคิดกลับไป ซึ่งทำได้โดยตรวจสอบเส้นทางตามรูปแบบบัญญัติของไฟล์ ตัวอย่างเช่น
public ParcelFileDescriptor openFile (Uri uri, String mode)
throws FileNotFoundException {
File f = new File(DIR, uri.getLastPathSegment());
if (!f.getCanonicalPath().startsWith(DIR)) {
throw new IllegalArgumentException();
}
return ParcelFileDescriptor.open(f, ParcelFileDescriptor.MODE_READ_ONLY);
}
คำเตือน: โปรดทราบว่าการเรียกใช้ getLastPathSegment ในพารามิเตอร์ Uri นั้นไม่ปลอดภัย แอปที่ประสงค์ร้ายอาจป้อนเส้นทาง Uri ที่มีการเข้ารหัสไว้ เช่น %2F..%2F..path%2Fto%2Fsecret.txt ซึ่งจะทำให้ผลลัพธ์ของ getLastPathSegment เป็น /../../path/to/secret.txt ตัวอย่างเช่น การติดตั้งใช้งานดังต่อไปนี้ยังคงมีช่องโหว่ให้โจมตีได้
public ParcelFileDescriptor openFile(Uri uri, String mode){
File f = new File(DIR, uri.getLastPathSegment());
return ParcelFileDescriptor.open(f, ParcelFileDescriptor.MODE_READ_ONLY);
}
เราพร้อมช่วยเหลือคุณ
หากมีคำถามทางเทคนิคเกี่ยวกับช่องโหว่ คุณโพสต์ถามได้ที่ Stack Overflow และใช้แท็ก “android-security” หากต้องการคำชี้แจงเกี่ยวกับขั้นตอนที่ต้องดำเนินการเพื่อแก้ไขปัญหานี้ โปรดติดต่อทีมสนับสนุนนักพัฒนาซอฟต์แวร์