---
# System prepended metadata

title: このappさ。動かないんだぜ。

---

# この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