區域網路權限

只要應用程式具備 INTERNET 權限,就能存取區域網路 (LAN) 上的裝置。這項功能可讓應用程式輕鬆連線至本機裝置,但也會造成隱私權問題,例如形成使用者指紋,以及成為位置資訊的 Proxy。

「區域網路保護」專案的目標是透過新的執行階段權限,限制區域網路的存取權,進而保護使用者隱私權。

影響

在 Android 16 中,這項權限是選擇性功能,因此只有選擇加入的應用程式會受到影響。應用程式開發人員可透過選擇加入機制,瞭解應用程式的哪些部分依賴隱含的區域網路存取權,以便在日後的 Android 版本中準備好權限防護措施。

如果應用程式使用下列方式存取使用者的區域網路,就會受到影響:

  • 直接或透過程式庫使用本機網路位址的原始通訊端,例如 Multicast DNS (mDNS)Simple Service Discovery Protocol (SSDP)
  • 使用可存取區域網路的架構層級類別,例如 NsdManager

影響程度

如要存取區域網路位址,必須具備區域網路存取權。下表列出一些常見案例:

應用程式低層級網路作業 必須取得區域網路權限
建立外送 TCP 連線
接受傳入的 TCP 連線
傳送 UDP 單點傳播、多點傳播、廣播
接收傳入的 UDP 單點傳播、多點傳播、廣播

這些限制是在網路堆疊深處實作,因此適用於所有網路 API。包括在平台或受管理程式碼中建立的通訊端、Cronet 和 OkHttp 等網路程式庫,以及在這些程式庫上實作的任何 API。如要解析區域網路中含有 .local 後置字串的服務,必須具備區域網路權限。

上述規則的例外狀況:

  • 如果裝置的 DNS 伺服器位於區域網路上,則往返該伺服器的流量 (通訊埠 53) 不需要區域網路存取權。
  • 如果應用程式使用 Output Switcher 做為應用程式內選取器,就不需要區域網路權限 (更多指引將在日後版本中提供)。

指南

如要啟用區域網路限制,請按照下列步驟操作:

  1. 將裝置刷入 Android 16 Beta 3 以上版本
  2. 安裝要測試的應用程式
  3. 使用 adb 切換 Appcompat 設定

    adb shell am compat enable RESTRICT_LOCAL_NETWORK <package_name>
    
  4. 重新啟動裝置

現在應用程式的區域網路存取權受到限制,任何存取區域網路的嘗試都會導致通訊端錯誤。如果您使用的 API 會在應用程式程序外部執行區域網路作業 (例如 NsdManager),則選擇加入後不會受到影響。

如要還原存取權,您必須授予應用程式 NEARBY_WIFI_DEVICES 權限。

  • 請確認應用程式在 manifest 中宣告了 NEARBY_WIFI_DEVICES 權限。
  • 依序前往「設定」 >「應用程式」 >「[應用程式名稱]」 >「權限」 >「鄰近裝置」 >「允許」

現在應用程式應該已恢復區域網路存取權,所有情境也應與應用程式加入前一樣正常運作。應用程式網路流量受到的影響如下。

權限 傳出 LAN 要求 傳出/傳入網際網路要求 傳入 LAN 要求
已授權 Works Works Works
未授予 凸槌影片 Works 凸槌影片

使用下列指令切換關閉 Appcompat 設定

adb shell am compat disable RESTRICT_LOCAL_NETWORK <package_name>

錯誤

如果因這些限制而發生錯誤,當呼叫端通訊端叫用 sendsend 變體至本機網路位址時,系統會將錯誤傳回呼叫端通訊端。

錯誤示例:

sendto failed: EPERM (Operation not permitted)

sendto failed: ECONNABORTED (Operation not permitted)

錯誤

提交錯誤和意見回饋:

  • 區域網路存取權有誤 (您認為特定存取權不應視為「區域網路」存取權)
  • 應封鎖 LAN 存取權,但未封鎖的錯誤
  • LAN 存取權不應遭到封鎖,但卻遭到封鎖的錯誤

這項異動不會影響下列項目:

  • 連上網際網路
  • 行動網路