我的目标是在mozilla_t
域中执行 Firefox 而不是unconfined_t
. 这台机器在强制模式下运行带有 SELinux 的 Fedora 20。
不幸的是,我似乎无法做到这一点。无论我做什么,该过程总是在unconfined_t
域中执行。
我知道要满足三个条件:
- 目标文件上下文 (
mozilla_exec_t
) 必须对源域 (unconfined_t
或bin_t
)是可执行的 - 目标文件上下文 (
mozilla_exec_t
) 必须标记为目标域 (mozilla_t
)的入口点 - 必须允许源域 (
unconfined_t
或) 转换到目标域 ( )bin_t
mozilla_t
/usr/bin/firefox
目标文件是调用的 firefox 脚本/usr/lib64/firefox/run-mozilla.run
,它再次运行二进制文件/usr/lib64/firefox/firefox
。这是ls -Z
这些文件的输出:
-rwxr-xr-x. root root system_u:object_r:bin_t:s0 /usr/bin/firefox
-rwxr-xr-x. root root system_u:object_r:bin_t:s0 /usr/lib64/firefox/run-mozilla.sh
-rwxr-xr-x. root root system_u:object_r:mozilla_exec_t:s0 /usr/lib64/firefox/firefox
满足第一个条件,unconfined_t
允许执行目标文件上下文mozilla_exec_t
。
$ sesearch -s unconfined_t -t mozilla_exec_t -c file -p execute -Ad
Found 1 semantic av rules:
allow unconfined_t mozilla_exec_t : file { ioctl read getattr lock execute execute_no_trans entrypoint open } ;
满足第二个条件,mozilla_exec_t
定义为mozilla_t
域的入口点。
$ sesearch -s mozilla_t -t mozilla_exec_t -c file -p entrypoint -Ad
Found 1 semantic av rules:
allow mozilla_t mozilla_exec_t : file { ioctl read getattr lock execute execute_no_trans entrypoint open } ;
根据 Fedora 20 中的默认配置,不满足第三个条件,因为无法转换到.unconfined_t
mozilla_t
$ sesearch -s unconfined_t -t mozilla_t -c process -p transition -Ad
(no output)
为了解决这个问题,我编写了一个简短的策略模块,该模块授予unconfined_t
进程转换到mozilla_t
.
module rekado 1.0;
require {
type unconfined_t;
type mozilla_t;
class process transition;
}
allow unconfined_t mozilla_t : process transition ;
现在我应该能够mozilla_t
通过直接运行可执行文件在域中运行 Firefox 进程/usr/lib64/firefox/firefox
,但该进程仍保留在域中unconfined_t
。
这里发生了什么?为什么不是进程上下文mozilla_t
?
你几乎拥有它。问题是允许规则
允许过渡发生,但不会导致它发生。为此,您需要一个 type_transition 规则:
这会导致在 unconfined_t 进程执行 mozilla_exec_t 文件时发生转换。
完成后,Firefox 将无法运行。我使用 audit2allow 来追踪允许 Firefox 管理临时文件和套接字所需的附加规则。
这是适用于我基于 CentOS 6 的 VM 的策略。它需要启用 selinux 布尔 mozilla_read_content(通过:)
setsebool -P mozilla_read_content 1
。要编译和安装它: