You are on page 1of 8

Uma introdução ao SMACK (Simplified Mandatory Access

Control Kernel)
Adriano Antonio da Silva1, Felipe Amadeu Junges1, Maiquel Felipe Schroeder1

Universidade do Vale do Rio dos Sinos (UNISINOS)


1

Caixa Postal 275 – 93.022-000 – São Leopoldo – RS – Brazil


{adryano.asilva,felipejunges,maiquel}@gmail.com

Abstract. This article aims to conduct a brief analysis of SMACK which is an


implementation of MAC with several improvements. The SMACK was
developed by Casey Schaufler, in order to modify an operating system making
it safe in accordance with the requirements that it needed.

Resumo. Este artigo visa realizar uma breve análise do SMACK o qual é uma
implementação de MAC com várias melhorias. O SMACK foi desenvolvido
por Casey Schaufler, com o objetivo de modificar um sistema operacional
tornando-o seguro de acordo com os requisitos que lhe forem necessários.

1. Introdução
Visando uma maior segurança dos sistemas operacionais, Casey Schaufler desenvolveu
o Smack um módulo de segurança para sistemas Linux.
Também chamado de Linux Security Module o (LSM) é um framework
que os sistemas linux mantém no seu código para implementações de segurança o qual é
utilizado pelo Smack para incorporar-se ao kernel do sistema.
O Smack trabalha com rótulos sobre processos, arquivos e objetos do sistema,
além de implementar regras descrevendo quais tipos de acesso são permitidos por
combinações específicas de rótulos. Ao contrário do SELinux o Smack foi projetado
especificamente para a simplicidade na administração.

2. Fundamentos
Mandatory Access Control (MAC) ou Controle de Acesso Mandatório nada mais é que
uma maneira de restringir o acesso a um objeto baseado na sensibilidade da informação
contida nele próprio e nas autorizações de acesso a informações dessa sensibilidade.
(Nobre J. C., 2010).
Se comparado ao SELinux pode-se dizer que o SMACK é mais fácil de ser
implantado e configurado ao sistema, além de necessitar de um suporte menor das
aplicações. Diferente do SELinux o objeto herda o rótulo do sujeito que criá-lo, de modo
que execute o rótulo, só é relevante para determinar se o processo do sujeito está
autorizado a executá-lo. O processo que é criado tem o rótulo do sujeito que o executou
e não o rótulo associado com o arquivo executável. E esta simplicidade faz sentido para
dispositivos embarcados, que precisam implementar apenas um conjunto limitado de
funções. Nesse caso, a redução pode ser alcançada no tempo de desenvolvimento, bem
como a quantidade de memória RAM e FLASH necessárias. (Edge J., 2008).

3. Smack (Simple Mandatory Access Control Kernel)


É um mecanismo de controle de acesso mandatório projetado para ser mais prático e
fácil de gerenciar. Para compreender o Smack primeiro deveremos entender alguns
termos usados por ele.
1) Sujeito: É uma tarefa, a unidade em execução.
2) Objeto: Pode ser qualquer tipo de arquivo, IPC – troca de mensagem entre
processos, tarefa.
3) Acesso: É toda ação de colocar ou resgatar informação de um Objeto.
4) Rótulo: É uma string que possui dados do qual identifica características de
controle de acesso mandatório de um sujeito ou objeto.
5) Capacidade: Uma tarefa que possui capacidade e permissão para violar a política
de segurança do sistema, identificada pela capacidade específica. Uma tarefa
que possui um ou mais recursos é uma tarefa privilegiada, enquanto uma tarefa
sem recursos é uma tarefa sem privilégios.
6) Privilégio: Quando uma tarefa pode violar a política de segurança de um
sistema é chamada de privilegiada. Como está escrito uma tarefa pode ter
privilégios ou ser executada pelo usuário root.
Todo sujeito e objeto devem receber um rótulo, o qual é formado por 23
caracteres. Existem quatro tipos de Rótulos pré-definidos:
"*" – chamado de "star"
"_" – chamado de "floor"
"^" – chamado de "hat"
"?" – chamado de "huh"

Tarefas de Sistema tal como init e daemons de sistema são executadas com
rótulo floor. Tarefas de usuário são atribuídas com rótulos de acordo com a
especificação encontrada no arquivo de configuração /etc/smack/user. (Schaufler, C.,
2008).

3.1. Regras de Acesso Padrão


Smack usa o modelo tradicional do Linux: read, execute e write. Existem inúmeros
casos onde o modo de acesso não é tão simples.
1) Signals: A signal é um operação de escrita de uma tarefa de sujeito para uma
tarefa de objeto.
2) Internet Domain IPC: Transmissão de pacotes são consideradas como operação
de escrita de uma tarefa origem para uma tarefa destino.
Smack restringe o acesso comparando o rótulo sujeito com o rótulo do objeto
que o sujeito tenta acessar.
As regras aplicadas são estas em sua respectiva ordem de ação:
1) Qualquer acesso solicitado por uma tarefa com o rótulo “*” ("star") é negado;
2) Acesso de leitura ou execução solicitado por tarefa com rótulo “^” ("hat") é
permitido;
3) Acesso de leitura ou execução solicitado em um objeto com rótulo “_” ("floor")
é permitido;
4) Qualquer acesso solicitado em um objeto com rótulo “*” ("star") é permitido;
5) Qualquer acesso solicitado por uma tarefa em um objeto com o rótulo igual é
permitido.
6) Qualquer acesso solicitado que seja explicitamente definido no conjunto de
regras carregado é permitido;
7) Qualquer outro acesso é negado.

Figura 1. Regras básicas para o controle de acesso.

Na Figura 1. O usuário Barney foi atribuído um rótulo Ruble. Este usuário pode
ler dados ou executar programas rotulados como floor(“_”). Ele também pode ler e
gravar para /dev/null, que tem o rótulo de estrela(“*”). Processos rodando com rótulo
floor não têm qualquer acesso aos dados de Barney. Um processo rodando com rótulo
hat(“^”) tem acesso de leitura dos dados dos usuários liberado, mas não tem acesso de
escrita.
Figura 2. Interação básica de rótulos.

Com essas regras básicas processos de sistema executados com o rótulo floor
são protegidos de processos que são executados com outros rótulos. A Figura 2. mostra
acesso permitido quando dois rótulos de usuários estão em uso. Neste imagem o
processo com rótulo Java pode ler e escrever em dados com rótulos Java, o processo
com rótulo mp3 tem acesso de leitura e escrita em dados com rótulo mp3, o mesmo
acontece com processos com rótulo de sistema floor, que possuem acesso a dados
rotulados como floor. Tanto processos Java quanto mp3 possuem acesso de leitura aos
dados de sistema floor. Nenhum dos dois processos de usuários tem acesso aos outros
dados.
Com o isolamento provido pelo Smack a separação de acessos é simples.
Existem muitos casos onde seria interessante limitar o acesso de sujeito para objetos
com rótulos diferentes. Um exemplo familiar é o modelo espião de sensibilidade. Uma
cientista trabalhando em projeto classificado como altamente secreto seria capaz de ler
documentos de classificação inferior, tudo que ela escrever irá ser criado como
altamente secreto. Para resolver estes casos o Smack incluiu um mecanismo para
especificar regras de permissão de acesso entre rótulos.

3.2. Formato das Regras de Acesso

(Rótulo-Sujeito Rótulo-Objeto Acesso)


Formato da regra imposta no Smack.

1) Rótulo-Sujeito – é o rótulo para um processo;


2) Rótulo-Objeto – é o rótulo para o que será acessado;
3) Acesso – é uma string que especifica o tipo de acesso permitido. Os rótulos
possuem um limite de 23 caracteres. Os modos de acesso são:
3.1) a: indica que o acesso anexado deve ser permitido;
3.2) r: indica que o acesso de leitura deve ser permitido;
3.3) w: indica o que acesso de escrita deve ser permitido;
3.4) x: indica que o acesso de execução deve ser permitido.

Os modos específicos de acesso podem estar em qualquer ordem, seguem alguns


exemplos de regras:
1) TopSecret Secret rx
2) Secret Unclass r
3) Manager Game x
4) User HR w
5) New Old rRrrr
6) Closed Off -

3.3. Aplicação das Regras de Acesso


Desenvolvedores Linux raramente definem novas classes, geralmente importam regras e
conceitos de outros sistemas. Na maioria das vezes, os outros sistemas são uma variação do
Unix. Unix tem muitas propriedades cativantes, mas consistência de modelos de controle de
acesso não é uma delas. Smack esforça-se para tratar os acessos conforme sua sensibilidade
mantendo seu princípio fundamental.
Objetos de arquivos de sistema como , arquivos, diretórios, links simbólicos e
dispositivos requerem acessos e permissões que se aproximam com o acesso feito por bit.
Para abrir um arquivo e lê-lo o acesso requerido é o de leitura de arquivo. Para
pesquisar um diretório o acesso é o de execução. Para criar arquivos é necessário o acesso
de leitura e escrita. Para deletar um arquivo requer acesso de leitura e escrita do arquivo e
do diretório. É possível que um usuário possa ver que um arquivo exista mas não saiba
seus atributos por ter acesso de leitura no diretório onde está o arquivo, porém o arquivo
possui um rótulo diferente.
Os processos dos objetos refletem as tarefas no sistema e o rótulo usado para
acessar o mesmo rótulo que a tarefa poderia usar para tentar outros acessos. Enviar um sinal
via kill(), ou seja, uma chamada de sistema é uma operação de escrita do sinalizada no
recipiente. Depuração de um processo requer permissão de leitura e escrita. Criar uma nova
tarefa é uma operação interna que resulta em duas tarefas com rótulos idênticos e não
requerem controle de acesso.
Sockets são estruturas de dados anexadas a processos, enviam pacotes de um
processo para outro e requerem que o remetente passe o acesso de escrita ao destinatário. O
destinatário não precisa ter acesso de leitura do remetente.

3.4. Definindo as Regras de Acesso


1) Os rótulos podem ser lidos de acordo com este caminho: /proc/<pid>/atr/current.
2) Um processo pode ler seu próprio rótulo: /proc/self/attr/current.
3) Um processo privilegiado pode mudar seu próprio rótulo, mas não pode mudar o
rótulo de outros processos. /proc/self/attr/current
3.5. Atributos de Arquivos
Os rótulos de objetos do filesystem são armazenados como um atributo chamado extensão
SMACK64 nos arquivos. E isto só pode ser mudado por processos privilegiados.

3.6. Privilégios
1) CAP_MAC_ADMIN – permite que um processo execute funções administrativas,
como carregar regras de acesso.
2) CAP_MAC_OVERRIDE – isenta um processo de todas as regras de controle.

3.7. Rede
O Smack reforça o controle de acesso dos protocolos de rede. Normalmente um
pacote enviado por um processo é marcado com uma tag no rótulo, no entanto pacotes
que recebem rótulo de ambiante são enviados sem a tag. Isto é aceitável porque
adicionamos uma tag CIPSO no cabeçalho do pacote IP. Quando o pacote é recebido é
checado para localizar a tag CIPSO que vai identificar o seu rótulo. Se não for possível
marcar um pacote de rede, um rótulo de rede de ambiente é assumido. Depois que o
pacote é entregue uma checagem é feita para determinar o sujeito com o rótulo no
pacote que deve ter acesso de escrita para receber o processo, mas se este não for o caso
o pacote será descartado.

3.8. Configuração CIPSO


Normalmente não é necessário especificar configuração para o CIPSO. São utilizados
valores padrões pelo sistema para tratar todos os processos. O Smack irá compor os
valores do rótulo CIPSO combinando os rótulos usados sem intervenção administrativa.
Pacotes não rotulados que vêm do sistema serão atribuídos com rótulos de ambiente, e
pacotes de saídas que receberiam rótulos de ambiente são enviados sem rótulo.
O Smack requer configurações quando pacotes recebidos vêm de um sistema
que não fala CIPSO. Normalmente isto é encontrado no Trusted Solaris System, mas
existem outros sistemas muito pouco usados.
Domain Of Interpretation (DOI): um nível e uma categoria compõem este
pacote. Ele destina-se a identificar grupos de sistemas com esquemas de rótulos
compatíveis, e o DOI especificado no sistema deve ser o mesmo do sistema remoto, ou
os pacotes serão descartados. Por padrão o DOI é 3. O valor pode ser lido no
diretório: /smack/doi e neste arquivo pode-se alterar o valor do DOI. O rótulo e
categoria definidos são mapeados nos rótulos no seguinte diretório: /etc/smack/cipso.
Exemplo de mapeamento de smack/CIPSO: Smack level [category [category...]
TopSecret 7
TS:A,B 7 1 2
SecBDE 5 4 6
RAFTERS 7 12 26
O mapeamento de rótulo para valores CIPSO são definidos em : /smack/cipso –
para assegurar a formatação correta um programa pode ajudar o smackcipso.

3.9 Administração
O Smack suporta algumas opções de montagem como:
1) smackfsdef=label: especifica o rótulo dado a arquivos que não possuem um
rótulo atributo.
2) label = smackfsroot: especifica o rótulo para atribuir a raiz do sistema de
arquivo se ele não tem um atributo.
3) label = smackfshat: especifica um rótulo que deve ter acesso de leitura para
todos os rótulos de conjunto sobre o sistema de arquivos.
4) label = smackfsfloor: especifica um rótulo para que todos os rótulos de conjunto
do sistema de arquivos possam ter acesso de leitura.
Estas opções de montagem são aplicáveis a todos os tipos de sistema de arquivo
com a exceção do NFS.

4. Conclusão
Pode-se concluir que atualmente o Smack é um modulo complexo, porém
simples para administrar, comparando-o com o SELinux podemos dizer que ele não
perde muito na relação de segurança do sistema.
Mas ele tem suas limitações, ele é útil para o acesso de usuários e processos específicos
que acessam vários recursos, assim como a criação de um conjunto de rótulos e regras
que regem os processos do sistema, serviços de rede entre outros. Mas restringir o
acesso como SELinux seria impossível. Assim administradores que não necessitarem de
um sistema de segurança robusto, o Smack pode muito bem ser suficiente. (Edje, J.,
2007).

5. Referências
Edge, J. (2008), “ OLS: Smack for embedded devices”,
http://lwn.net/Articles/292142/,
Agosto de 2008.
Corbet, J. (2007), “SMACK meets the One True Security Module”,
http://lwn.net/Articles/252562/, outubro de 2007.
Edge, J. (2007), “Smack for simplified access control”,
http://lwn.net/Articles/244531/,
Agosto de 2007.
Schaufler, C. (2008), “The Simplified Mandatory Access Control Kernel”,
http://schaufler-ca.com/data/SmackWhitePaper.pdf, Março de 2007.
Nobre, J. C. (2010), “Mandatory Access Control e SE Linux”,
http://www.inf.unisinos.br/~jcnobre/sso/files/sso-aula16.pdf

You might also like