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

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

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

ผลกระทบ

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

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

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

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

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

การดำเนินการเครือข่ายระดับต่ำของแอป ต้องมีสิทธิ์เข้าถึงเครือข่ายภายใน
สร้างการเชื่อมต่อ TCP ขาออก ใช่
การยอมรับการเชื่อมต่อ TCP ขาเข้า ใช่
การส่ง UDP แบบ Unicast, Multicast, Broadcast ใช่
รับการรับส่งข้อมูล 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. รีบูตอุปกรณ์

ตอนนี้สิทธิ์เข้าถึงเครือข่ายภายในของแอปถูกจำกัดแล้ว และการพยายามเข้าถึงเครือข่ายภายในจะทำให้เกิดข้อผิดพลาดเกี่ยวกับซ็อกเก็ต หากคุณใช้ 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>

ข้อผิดพลาด

หากคำขอเข้าถึงเครือข่าย LAN ไม่สำเร็จเนื่องจากไม่มีสิทธิ์ ให้ทำดังนี้

  • โดยปกติแล้ว การเชื่อมต่อ TCP จะทำให้เกิดข้อผิดพลาดหมดเวลา
  • โดยปกติแล้ว ข้อผิดพลาด UDP และการปฏิเสธสิทธิ์ทั่วไปจะส่งผลให้เกิดรหัสข้อผิดพลาด EPERM

ข้อบกพร่อง

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

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

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

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