แอปใดก็ตามที่มีสิทธิ์ INTERNET
จะเข้าถึงอุปกรณ์ใน LAN ได้
ซึ่งช่วยให้แอปเชื่อมต่อกับอุปกรณ์ภายในเครื่องได้ง่าย แต่ก็มีผลกระทบด้านความเป็นส่วนตัว เช่น การสร้างลายนิ้วมือของผู้ใช้และการเป็นพร็อกซีสําหรับตําแหน่ง
โปรเจ็กต์การป้องกันเครือข่ายภายในมีจุดประสงค์เพื่อปกป้องความเป็นส่วนตัวของผู้ใช้โดยควบคุมการเข้าถึงเครือข่ายภายในผ่านสิทธิ์รันไทม์ใหม่
ผลกระทบ
ใน Android 16 สิทธิ์นี้เป็นฟีเจอร์แบบเลือกใช้ ซึ่งหมายความว่าจะมีเฉพาะแอปที่เลือกใช้เท่านั้นที่ได้รับผลกระทบ เป้าหมายของการเลือกใช้คือเพื่อให้นักพัฒนาแอปเข้าใจว่าส่วนใดของแอปที่อาศัยการเข้าถึงเครือข่ายภายในแบบไม่เจาะจง เพื่อให้เตรียมพร้อมที่จะปกป้องสิทธิ์ในส่วนดังกล่าวใน Android เวอร์ชันในอนาคต
แอปจะได้รับผลกระทบหากเข้าถึงเครือข่ายภายในของผู้ใช้โดยใช้สิ่งต่อไปนี้
- การใช้ซ็อกเก็ตดิบโดยตรงหรือผ่านไลบรารีในที่อยู่เครือข่ายภายใน (เช่น โปรโตคอลการค้นพบบริการ mDNS หรือ SSDP)
- การใช้คลาสระดับเฟรมเวิร์กซึ่งเข้าถึงเครือข่ายภายใน (เช่น NsdManager)
รายละเอียดผลกระทบ
การรับส่งข้อมูลไปยังและจากที่อยู่เครือข่ายภายในต้องมีสิทธิ์เข้าถึงเครือข่ายภายใน ตารางต่อไปนี้แสดงกรณีทั่วไปบางส่วน
การดำเนินการของเครือข่ายระดับต่ำของแอป | ต้องมีสิทธิ์เข้าถึงเครือข่ายภายใน |
---|---|
การสร้างการเชื่อมต่อ TCP ขาออก | ใช่ |
การยอมรับการเชื่อมต่อ TCP ที่เข้ามา | ใช่ |
การส่ง UDP unicast, multicast, broadcast | ใช่ |
การรับ UDP ยูนิแคสต์ มัลติแคสต์ บรอดแคสต์ขาเข้า | ใช่ |
ข้อจำกัดเหล่านี้มีผลกับAPI เครือข่ายทั้งหมดเนื่องจากมีการใช้งานอยู่ในสแต็กเครือข่าย ซึ่งรวมถึงซ็อกเก็ตที่สร้างในแพลตฟอร์มหรือโค้ดที่มีการจัดการ ไลบรารีเครือข่าย เช่น Cronet และ OkHttp และ API ทั้งหมดที่ติดตั้งใช้งานบนแพลตฟอร์มหรือโค้ดที่มีการจัดการ การพยายามแก้ไขบริการในเครือข่ายภายใน (เช่น บริการที่มีนามสกุล .local) จะต้องใช้สิทธิ์เครือข่ายภายใน
ข้อยกเว้นสำหรับกฎข้างต้น
- หากเซิร์ฟเวอร์ DNS ของอุปกรณ์อยู่ในเครือข่ายภายใน การจราจรขาเข้า / ขาออกของเซิร์ฟเวอร์ (ที่พอร์ต 53) จะไม่ต้องใช้สิทธิ์การเข้าถึงเครือข่ายภายใน
- แอปพลิเคชันที่ใช้ Output Switcher เป็นเครื่องมือเลือกในแอปจะไม่ต้องใช้สิทธิ์เครือข่ายภายใน (เราจะให้คำแนะนำเพิ่มเติมในรุ่นที่ออกตามมา)
คำแนะนำ
หากต้องการเลือกใช้ข้อจำกัดของเครือข่ายภายใน ให้ทำดังนี้
- แฟลชอุปกรณ์เป็นบิลด์ที่มี Android 16 เบต้า 3 ขึ้นไป
- ติดตั้งแอปที่จะทดสอบ
สลับการกําหนดค่า Appcompat โดยใช้ adb
adb shell am compat enable RESTRICT_LOCAL_NETWORK <package_name>
รีบูตอุปกรณ์
ตอนนี้การเข้าถึงเครือข่ายภายในของแอปจะถูกจํากัด และการพยายามเข้าถึงเครือข่ายภายในจะทําให้เกิดข้อผิดพลาดเกี่ยวกับซ็อกเก็ต หากคุณใช้ 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 ไม่ควรถูกบล็อกแต่กลับถูกบล็อก
รายการต่อไปนี้จะไม่ได้รับผลกระทบจากการเปลี่ยนแปลงนี้
- การเข้าถึงอินเทอร์เน็ต
- เครือข่ายมือถือ