ローカル ネットワークへのアクセス権

LAN 上のデバイスには、INTERNET 権限を持つすべてのアプリがアクセスできます。これにより、アプリはローカル デバイスに簡単に接続できますが、ユーザーの指紋の形成や位置情報のプロキシ化など、プライバシーに関連する問題も発生します。

ローカル ネットワーク保護プロジェクトは、新しいランタイム権限の背後でローカル ネットワークへのアクセスを制限することで、ユーザーのプライバシーを保護することを目的としています。

影響

Android 16 では、この権限はオプトイン機能です。つまり、オプトインしたアプリのみが影響を受けます。オプトインは、アプリ デベロッパーがアプリのどの部分が暗黙的なローカル ネットワーク アクセスに依存しているかを把握し、今後の Android リリースで権限ガードする準備をできるようにすることを目的としています。

アプリが以下を使用してユーザーのローカル ネットワークにアクセスしている場合、影響を受けます。

  • ローカル ネットワーク アドレスで未加工ソケットを直接使用またはライブラリで使用(mDNS や SSDP サービス ディスカバリ プロトコルなど)
  • ローカル ネットワークにアクセスするフレームワーク レベルのクラスの使用(NsdManager など)

影響の詳細

ローカル ネットワーク アドレスとの間のトラフィックにローカル ネットワーク アクセス権が必要です。次の表に、一般的なケースを示します。

アプリの低レベル ネットワーク操作 ローカル ネットワークへのアクセス権が必要です
アウトバウンド TCP 接続の作成 はい
受信 TCP 接続の受け入れ はい
UDP ユニキャスト、マルチキャスト、ブロードキャストの送信 はい
受信 UDP ユニキャスト、マルチキャスト、ブロードキャスト はい

これらの制限はネットワーク スタックの深部に実装されているため、すべてのネットワーク API に適用されます。これには、プラットフォームまたはマネージド コードで作成されたソケット、Cronet や OkHttp などのネットワーキング ライブラリ、それらの上に実装された API が含まれます。ローカル ネットワーク上のサービス(末尾が .local のサービス)を解決しようとすると、ローカル ネットワークへのアクセス権が必要になります。

上記のルールの例外:

  • デバイスの DNS サーバーがローカル ネットワーク上にある場合、そのサーバーとの間(ポート 53 で)のトラフィックにローカル ネットワークへのアクセス権は必要ありません。
  • アプリ内選択ツールとして出力切り替えツールを使用するアプリは、ローカル ネットワーク権限を必要としません(詳細なガイダンスは今後のリリースで提供されます)。

ガイダンス

ローカル ネットワークの制限を有効にするには、次の操作を行います。

  1. Android 16 ベータ版 3 以降を搭載したビルドにデバイスを書き込む
  2. テストするアプリをインストールする
  3. adb を使用して Appcompat 構成を切り替える

    adb shell am compat enable RESTRICT_LOCAL_NETWORK <package_name>
    
  4. デバイスを再起動する

これで、アプリのローカル ネットワークへのアクセスが制限され、ローカル ネットワークにアクセスしようとするとソケット エラーが発生します。アプリのプロセス外でローカル ネットワーク オペレーションを実行する API(NsdManager など)を使用している場合、オプトイン中に影響を受けることはありません。

アクセス権を復元するには、アプリに NEARBY_WIFI_DEVICES へのアクセス権を付与する必要があります。

  • アプリがマニフェストで NEARBY_WIFI_DEVICES 権限を宣言していることを確認します。
  • [設定] > [アプリ] > [アプリ名] > [権限] > [付近のデバイス] > [許可] に移動します。

これで、アプリのローカル ネットワークへのアクセスが復元され、アプリを有効にする前と同じようにすべてのシナリオが動作するようになります。アプリのネットワーク トラフィックに与える影響は次のとおりです。

権限 送信 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 アクセスがブロックされるべきではないのにブロックされるバグ

以下の項目は、この変更の影響を受けません。

  • インターネットへのアクセス
  • モバイル ネットワーク