Android権限の問題

4041 ワード

SELinuxって何?すなわち、Security-Enhanced Linuxは、米国国家安全保障局(NSA)が開発したLinuxに基づいて開発されたセキュリティ強化システムであり、システムのセキュリティを向上させることを目的としている.
SEAndroidはSELinuxに基づいてAndroid 5.0で正式に有効になります.
SELinuxには、Disabled、Permissive、Enforcingの3つの動作モードがあり、androidではadbコマンドgetenforceを入力することで現在のシステムのSELinux状態を取得できます.DisabledはSELinuxが禁止されていることを示し、Permissiveは警告を出すだけでアクセスを拒否しないが、Enforcingは警告を出すと同時にアクセスを拒否する.Android 5.0から、デフォルトモードはEnforcingで、権限の問題が発生することが多いです.
では、SELinuxがもたらす権限の問題ではないかどうかを確認するにはどうすればいいのでしょうか.Kernel logに「avc:denied」というフィールドが表示されると、これらの問題はこのような問題です.
さらに確認するには、adbコマンドsetenforce 0を入力して、現在のSELinuxの動作モードをPermissiveに変更し、関連サービスを再起動して、このような問題があるかどうかを確認します.もしなければ、SELinuxがもたらした問題であることを説明します.
どのようにteファイルを書きますか?
サービスキーがあるとします./dev/input/event 0というinputデバイスを読み込む必要があります.コードは次のとおりです.
int main(void)
{
	int fd;
	struct input_event event;

	fd = open("/dev/input/event0", O_RDONLY);
	if (fd < 0) {
		exit(1);
	}

	while (1) {
		if (read(fd, &event, sizeof(struct input_event)) > 0) {
			if (event.type == EV_KEY) {
				printf("key %d %s
", event.code, event.value ? "down" : "up"); } } } }

最終的に、このコードは/system/bin/ディレクトリの下でコンパイルされてbinファイルを生成します.ではまずinit.rcでこのサービスを開始します.
service key /system/bin/key
	class core

サービスが開始されると、変更サービスのdomainを作成する必要があります.
# key.te
type key, domain;
type key_exec, exec_type, file_type;

init_daemon_domain(key)

file_の変更contextsは、新しく作成したdomainにkeyを追加します.
/system/bin/key u:object_r:key_exec:s0

ls-Zコマンドで/system/bin/keyファイルのセキュリティコンテキストを表示できます.
-rwxr-xr-x root     shell             u:object_r:key_exec:s0 key

keyというサービスはevent 0というデバイスにアクセスできません.サービスの起動にも影響します.エラーメッセージは次のように表示されます.
avc: denied { search } for pid=269 comm="key" name="input" dev="tmpfs" ino=176 scontext=u:r:key:s0 tcontext=u:object_r:input_device:s0 tclass=dir permissive=0

このような問題がSELinux権限の問題ですが、どうやって権限を追加しますか?
本来はps-Zコマンドでkeyというサービスのセキュリティコンテキストを表示できますが、権限の問題でサービスというサービスが起動できなくなり、エラーlogを分析するしかありません.
logから見ると、セキュリティコンテキストが「u:r:key:s 0」のプロセスは、セキュリティコンテキストが「u:object_r:input_device:s 0」のファイルにアクセスできません.ls-Zコマンドで/dev/input/event 0というファイルを見てみましょう.
crw-rw---- root     input             u:object_r:input_device:s0 event0

そのセキュリティコンテキストは確かに「u:object_r:input_device:s 0」であり、コードを結合すると確かにそうであり、logで見るとsearch権限がないので、この権限を先に追加します(key.teファイルに追加します):
allow key input_device:dir { search };

Ok、search権限のない問題はありませんが、新しい権限の問題を報告しました.
avc:  denied  { read } for  pid=270 comm="key" name="event0" dev="tmpfs" ino=2352 scontext=u:r:key:s0 tcontext=u:object_r:input_device:s0 tclass=chr_file permissive=0

確かに、コードにはevent 0デバイスに対してopen、read操作があり、報告権限の問題は正常で、open、read権限に参加します.
allow key input_device:chr_file { open read };

再報告権限の問題がなく、keyというサービスも起動でき、ps-Zコマンドでこのサービスのセキュリティコンテキストが「u:r:key:s 0」であることがわかります.
u:r:key:s0                     root      272   1     /system/bin/key

自分でte文を手動で書くのは少し面倒で、大丈夫で、logに基づいてそれからツールを通じて自動的にte文を生成することができて、このツールはaudit 2 allowです.
ubuntuで、次のコマンドを入力してこのツールをインストールします.
sudo apt-get install policycoreutils

では、このツールはどのように使用されますか.例:
adb shell dmesg | audit2allow

あるいは、前のエラーメッセージを単独で取り出してaudit 2 allowツールで生成することもできます.
echo "avc:  denied  { read } for  pid=270 comm="key" name="event0" dev="tmpfs" ino=2352 scontext=u:r:key:s0 tcontext=u:object_r:input_device:s0 tclass=chr_file permissive=0" | audit2allow

生成されたte文は次のとおりです.
#============= key ==============
allow key input_device:chr_file read;

文は生成できるが,不完全であるだけで,手動で補完すればよい.
参照先:
https://source.android.com/security/selinux/validate.html
https://source.android.com/security/selinux/device-policy.html