SELinuxのトラブルシューティングと分析ケーススタディ

1. SELinuxのトラブルシューティング

1.1 SELinux権限問題の確認方法

状況1: ユーザーデバッグ版のソフトウェアでは問題が発生しないが、ユーザーバージョンのソフトウェアで問題が発生する場合、SELinuxの権限問題である可能性が高い。

状況2: ソフトウェアがユーザーデバッグ版の場合、以下のコマンドを使用して権限レベルを上げることで、SELinuxの権限問題であるかを確認できる。

adb shell setenforce 0

現在の権限レベルを確認するには、以下のコマンドを使用する。

adb shell getenforce

「Enforcing」が表示された場合は権限レベルが高く、SELinuxの規則に違反すると操作が禁止される。一方、「Permissive」が表示された場合は権限レベルが低く、違反は警告としてログに出力されますが、操作自体は許可される。

1.2 SELinux問題のログ取得方法

問題を再現する前に、以下のフィルターを使用してログを取得する。

logcat | grep -i avc

このコマンドにより、権限エラーのログを取得できる。

1.3 SELinux関連のログから権限ルールの設定

一般的なログ形式についてここでは詳しく説明しないが、今回のケースでの権限エラーの例を見てみる。

avc:  denied  { read } for   path="/dev/input/event6" dev="tmpfs" ino=121 scontext=u:r:shell:s0 tcontext=u:object_r:input_device:s0 tclass=chr_file permissive=0

上記のログに基づいて、以下の権限を追加する。

allow system_app input_device:chr_file { read };
1.4 属性またはデバイスのコンテキストの確認方法

コンテキストとは、上記のログにある`input_device`のようなものである。

属性の場合:

getprop -Z <属性名>

デバイス(Linux)の場合、つまりノードの場合:

ls -lZ <ノードパス>
1.5 SELinuxモジュールのビルドとファイルの置き換え

以下のコマンドでSELinuxポリシーをビルドする。

make selinux_policy

ビルドが完了したら、通常以下のパスに生成物があるため、該当ファイルを置き換えて再起動することで有効化できる。

out/target/product/{project}/system/etc/selinux/
out/target/product/{project}/vendor/etc/selinux/

2. SELinux権限問題の分析ケーススタディ

2.1 問題のコンテキストタイプの確認

ログから、`/dev/input/event6`ノードで権限エラーが発生していることがわかる。

2.2 .teファイルでのタイプ定義

通常、device.teファイルに以下のように定義する。

type skg_chr_device, dev_type;
2.3 file_contextsファイルでのセキュリティコンテキストのパス設定
/dev/input/event(/.*)?              u:object_r:skg_input_chr_device:s0
2.4 .teファイルでのSELinuxルール設定

この.teファイルは、上記で定義したタイプと異なる場合がある。例えば、システムアプリケーションのドメインが必要な場合、system_app.teファイルに以下のように設定する。

allow system_app skg_input_chr_device:chr_file { open read write ioctl };

ログから読み込み権限のみ必要だが、念のため追加の権限も与える。

その後、上述の手順に従ってビルドと検証を行い、再起動後、`ls -Z /dev/input/event6`を実行すると、セキュリティコンテキストが以下のようになる。

crw-rw-rw- 1 root input u:object_r:input_device:s0  13,  70 2025-10-30 18:56 /dev/input/event6

定義したセキュリティコンテキストラベルが効いていない場合、Androidバージョンが同じRK3576の設定と比較し、file_contextsファイルのパス範囲を広げると解決する。

/dev/input/(.*)?                u:object_r:skg_input_chr_device:s0

最終的に、以下のセキュリティコンテキストが確認できれば成功である。

crw-rw-rw- 1 root input u:object_r:skg_input_chr_device:s0  13,  70 2025-10-30 18:56 /dev/input/event6

タグ: selinux Android ADB logcat security policy

6月10日 18:18 投稿