การแก้ไขช่องโหว่ Intent Redirection

ข้อมูลนี้มีไว้สำหรับนักพัฒนาซอฟต์แวร์ที่มีแอปที่มีช่องโหว่ Intent Redirection

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

แอปของคุณอย่างน้อย 1 แอปมีปัญหา Intent Redirection ซึ่งอาจทำให้แอปที่เป็นอันตรายเข้าถึงคอมโพเนนต์แอปหรือไฟล์ส่วนตัวได้ โปรดอ่านขั้นตอนโดยละเอียดด้านล่างเพื่อแก้ปัญหาที่เกิดขึ้นในแอป เราจะนำแอปที่มีช่องโหว่ด้านความปลอดภัยที่ไม่มีการแก้ไขออกจาก Google Play หลังพ้นกำหนดเวลาที่แสดงใน Play Console

ต้องดำเนินการ​

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

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

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

แอปที่ดึง Intent จากช่องเพิ่มเติมของ Intent ที่ไม่น่าเชื่อถือและเปิดตัวคอมโพเนนต์ด้วยการเรียกใช้ startActivity (หรือ startService ที่คล้ายกัน) บน Intent ที่ดึงข้อมูลมาอาจถูกหลอกให้เปิดตัวคอมโพเนนต์ส่วนตัวที่ไม่ได้ตั้งใจ ซึ่งอาจนำไปสู่ (1) การดำเนินการที่มีความละเอียดอ่อนโดยมีอาร์กิวเมนต์ที่เป็นอันตราย และ/หรือ (2) ถูกขโมยไฟล์ที่มีความละเอียดอ่อนผ่านสิทธิ์ URI ที่ได้รับอนุญาต

เราขอแนะนำให้คุณป้องกันช่องโหว่นี้ด้วยวิธีใดวิธีหนึ่งต่อไปนี้

ตัวเลือกที่ 1: ทำคอมโพเนนต์ของแอปที่ได้รับผลกระทบซึ่งมีการเปลี่ยนเส้นทาง Intent ที่ดึงข้อมูลมาให้เป็นแบบส่วนตัว

หากคอมโพเนนต์ของแอปที่ได้รับผลกระทบไม่จำเป็นต้องรับ Intent จากแอปอื่นๆ คุณทำให้คอมโพเนนต์ของแอปนั้นเป็นแบบส่วนตัวได้โดยการตั้งค่า android:exported=”false” ในไฟล์ Manifest 

ตัวเลือกที่ 2: ตรวจสอบว่า Intent ที่ดึงข้อมูลมานั้นมาจากแหล่งที่เชื่อถือได้

คุณตรวจสอบว่ากิจกรรมที่เรียกใช้งานนั้นเชื่อถือได้โดยใช้เมธอดอย่างเช่น getCallingActivity เช่น 

 // check if the originating Activity is from trusted package
 if (getCallingActivity().getPackageName().equals(“known”)) {
   Intent intent = getIntent();
   // extract the nested Intent
   Intent forward = (Intent) intent.getParcelableExtra(“key”);
   // redirect the nested Intent
   startActivity(forward);
 }

ตัวเลือกที่ 3: ตรวจสอบว่า Intent ที่จะเปลี่ยนเส้นทางนั้นไม่เป็นอันตราย

คุณควรตรวจสอบว่า Intent ที่มีการเปลี่ยนเส้นทางดังกล่าวเป็นไปตามเงื่อนไขต่อไปนี้

  1. จะไม่มีการส่งไปยังคอมโพเนนต์แบบส่วนตัวของแอปใดๆ และ
  2. จะไม่ให้สิทธิ์ URI แก่ผู้ให้บริการเนื้อหาแบบส่วนตัวของแอป

แอปจะตรวจสอบได้ว่าจะใช้คอมโพเนนต์ใดในการจัดการ Intent ก่อนที่จะเปลี่ยนเส้นทางโดยใช้เมธอดอย่างเช่น resolveActivity เช่น

 Intent intent = getIntent();
 // extract the nested Intent
 Intent forward = (Intent) intent.getParcelableExtra(“key”);
 // get the component name
 ComponentName name = forward.resolveActivity(getPackageManager());
 // check that the package name and class name are as intended
 if (name.getPackageName().equals(“safe_package”) &&
     name.getClassName().equals(“safe_class”)) {
   // redirect the nested Intent
   startActivity(forward);
 }

แอปจะตรวจสอบได้ว่าจะให้ Intent ให้สิทธิ์ URI หรือไม่โดยใช้เมธอดอย่างเช่น getFlags เช่น

 // extract the nested Intent
 Intent forward = (Intent) intent.getParcelableExtra(“key”);
 // get the flags
 int flags = forward.getFlags();
 // check that the nested intent does not grant URI permissions
 if ((flags & Intent.FLAG_GRANT_READ_URI_PERMISSION > 0) ||
     (flags & Intent.FLAG_GRANT_WRITE_URI_PERMISSION > 0) {
   // redirect the nested Intent
   startActivity(forward);
 }

เราพร้อมช่วยเหลือคุณ

หากมีคำถามทางเทคนิคเกี่ยวกับช่องโหว่ คุณโพสต์ถามได้ที่ Stack Overflow และใช้แท็ก “android-security” หากต้องการคำชี้แจงเกี่ยวกับขั้นตอนที่ต้องดำเนินการเพื่อแก้ไขปัญหานี้ โปรดติดต่อทีมสนับสนุนนักพัฒนาซอฟต์แวร์

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