Seguranca

Um processo invadindo áreas de outro

Como o espaço de endereçamento de um processo é diferente de outro e isso é administrado pelo kernel, não há como um processo invadir o espaço de enderaçamento do outro. Entretanto, quando um processo está com uma região de memória compartilhada, a situação pode mudar de figura, pois basta o outro processo saber o nome dessa região compartilhada para ele poder atachá-la ao seu espaço de endereçamento, isso pode ser utilizado por softwares mal intencionados.

Um processo pode invadir áreas do kernel?

Quando um processo tenta acessar uma página, é verificado a sua permissão para aquela página específica. Caso ele não possua privilégios de acesso, ele não terá o acesso.

O que acontece quando um processo tenta acessar uma área não permitida?

Quando o processo não tem permissão para acessar determinada área, a ele é enviado um sinal SIGSEGV.

Copiando dados do Kernel para o User Space e vice-versa

Como não é seguro copiar os dados diretamente do/para o espaço do usuário devido à possibilidade de falta de página, o Linux oferece uma API que permite a cópia de dados do/para o espaço do usuário que é mostrada, em parte, abaixo:

unsigned long copy_from_user(void *to, const void *from, unsigned long n) - copia n bytes do espeço do usuário (from) para o espaço de endereçamento do kernel (to).

unsigned long copy_to_use(void *to, const void *from, unsigned long n) - análogo ao anterior, executando o caminho inverso.

void copy_user_page(void *to, void *from, unsigned long adress)

void clear_user_page(void *page, unsigned long adress)

void get_user(void *to, void *from) - copia um inteiro do espaço de usuário(from) para o espaço do kernel(to).

void put_user(void *from, void *to) - análogo ao anterior, no caminho inverso.

long strncpy_from_user(char *dst, const char *src, long count) - copia uma string terminada em nulo do espaço do usuário para o espaço do kernel.

int access_ok(int type, unsigned long addr, unsigned long size) - Retorna não-nulo se o bloco do espaço de usuário é válido e zero caso contrário.

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License