segunda-feira, 13 de julho de 2009

Segurança

O Linux utiliza o conceito de usuários e grupos, cada um identificado por um ID de 16 bits. A associação de usuários com grupos é feita por um administrador do sistema (que pertence ao grupo de administradores). Quando um processo é criado, ele carrega o UID (ID do usuário) e GID (ID do grupo) do seu criador. Quando um arquivo é criado, ele carrega as UID e GID do processo que o criou.
Esse sistema é utilizado para determinar permissões para arquivos, que são representadas por 9 bits, que representam permissão de leitura, escrita e execução para o criador, grupo do criador e todos (representado por rwxrwxrwx na ordem).
Um mecanismo especial do Linux é ter o SETUID bit nos programas, que funciona da seguinte forma: se um usuário executa o programa, o UID do processo torna-se o UID do criador do programa, e não do usuário que executou o programa; dessa forma é possível criar permissões que se aplicam a programas, e não a usuários que executam os programas.

A seguir, vamos analisar alguns tópicos sobre a segurança do Linux: invasão de áreas de outros processos e de sistema, acesso à áreas não autorizadas e transferência de dados do Kernel para processos e vice-versa.

Um processo pode invadir áreas de outros processos?
Não. Cada processo possui seu próprio espaço de endereçamento, não permitindo que um processo invada a área de outros processos.
Os espaços de endereçamento dos processos são administrados pelo kernel, que controla o acesso à área de cada processo.

Um processo pode invadir áreas do sistema?
O acesso às áreas do sistema são controlados a partir de permissões. O sistema verifica as permissões do processo que requer acesso e, a partir do nível de permissão concedido ao processo, determina se o acesso é autorizado ou não.

O que acontece quando um processo tenta acessar uma área não autorizada?
O acesso à uma área não autorizada caracteriza uma exceção, que será tratada pelo kernel.
Por exemplo, ao tentar acessar uma área não autorizada, podemos gerar uma Bounds Check fault, que ocorre quando uma instrução é realizada com operandos fora das áreas de endereço válidos. Neste caso, o sinal gerado é um SIGSEGV.

Como ocorre a tranferência de dados do kernel para processos e vice-versa?
A presença de dados inconsistentes ou maliciosos no kernel pode trazer instabilidades e insegurança ao sistema. Por isto, é necessário verificar previamente os dados antes de transmití-los ao kernel. Isto ocorre através de uma série de funções pertencentes à API do kernel do linux.
A transferência de dados ocorre de acordo com a figura abaixo, realizando um armazenamento prévio em buffer, de modo a verificar a consistencia e validade dos dados. Uma vez verificado, os dados são transmitidos para o kernel.



Referências:
http://www.gelato.unsw.edu.au/~dsw/public-files/kernel-docs/kernel-api/index.html
http://tldp.org/HOWTO/Security-HOWTO/
http://www.ibm.com/developerworks/br/library/j-zerocopy/index.html
http://en.wikipedia.org/wiki/Security-Enhanced_Linux

Nenhum comentário:

Postar um comentário