Fedora

SELinux:無法將 Firefox 程序限制在 mozilla_t 域

  • August 20, 2015

我的目標是在mozilla_t域中執行 Firefox 而不是unconfined_t. 這台機器在強制模式下執行帶有 SELinux 的 Fedora 20。

不幸的是,我似乎無法做到這一點。無論我做什麼,該過程總是在unconfined_t域中執行。

我知道要滿足三個條件:

  1. 目標文件上下文 ( mozilla_exec_t) 必須對源域 (unconfined_tbin_t)是可執行的
  2. 目標文件上下文 ( mozilla_exec_t) 必須標記為目標域 ( mozilla_t)的入口點
  3. 必須允許源域 (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

你幾乎擁有它。問題是允許規則

允許 unconfined_t mozilla_t :程序轉換;

允許過渡發生,但不會導致它發生。為此,您需要一個 type_transition 規則:

type_transition unconfined_t mozilla_exec_t : 程序 mozilla_t;

這會導致在 unconfined_t 程序執行 mozilla_exec_t 文件時發生轉換。

完成後,Firefox 將無法執行。我使用 audit2allow 來追踪允許 Firefox 管理臨時文件和套接字所需的附加規則。

這是適用於我基於 CentOS 6 的 VM 的策略。它需要啟用 selinux 布爾 mozilla_read_content(通過:)setsebool -P mozilla_read_content 1

module mozilla 1.0;

require {
 role unconfined_r;
 type unconfined_t;
 type mozilla_t;
 type mozilla_exec_t;
 type tmp_t;
 type user_tmp_t;
 type fs_t;
 class process transition;
 class file { ioctl getattr setattr create read write unlink open relabelto };
 class dir { ioctl getattr setattr create read write unlink add_name remove_name };
 class filesystem getattr;
 class sock_file { getattr setattr create read write unlink };
 class unix_stream_socket connectto;
}

role unconfined_r types mozilla_t;

allow unconfined_t self:file relabelto;
allow unconfined_t mozilla_t : process transition ; 

type_transition unconfined_t mozilla_exec_t : process mozilla_t;

allow mozilla_t fs_t:filesystem getattr;
allow mozilla_t tmp_t:file { ioctl getattr setattr create write unlink open };
allow mozilla_t tmp_t:dir  { ioctl getattr setattr create read write add_name remove_name };
allow mozilla_t user_tmp_t:dir { ioctl create write add_name setattr remove_name };
allow mozilla_t user_tmp_t:sock_file { getattr setattr create read write unlink };
allow mozilla_t unconfined_t:unix_stream_socket connectto;  

要編譯和安裝它:

checkmodule -M -m -o mozilla.mod mozilla.te

checkmodule:從 rekado.te 載入策略配置 checkmodule:載入策略配置

checkmodule

:將二進製表示(版本 10)寫入 mozilla.mod

semodule_package -o mozilla.pp -m mozilla.mod

sudo semodule -i mozilla.pp

引用自:https://serverfault.com/questions/628344