SELinux策略实例--type_transition(二)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/keheinash/article/details/72709249

上一篇博客http://blog.csdn.net/keheinash/article/details/70169705,讲了type_transition的一个实例,成功地让特定类型的进程执行指定可执行文件后,产生的新进程的domain成为策略文件中指定的类型。在上一篇博客的最后,把可执行文件替换为脚本文件后,再去执行脚本文件,策略就不起作用了,

bash脚本:
这里写图片描述

python脚本:
这里写图片描述

出现这个问题,说明策略失效了,那么思考一下我们所写的策略语句:
这里写图片描述
这些allow都是为了让我们的转换成功而开启的权限,应当理解为保证成功转换的条件,那么触发转换的条件是什么?应该是:当sysadm_t类型的进程执行了myapp_exec_t类型的可执行文件后,产生一个新进程,这个新进程运行myapp_exec_t类型文件的代码,新进程的类型是myapp_t。

提取一下上面关于触发条件的描述,简化为以下几个点:
1.sysadm_t类型的进程执行可执行文件;
2.可执行文件类型为myapp_exec_t;
3.产生了一个新的进程

那么当myapp_exec_t的文件为脚本的时候,是触发条件的哪一个环节出错导致策略失效?
第一点,当我们执行这个可执行文件的时候,sysadm_t类型的进程是哪一个?应该是我们当前所处的bash,看起来这个点没有问题。
第二点,可执行文件的类型为myapp_exec_t,用ls -Z查看,也可以确保没有问题。
第三点,产生了一个新进程,难道当可执行文件为脚本的时候,并不会产生新的进程,只是读取了脚本文件的代码,由sysadm_t类型的进程,也就是bash来执行?用ps命令验证:
这里写图片描述
可以看到,当前bash的PID为1915,和我们的myapp进程ID是不同的:
这里写图片描述
myapp的父进程ID正好就是1915,说明了bash确实有创建一个新的进程,看来第三点是没有问题的。

那么到底在执行文件,创建新的进程的过程中,发生了什么问题?根据同事的建议,使用了strace命令查看执行文件的过程:
这里写图片描述
信息很多,但是重点看第一行,execve(执行文件)的作用是在父进程中fork一个子进程后,在子进程中调用exec函数启动新的程序,因为fork子进程后,子进程的代码和父进程一样,当子进程有属于自己的代码时,需要将子进程的代码替换掉父进程的代码。execve函数的第一个参数是要执行的文件的路径,现在我们看到这个可执行文件并不是我们的myapp文件,而是python解释器!而python myapp命令分别作为两个参数传给python解释器。现在终于搞清楚了,原来是可执行文件类型为myapp_exec_t这个条件不满足。同样的,可以用strace查看myapp为bash脚本时的执行过程:
这里写图片描述
可执行文件是bash解释器,并不是myapp。

根据上面的结果,发现原来是和我们执行脚本的方式有关,那么要怎么样让可执行文件为我们的myapp文件呢?关于脚本的执行方式有好几种,除了用上面的解释器+脚本文件名运行,还可以直接指定脚本文件名运行脚本:
这里写图片描述
这次type_transition成功,用strace追踪过程:
这里写图片描述
第一个参数为myapp文件,就是拥有mapp_exec_t类型的可执行文件,所以第二个条件没有被破坏,因此转换得以成功!

猜你喜欢

转载自blog.csdn.net/keheinash/article/details/72709249