Mọi ứng dụng có quyền INTERNET đều có thể truy cập vào các thiết bị trên Mạng cục bộ (LAN).
Điều này giúp các ứng dụng dễ dàng kết nối với các thiết bị cục bộ, nhưng cũng có những tác động đến quyền riêng tư, chẳng hạn như tạo dấu vân tay của người dùng và đóng vai trò là một proxy cho vị trí.
Dự án Local Network Protections (Bảo vệ mạng cục bộ) nhằm mục đích bảo vệ quyền riêng tư của người dùng bằng cách hạn chế quyền truy cập vào mạng cục bộ bằng một quyền mới khi chạy.
Tác động
Trong Android 16, quyền này là một tính năng chọn sử dụng, tức là chỉ những ứng dụng chọn sử dụng mới bị ảnh hưởng. Mục tiêu của việc chọn sử dụng là để nhà phát triển ứng dụng hiểu được những phần nào trong ứng dụng của họ phụ thuộc vào quyền truy cập ngầm vào mạng cục bộ, từ đó họ có thể chuẩn bị để bảo vệ những phần đó bằng quyền trong một bản phát hành Android trong tương lai.
Các ứng dụng sẽ bị ảnh hưởng nếu truy cập vào mạng cục bộ của người dùng bằng cách sử dụng:
- Sử dụng trực tiếp hoặc sử dụng thư viện của các socket thô trên địa chỉ mạng cục bộ, ví dụ:
Multicast DNS (mDNS)hoặcSimple Service Discovery Protocol (SSDP). - Sử dụng các lớp cấp khung truy cập vào mạng cục bộ, chẳng hạn như
NsdManager.
Thông tin chi tiết về tác động
Lưu lượng truy cập đến và đi từ một địa chỉ mạng cục bộ cần có quyền truy cập mạng cục bộ. Bảng sau đây liệt kê một số trường hợp phổ biến:
| Hoạt động mạng cấp thấp của ứng dụng | Cần có quyền truy cập vào mạng cục bộ |
|---|---|
| Tạo kết nối TCP đi | có |
| Chấp nhận kết nối TCP đến | có |
| Gửi một gói đơn điểm, đa điểm, truyền tin quảng bá UDP | có |
| Nhận một gói đơn phương, đa phương, quảng bá UDP đến | có |
Những hạn chế này được triển khai sâu trong ngăn xếp mạng, do đó, chúng áp dụng cho tất cả các API mạng. Điều này bao gồm các ổ cắm được tạo trong nền tảng hoặc mã được quản lý, các thư viện mạng như Cronet và OkHttp, cũng như mọi API được triển khai trên các thư viện đó. Để cố gắng phân giải các dịch vụ trên mạng cục bộ có hậu tố .local, bạn cần có quyền truy cập vào mạng cục bộ.
Các trường hợp ngoại lệ đối với các quy tắc nêu trên:
- Nếu máy chủ DNS của một thiết bị nằm trên mạng cục bộ, thì lưu lượng truy cập đến / từ máy chủ đó (ở cổng 53) không yêu cầu quyền truy cập vào mạng cục bộ.
- Những ứng dụng sử dụng Trình chuyển đổi đầu ra làm bộ chọn trong ứng dụng sẽ không cần có quyền truy cập vào mạng cục bộ (sẽ có thêm hướng dẫn ở bản phát hành sau).
Việc thực thi Android 17
Kể từ Android 17, các biện pháp bảo vệ mạng cục bộ là bắt buộc và được thực thi đối với các ứng dụng nhắm đến Android 17 trở lên.
| Tỷ lệ | Android 16 | Android 17 |
|---|---|---|
| SDK mục tiêu | 36 | 37 trở lên |
| Quyền | Tạm thời sử dụng NEARBY_WIFI_DEVICES | ACCESS_LOCAL_NETWORK |
| Quyền truy cập mặc định | Quyền truy cập mạng cục bộ đang mở | Mạng cục bộ bị chặn theo mặc định đối với tất cả các ứng dụng cập nhật SDK mục tiêu |
| Nhóm quyền | Là một phần của nhóm quyền NEARBY_DEVICES hiện có |
Để xác minh rằng chức năng của ứng dụng không bị hỏng sau khi quy định có hiệu lực, các ứng dụng nhắm đến SDK 37 trở lên phải áp dụng một trong các cách sau để quản lý quyền truy cập vào mạng cục bộ:
Lộ trình A: Sử dụng bộ chọn đảm bảo quyền riêng tư
Đối với các tác vụ khám phá và kết nối do hệ thống làm trung gian, hãy dùng bộ chọn để tránh yêu cầu hoàn toàn quyền khi bắt đầu chạy trên diện rộng. Sử dụng các bộ chọn sau đây dựa trên trường hợp sử dụng của bạn:
- Truyền trực tuyến nội dung nghe nhìn: Đối với những ứng dụng hỗ trợ Google Cast, các ứng dụng này có thể sử dụng tính năng nút chuyển đầu ra. Điều này cho phép nhà phát triển cho phép người dùng chọn các thiết bị truyền trực tuyến cụ thể mà không cần ứng dụng yêu cầu quyền
ACCESS_LOCAL_NETWORKtrên diện rộng. - Khả năng kết nối chung:
NsdManagerbao gồm một bộ chọn dịch vụ do hệ thống chạy để khám phá mDNS. Thay vì để ứng dụng quét toàn bộ mạng, hệ thống sẽ hiển thị một hộp thoại cho phép người dùng chọn một thiết bị duy nhất để ứng dụng truy cập.
val discoveryRequest = DiscoveryRequest.Builder("_http._tcp")
.setFlags(DiscoveryRequest.FLAG_SHOW_PICKER)
.build()
nsdManager.registerServiceInfoCallback(discoveryRequest, executor, object : NsdManager.ServiceInfoCallback {
override fun onServiceUpdated(serviceInfo: NsdServiceInfo) {
// Handle the user-selected and discovered service
// NsdServiceInfo.getHostAddresses() can now be connected to
// without ACCESS_LOCAL_NETWORK permission
}
})
Đường dẫn B: Yêu cầu quyền khi bắt đầu chạy (quyền truy cập rộng)
Đường dẫn này là bắt buộc đối với các trường hợp sử dụng phức tạp như tự động hoá nhà ở hoặc quản lý thiết bị IoT cần có quyền truy cập rộng rãi và liên tục vào mạng cục bộ.
Khai báo quyền trong tệp kê khai: Nhà phát triển phải khai báo rõ ràng
ACCESS_LOCAL_NETWORKtrongAndroidManifest.xml.Yêu cầu cấp quyền trong thời gian chạy: Trước khi cố gắng truy cập vào mạng cục bộ, các ứng dụng phải kiểm tra xem quyền đã được cấp hay chưa. Nếu không, họ phải gọi
Activity.requestPermission()để kích hoạt lời nhắc tiêu chuẩn của hệ thống.Trường hợp được cấp trước: Quyền
ACCESS_LOCAL_NETWORKthuộc nhóm quyềnNEARBY_DEVICES. Nếu đã cấp một quyền khác trong nhóm này (chẳng hạn như quyền Bluetooth), người dùng sẽ không được nhắc lại về quyền truy cập vào mạng cục bộ.Xử lý trường hợp từ chối và thu hồi: Ứng dụng phải xử lý nhẹ nhàng các trường hợp người dùng từ chối yêu cầu hoặc sau đó thu hồi quyền trong phần cài đặt hệ thống. Trong những trường hợp như vậy, lưu lượng truy cập mạng cục bộ sẽ bị chặn.
Chiến lược đặt lại bộ đếm yêu cầu cấp quyền
Nền tảng này triển khai một chiến lược đặt lại bộ đếm để giải quyết các trường hợp mà lần từ chối trước đó của ứng dụng đối với nhóm quyền NEARBY_DEVICES (hiện bao gồm ACCESS_LOCAL_NETWORK) đã ngăn ứng dụng yêu cầu quyền sau khi trình bày đầy đủ lý do. Cơ chế này mang đến thêm nhiều cơ hội để ứng dụng gọi API requestPermission(), nhờ đó đặt lại số lần từ chối cho quyền ACCESS_LOCAL_NETWORK. Điều này cho phép tương tác lại với người dùng một cách tinh tế hơn, đặc biệt là khi người dùng từ chối lần đầu trước khi ứng dụng có thể truyền đạt sự cần thiết của quyền truy cập vào mạng cục bộ đối với chức năng cốt lõi của ứng dụng.
Mô hình phân chia quyền
Quyền truy cập vào mạng cục bộ sử dụng chiến lược di chuyển quyền tách biệt để xử lý các ứng dụng mới và cũ theo cách khác nhau, dựa trên SDK mục tiêu của các ứng dụng đó
| Danh mục | Cấp SDK mục tiêu | Hành vi truy cập mạng cục bộ | Việc cần làm đối với nhà phát triển |
|---|---|---|---|
| Ứng dụng mới / Ứng dụng đã cập nhật | >= 37 (Android 17) | Chặn theo mặc định | Khai báo và yêu cầu quyền khi bắt đầu chạy ACCESS_LOCAL_NETWORK |
| Ứng dụng cũ | < 37 | Các ứng dụng có quyền INTERNET sẽ nhận được quyền ngầm ẩn cho ACCESS_LOCAL_NETWORK, cho phép các ứng dụng này giữ lại quyền truy cập. Đây là tạm thời và sẽ bị chặn theo mặc định sau khi ứng dụng tăng SDK mục tiêu lên 37 |
Bạn không cần thay đổi mã ngay |
Chiến lược LNP theo trường hợp sử dụng
Truyền: Đối với các chức năng truyền nội dung nghe nhìn, chiến lược phù hợp nhất và bảo đảm quyền riêng tư là sử dụng công cụ chuyển đổi đầu ra. Phương thức này cho phép hệ thống xử lý việc phát hiện và kết nối mạng cục bộ thay cho người dùng, giúp loại bỏ nhu cầu ứng dụng yêu cầu cấp quyền
ACCESS_LOCAL_NETWORK.Trình duyệt: Việc xử lý lỗi đòi hỏi các phương pháp khác nhau dựa trên giao thức. Lỗi UDP dẫn đến mã lỗi
EPERM. Đối với các kết nối TCP, trình duyệt nên sử dụng NDK APIandroid_getnetworkblockedreason(int sockFd)để xác định xem một gói có bị LNP chặn hay không. API này sẽ trả vềANDROID_NETWORK_BLOCKED_REASON_LNP.Các trường hợp sử dụng khác (ví dụ: IoT): Các ứng dụng tìm thiết bị bằng mDNS nên sử dụng
android.net.nsd.DiscoveryRequest#FLAG_SHOW_PICKER.android.net.nsd.DiscoveryRequest#FLAG_SHOW_PICKERcho phép tìm thiết bị mà không cần có quyền vàNsdManager#registerServiceInfoCallback/NsdManager#resolveServiceđể lấy địa chỉ IP. Các kết nối đến địa chỉ IP thu được theo cách này không yêu cầu quyềnACCESS_LOCAL_NETWORK.
Đối với những ứng dụng yêu cầu giao tiếp trực tiếp với mạng cục bộ và không thể sử dụng bộ chọn do hệ thống làm trung gian, phương pháp được đề xuất là sử dụng chiến lược bộ đếm đặt lại quyền. Nếu người dùng thu hồi quyền ACCESS_LOCAL_NETWORK, cơ chế này sẽ cung cấp thêm cơ hội để ứng dụng yêu cầu lại quyền, cho phép nhà phát triển trình bày cho người dùng lý do rõ ràng hơn.
Hướng dẫn về Android 16
Để chọn áp dụng các quy định hạn chế về mạng cục bộ, hãy làm như sau:
- Cài đặt ROM cho thiết bị của bạn bằng bản dựng Android 16 Beta 3 trở lên
- Cài đặt ứng dụng cần kiểm thử
Bật/tắt cấu hình Appcompat bằng adb
adb shell am compat enable RESTRICT_LOCAL_NETWORK <package_name>Khởi động lại thiết bị
Giờ đây, quyền truy cập của ứng dụng vào mạng cục bộ sẽ bị hạn chế và mọi nỗ lực truy cập vào mạng cục bộ đều dẫn đến lỗi socket.
Nếu bạn đang sử dụng các API thực hiện các thao tác trên mạng cục bộ bên ngoài quy trình ứng dụng (ví dụ: NsdManager), thì các API này sẽ không bị ảnh hưởng trong quá trình chọn sử dụng.
Để khôi phục quyền truy cập, bạn phải cấp cho ứng dụng của mình quyền NEARBY_WIFI_DEVICES.
- Đảm bảo ứng dụng khai báo quyền
NEARBY_WIFI_DEVICEStrongmanifest. - Chuyển đến phần Cài đặt > Ứng dụng > [Tên ứng dụng] > Quyền > Thiết bị ở gần > Cho phép
Giờ đây, quyền truy cập của ứng dụng vào mạng cục bộ sẽ được khôi phục và tất cả các trường hợp của bạn sẽ hoạt động như trước khi chọn sử dụng ứng dụng. Sau đây là cách lưu lượng truy cập mạng của ứng dụng bị ảnh hưởng.
| Quyền | Yêu cầu LAN đi | Yêu cầu Internet đi/đến | Yêu cầu LAN đến |
|---|---|---|---|
| Đã cấp | Works | Works | Works |
| Không được cấp | Thất bại | Works | Thất bại |
Sử dụng lệnh sau để tắt cấu hình Appcompat
adb shell am compat disable RESTRICT_LOCAL_NETWORK <package_name>
Lỗi
Nếu yêu cầu truy cập vào mạng cục bộ không thành công do thiếu quyền:
Các kết nối TCP thường sẽ dẫn đến lỗi hết thời gian chờ.
Lỗi UDP và các trường hợp từ chối quyền chung thường sẽ dẫn đến mã lỗi EPERM
Lỗi
Gửi thông tin về lỗi và ý kiến phản hồi cho:
- Sự khác biệt về quyền truy cập vào mạng LAN (bạn không cho rằng một quyền truy cập nhất định nên được coi là quyền truy cập vào "mạng cục bộ")
- Lỗi khi quyền truy cập vào mạng LAN không bị chặn
- Lỗi khiến quyền truy cập vào mạng LAN bị chặn mặc dù không nên
Những nội dung sau đây sẽ không bị ảnh hưởng bởi thay đổi này:
- Quyền truy cập Internet
- Mạng di động