สิทธิ์เข้าถึงเครือข่ายภายใน

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

โปรเจ็กต์การป้องกันเครือข่าย LAN มีเป้าหมายเพื่อปกป้องความเป็นส่วนตัวของผู้ใช้โดย จำกัดการเข้าถึงเครือข่าย LAN ไว้เบื้องหลังสิทธิ์รันไทม์ใหม่

ผลกระทบ

ใน Android 16 สิทธิ์นี้จะเป็นฟีเจอร์แบบเลือกใช้ ซึ่งหมายความว่าจะมีเพียง แอปที่เลือกใช้เท่านั้นที่จะได้รับผลกระทบ เป้าหมายของการเลือกใช้คือการช่วยให้นักพัฒนาแอป เข้าใจว่าส่วนใดของแอปที่ต้องอาศัยการเข้าถึงเครือข่าย LAN แบบไม่เจาะจงปลายทาง เพื่อเตรียมพร้อมที่จะใช้การป้องกันสิทธิ์ใน Android รุ่นต่อๆ ไป

แอปจะได้รับผลกระทบหากเข้าถึงเครือข่าย LAN ของผู้ใช้โดยใช้สิ่งต่อไปนี้

  • การใช้ซ็อกเก็ตดิบโดยตรงหรือในไลบรารีในที่อยู่เครือข่ายภายใน เช่น Multicast DNS (mDNS) หรือ Simple Service Discovery Protocol (SSDP)
  • การใช้คลาสระดับเฟรมเวิร์กที่เข้าถึงเครือข่ายภายใน เช่น NsdManager

รายละเอียดผลกระทบ

การรับส่งข้อมูลไปยังและจากที่อยู่เครือข่ายภายในต้องมีสิทธิ์เข้าถึงเครือข่ายภายใน ตารางต่อไปนี้แสดงกรณีที่พบบ่อย

การดำเนินการเครือข่ายระดับต่ำของแอป ต้องมีสิทธิ์เข้าถึงเครือข่ายภายใน
สร้างการเชื่อมต่อ TCP ขาออก ใช่
การยอมรับการเชื่อมต่อ TCP ขาเข้า ใช่
การส่ง Unicast, Multicast, Broadcast แบบ UDP ใช่
รับการรับส่งข้อมูล UDP แบบ Unicast, Multicast, Broadcast ที่เข้ามา ใช่

ข้อจำกัดเหล่านี้ได้รับการติดตั้งใช้งานในส่วนลึกของสแต็กเครือข่าย จึงมีผลกับAPI เครือข่ายทั้งหมด ซึ่งรวมถึงซ็อกเก็ตที่สร้างในแพลตฟอร์ม หรือโค้ดที่มีการจัดการ ไลบรารีเครือข่าย เช่น Cronet และ OkHttp รวมถึง API ใดๆ ที่ใช้บนไลบรารีเหล่านั้น การพยายามแก้ไขบริการในเครือข่ายภายใน ที่มีคำต่อท้ายเป็น .local ต้องใช้สิทธิ์เข้าถึงเครือข่ายภายใน

ข้อยกเว้นสำหรับกฎข้างต้น

  • หากเซิร์ฟเวอร์ DNS ของอุปกรณ์อยู่ในเครือข่ายภายใน การรับส่งข้อมูลไปยัง / จากเซิร์ฟเวอร์ดังกล่าว (ที่พอร์ต 53) ไม่จำเป็นต้องมีสิทธิ์เข้าถึงเครือข่ายภายใน
  • แอปพลิเคชันที่ใช้ Output Switcher เป็นตัวเลือกในแอปจะไม่ต้องมีสิทธิ์เข้าถึงเครือข่ายในพื้นที่ (คำแนะนำเพิ่มเติมจะมาในการเปิดตัวในอนาคต)

คำแนะนำ

หากต้องการเลือกใช้การจำกัดเครือข่ายภายใน ให้ทำดังนี้

  1. แฟลชอุปกรณ์เป็นบิลด์ที่มี Android 16 รุ่นเบต้า 3 ขึ้นไป
  2. ติดตั้งแอปที่จะทดสอบ
  3. สลับการกำหนดค่า Appcompat โดยใช้ adb

    adb shell am compat enable RESTRICT_LOCAL_NETWORK <package_name>
    
  4. รีบูตอุปกรณ์

ตอนนี้สิทธิ์เข้าถึงเครือข่าย LAN ของแอปถูกจำกัดแล้ว และการพยายามเข้าถึงเครือข่าย LAN จะทำให้เกิดข้อผิดพลาดของซ็อกเก็ต หากคุณใช้ API ที่ดำเนินการในเครือข่ายภายในภายนอกกระบวนการของแอป เช่น NsdManager API เหล่านั้นจะไม่ได้รับผลกระทบในระหว่างการเลือกใช้

หากต้องการกู้คืนสิทธิ์เข้าถึง คุณต้องให้สิทธิ์แอปของคุณแก่ NEARBY_WIFI_DEVICES

  • ตรวจสอบว่าแอปประกาศสิทธิ์ NEARBY_WIFI_DEVICES ใน manifest
  • ไปที่การตั้งค่า > แอป > [ชื่อแอปพลิเคชัน] > สิทธิ์ > อุปกรณ์ที่อยู่ใกล้เคียง > อนุญาต

ตอนนี้การเข้าถึงเครือข่าย LAN ของแอปควรได้รับการกู้คืนแล้ว และสถานการณ์ทั้งหมดควรทํางานได้เหมือนก่อนที่จะเลือกใช้แอป การจราจรของข้อมูลในเครือข่ายของแอปจะได้รับผลกระทบดังนี้

สิทธิ์ คำขอ LAN ขาออก คำขออินเทอร์เน็ตขาออก/ขาเข้า คำขอ LAN ขาเข้า
ให้สิทธิ์ Works Works Works
ไม่ให้สิทธิ์ เรื่องหน้าแตก Works เรื่องหน้าแตก

ใช้คำสั่งต่อไปนี้เพื่อเปิด/ปิดการกำหนดค่า Appcompat

adb shell am compat disable RESTRICT_LOCAL_NETWORK <package_name>

ข้อผิดพลาด

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

ตัวอย่างข้อผิดพลาด

sendto failed: EPERM (Operation not permitted)

sendto failed: ECONNABORTED (Operation not permitted)

ข้อบกพร่อง

ส่งข้อบกพร่องและความคิดเห็นสำหรับ

  • ความคลาดเคลื่อนในการเข้าถึง LAN (คุณไม่คิดว่าการเข้าถึงบางอย่างควรได้รับการพิจารณาเป็นการเข้าถึง "เครือข่าย LAN")
  • ข้อบกพร่องที่ควรบล็อกการเข้าถึง LAN แต่ไม่ได้บล็อก
  • ข้อบกพร่องที่ควรอนุญาตให้เข้าถึง LAN แต่กลับถูกบล็อก

รายการต่อไปนี้จะไม่ได้รับผลกระทบจากการเปลี่ยนแปลงนี้

  • การเข้าถึงอินเทอร์เน็ต
  • เครือข่ายมือถือ