アンビエント機能

この機能を使用すると、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 のアンビエント機能を有効にするには、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」キーワードを使用し、サービスが期待される機能を得ているかどうか確認することで、この機能のランタイム テストが可能になります。