SELinux: não é possível confinar o processo do Firefox ao domínio mozilla_t

6

Meu objetivo é executar o Firefox no domínio mozilla_t em vez de unconfined_t . A máquina executa o Fedora 20 com o SELinux no modo de execução.

Infelizmente, parece que não consigo acertar. Não importa o que eu faça, o processo é sempre executado no domínio unconfined_t .

Eu sei que há três condições a serem cumpridas:

  1. o contexto do arquivo de destino ( mozilla_exec_t ) deve ser executável para o domínio de origem ( unconfined_t ou bin_t )
  2. o contexto do arquivo de destino ( mozilla_exec_t ) deve ser marcado como um ponto de entrada para o domínio de destino ( mozilla_t )
  3. o domínio de origem ( unconfined_t ou bin_t ) deve ter permissão para fazer a transição para o domínio de destino ( mozilla_t )

O arquivo de destino é o script do firefox em /usr/bin/firefox , que chama /usr/lib64/firefox/run-mozilla.run , que executa novamente o binário /usr/lib64/firefox/firefox . Esta é a saída de ls -Z nesses arquivos:

-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

A condição primeiro é atendida, pois unconfined_t tem permissão para executar o contexto do arquivo de destino 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 } ; 

A condição second é atendida, pois mozilla_exec_t é definido como o ponto de entrada para o domínio 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 } ; 

Por configuração padrão no Fedora 20, a terceira condição é não satisfeita porque unconfined_t não pode fazer a transição para mozilla_t .

$ sesearch -s unconfined_t -t mozilla_t -c process -p transition -Ad
(no output)

Para corrigir isso, escrevi um módulo de política curto que concede a permissão unconfined_t do processo para fazer a transição para mozilla_t .

module rekado 1.0;

require {
  type unconfined_t;
  type mozilla_t;
  class process transition;
}

allow unconfined_t mozilla_t : process transition ; 

Agora, eu deveria ser capaz de executar o processo do Firefox no domínio mozilla_t executando diretamente o executável /usr/lib64/firefox/firefox , mas o processo permanece no domínio unconfined_t .

O que está acontecendo aqui? Por que o contexto do processo não é mozilla_t ?

    
por rekado 13.09.2014 / 21:10

1 resposta

3

Você quase teve isto. O problema é que a regra de permissão

allow unconfined_t mozilla_t : process transition ;

permite que a transição ocorra, mas não faz acontecer. Para isso você precisa de uma regra type_transition:

type_transition unconfined_t mozilla_exec_t : process mozilla_t;

Isso faz com que a transição ocorra quando um processo unconfined_t executa um arquivo mozilla_exec_t.

Com isso concluído, o Firefox não será executado. Eu usei o audit2allow para rastrear as regras adicionais necessárias para permitir que o firefox gerencie arquivos e soquetes temporários.

Aqui está uma política que funciona na minha VM baseada no CentOS 6. Ele precisa do mozilla_read_content booleano selinux ativado (via: 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;  

Para compilar e instalar:

# checkmodule -M -m -o mozilla.mod mozilla.te
checkmodule: loading policy configuration from rekado.te
checkmodule: policy configuration loaded
checkmodule: writing binary representation (version 10) to mozilla.mod
# semodule_package -o mozilla.pp -m mozilla.mod
# sudo semodule -i mozilla.pp

    
por 20.08.2015 / 21:21