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

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

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

ผลกระทบ

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

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

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

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

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

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

ข้อจำกัดเหล่านี้มีผลกับ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 ขาเข้า
ให้สิทธิ์ 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 ไม่ควรถูกบล็อกแต่กลับถูกบล็อก

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

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