アンビエント機能

この機能を使用すると、Linux プロセスにおいて、関数の実行に必要な権限のサブセットを保持しつつ、ルート権限と同様の権限の大半をドロップできます。機能の元の実装では、実行されるファイルにファイル機能が設定されていない限り、fork+exec 処理されたプロセスは機能を継承できませんでした。一方、ファイル機能でファイルを実行するプロセスはこうした機能を得ることができるため、ファイル機能にはセキュリティ上のリスクがあります。

アンビエント機能を使用すると、init によって起動されるシステム サービスは、.rc ファイルで機能を設定し、fs_config.c ファイルで設定を分割するのではなく、設定を単一のファイルにまとめることができます。つまり、init によって起動されるすべてのサービスに対して、サービスに関連付けられた .rc を使用して、そのサービスの機能を設定できます。

アンビエント機能は、init によって起動されるサービスの機能を設定する場合におすすめのメカニズムです(この方法では、サービス設定のあらゆる面が単一の .rc ファイルに保持されます)。config.fs ファイルの caps セクションを使用してファイル システム機能を設定するのではなく、アンビエント機能を使用することをおすすめします。

init によって起動されないサービスの機能を設定するときは、引き続き fs_config.c を使用してファイル システム機能を設定します。

アンビエント機能の有効化

特定のサービスのアンビエント機能を有効にするには、init で capabilities キーワードを使用します。現行の init 言語の詳細については、init README.md をご覧ください。

たとえば AOSP サービス wificond のアンビエント機能を有効にするには、 サービスの .rc ファイルで適切なユーザーとグループを設定し、capabilities キーワードを使用して指定された機能をサービスに与えます。

    service wificond /system/bin/wificond
        class main
        user wifi
        group wifi net_raw net_admin
        capabilities NET_RAW NET_ADMIN
    

リファレンス実装

リファレンス実装は Android 共通カーネル(https://android.googlesource.com/kernel/common/)です。

必要なパッチ

必要なパッチは、関連するすべての Android 共通カーネル ブランチに移植されました。

メインのアンビエント機能パッチ(https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=58319057b7847667f0c9585b9de0e8932b0fdb08)は、下記に移植されました。

小規模なセキュリティ修正(https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=b7f76ea2ef6739ee484a165ffbac98deb855d3d3)は、下記に移植されました。

検証

Bionic 単体テストには、アンビエント機能の単体テストが含まれます。さらに、Android init でサービスについて「capabilities」キーワードを使用し、サービスが期待される機能を得ているかどうか確認することで、この機能のランタイム テストが可能になります。