ช่องโหว่ Path Traversal

ข้อมูลนี้มีไว้สำหรับนักพัฒนาของแอปที่มีช่องโหว่ Path Traversal

สิ่งที่จะเกิดขึ้น

ตั้งแต่วันที่ 16 มกราคม 2018 Google Play ได้เริ่มบล็อกการเผยแพร่แอปใหม่ๆ หรือการอัปเดตใดก็ตามที่มีช่องโหว่ Path Traversal โปรดดูประกาศใน Play Console เราอาจนำแอปที่มีช่องโหว่ด้านความปลอดภัยที่ไม่ได้รับการแก้ไขออกจาก Google Play หลังพ้นกำหนดเวลาที่แสดงใน Play Console

สิ่งที่ต้องดำเนินการ​

  1. ลงชื่อเข้าใช้ Play Console และไปที่ส่วนการแจ้งเตือนเพื่อดูแอปที่ได้รับผลกระทบและกำหนดเวลาในการแก้ไขปัญหาเหล่านี้
  2. อัปเดตแอปที่ได้รับผลกระทบและแก้ไขช่องโหว่
  3. ส่งเวอร์ชันอัปเดตของแอปที่ได้รับผลกระทบ

แอปของคุณจะได้รับการตรวจสอบอีกครั้งเมื่อมีการส่งใหม่ ขั้นตอนนี้อาจใช้เวลาหลายชั่วโมง หากแอปผ่านการตรวจสอบและเผยแพร่เรียบร้อยแล้ว คุณก็ไม่ต้องดำเนินการใดๆ เพิ่มเติม หากแอปไม่ผ่านการตรวจสอบ จะไม่มีการเผยแพร่แอปเวอร์ชันใหม่และคุณจะได้รับการแจ้งเตือนทางอีเมล

รายละเอียดเพิ่มเติม

การติดตั้งใช้งาน 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” หากต้องการคำชี้แจงเกี่ยวกับขั้นตอนที่ต้องดำเนินการเพื่อแก้ไขปัญหานี้ โปรดติดต่อทีมสนับสนุนนักพัฒนาซอฟต์แวร์

ข้อมูลนี้มีประโยชน์ไหม
เราจะปรับปรุงได้อย่างไร