# このappさ。動かないんだぜ。 https://contest.ictsc.net/problems/5197b533-8354-4233-aeea-8e9cc274edb2#answers ## 調査 SELinux問題 ``` $ getenforce Enforcing $ ls -Z . -rwxr-xr-x. ictsc ictsc system_u:object_r:myapp_exec_t:s0 app -rwxr-xr-x. ictsc ictsc system_u:object_r:usr_t:s0 flag -rw-r--r--. ictsc ictsc system_u:object_r:myapp_flag_t:s0 flag.txt $ sesearch -t myapp_flag_t --all -d Found 2 semantic av rules: allow myapp_flag_t myapp_flag_t : filesystem associate ; allow staff_t myapp_flag_t : file { read write getattr } ; Found 40 role allow rules: allow system_r xguest_r; allow webadm_r system_r; allow system_r webadm_r; allow system_r user_r; allow system_r unconfined_r; allow system_r unconfined_r; allow system_r unconfined_r; allow unconfined_r system_r; allow sysadm_r user_r; allow sysadm_r staff_r; allow sysadm_r system_r; allow sysadm_r secadm_r; allow sysadm_r system_r; allow sysadm_r system_r; allow sysadm_r system_r; allow sysadm_r system_r; allow sysadm_r system_r; allow sysadm_r auditadm_r; allow system_r sysadm_r; allow sysadm_r system_r; allow staff_r webadm_r; allow staff_r unconfined_r; allow staff_r sysadm_r; allow staff_r secadm_r; allow staff_r logadm_r; allow staff_r dbadm_r; allow staff_r auditadm_r; allow system_r staff_r; allow secadm_r sysadm_r; allow secadm_r auditadm_r; allow system_r nx_server_r; allow logadm_r system_r; allow logadm_r system_r; allow system_r guest_r; allow dbadm_r system_r; allow dbadm_r system_r; allow system_r system_r; allow auditadm_r sysadm_r; allow auditadm_r secadm_r; allow auditadm_r system_r; $ sesearch -t myapp_exec_t --all -d Found 3 semantic av rules: allow myapp_t myapp_exec_t : file { ioctl read getattr lock map execute execute_no_trans entrypoint open } ; allow staff_t myapp_exec_t : file { read write getattr execute open } ; allow myapp_exec_t myapp_exec_t : filesystem associate ; Found 1 semantic te rules: type_transition staff_t myapp_exec_t : process myapp_t; Found 40 role allow rules: allow system_r xguest_r; allow webadm_r system_r; allow system_r webadm_r; allow system_r user_r; allow system_r unconfined_r; allow system_r unconfined_r; allow system_r unconfined_r; allow unconfined_r system_r; allow sysadm_r user_r; allow sysadm_r staff_r; allow sysadm_r system_r; allow sysadm_r secadm_r; allow sysadm_r system_r; allow sysadm_r system_r; allow sysadm_r system_r; allow sysadm_r system_r; allow sysadm_r system_r; allow sysadm_r auditadm_r; allow system_r sysadm_r; allow sysadm_r system_r; allow staff_r webadm_r; allow staff_r unconfined_r; allow staff_r sysadm_r; allow staff_r secadm_r; allow staff_r logadm_r; allow staff_r dbadm_r; allow staff_r auditadm_r; allow system_r staff_r; allow secadm_r sysadm_r; allow secadm_r auditadm_r; allow system_r nx_server_r; allow logadm_r system_r; allow logadm_r system_r; allow system_r guest_r; allow dbadm_r system_r; allow dbadm_r system_r; allow system_r system_r; allow auditadm_r sysadm_r; allow auditadm_r secadm_r; allow auditadm_r system_r; ``` SELinuxを強制的に止めるか,ホームディレクトリにもう作ってあるポリシーモジュール`myapplocal.pp`をなんとかして読み込んでくれ!!! --- お世話になっております.高山と申します. この問題では,SELinuxが有効の状態でアプリケーションが正しく動作するためのルールが不足しているためにトラブルが発生していたと考えられます. まず,`./app`ファイルを起動しようとすると,`./flag.txt`を読み込む権限が足りないために失敗することが分かりました. そこで,次のコマンドにより情報収集をしました. ``` $ getenforce Enforcing $ id -Z staff_u:staff_r:staff_t:s0-s0:c0.c1023 $ ls -Z . -rwxr-xr-x. ictsc ictsc system_u:object_r:myapp_exec_t:s0 app -rwxr-xr-x. ictsc ictsc system_u:object_r:usr_t:s0 flag -rw-r--r--. ictsc ictsc system_u:object_r:myapp_flag_t:s0 flag.txt $ sesearch -t myapp_exec_t --all -d Found 3 semantic av rules: allow myapp_t myapp_exec_t : file { ioctl read getattr lock map execute execute_no_trans entrypoint open } ; allow staff_t myapp_exec_t : file { read write getattr execute open } ; allow myapp_exec_t myapp_exec_t : filesystem associate ; Found 1 semantic te rules: type_transition staff_t myapp_exec_t : process myapp_t; (略) ``` 以上の結果から, * サーバ上ではSELinuxが有効化されている * シェルプロセスには`staff_t`が付与されている * `./app`ファイルには`myapp_exec_t`が付与されている * `./flag`ファイルには`usr_t`が付与されている * `./flag.txt`ファイルには`myapp_flag_t`が付与されている * `staff_t`が付与されたシェルプロセスで`./app`ファイルを起動すると`myapp_t`が付与されたプロセスになる ということが分かりました. よって,`myapp_t`が付与されたアプリケーションプロセスで`myapp_flag_t`が付与されたファイルを読み込む権限があれば良いので,`myapplocal.te`というファイルを以下の内容で作成しました. ``` module myapplocal 1.0; require { type myapp_t; type myapp_flag_t; class file { read open }; } allow myapp_t myapp_flag_t:file { read open }; ``` そして,次のコマンドでポリシーモジュールをインストールしました. ``` $ make -f /usr/share/selinux/devel/Makefile $ newrole -r sysadm_r $ sudo semodule -i myapplocal.pp $ exit ``` すると,`./app`コマンドでアプリが起動しましたが,`curl localhost:3000`で結果を確認したところ.`Great!!!!`の行が足りていませんでした. `Great!!!!`は`./flag`を実行することにより得られる出力なので,`./app`から`./flag`を実行することに失敗していると推測し,`myapp_t`が付与されたアプリケーションプロセスで`usr_t`が付与されたファイルを実行する権限があれば良いと考えました.したがって,`myapplocal.te`というファイルを以下の内容に修正しました. ``` module myapplocal 1.0; require { type myapp_t; type myapp_flag_t; type usr_t; class file { read getattr execute execute_no_trans open }; } allow myapp_t myapp_flag_t:file { read open }; allow myapp_t usr_t:file { read getattr execute execute_no_trans open }; ``` そして,次のコマンドでポリシーモジュールをインストールしました. ``` $ make -f /usr/share/selinux/devel/Makefile $ newrole -r sysadm_r $ sudo semodule -i myapplocal.pp $ exit ``` すると,`./app`コマンドでアプリが起動し,`curl localhost:3000`で期待した結果が出るようになりました. --- make -f /usr/share/selinux/devel/Makefile newrole -r sysadm_r sudo semodule -i myapplocal.pp exit