Reescreva uma chamada do sistema no espaço do usuário

1

Existem noções sobre privilégios que ocorrem no nível do processador e no sistema operacional. Com processadores, existem instruções que não podem ser executadas, exceto no modo supervisor. Da mesma forma, no sistema operacional, existem operações que não podem ser executadas sem passar pelo kernel (syscalls).

Pergunta: Como esses dois conceitos mapeiam um ao outro? Podemos reescrever uma chamada do sistema inteiramente no espaço do usuário? Se não, é porque uma chamada de sistema esconde as instruções privilegiadas acima mencionadas?

    
por limik 26.07.2017 / 20:29

1 resposta

1

Simplificando, as instruções privilegiadas são geralmente aquelas relacionadas a E / S com dispositivos de hardware ou proteção de memória. O acesso àqueles de processos arbitrários sem passar por alguma lógica central tornaria possível que os processos destruíssem a memória de outros processos, atrapalhassem o sistema de arquivos, etc., por acidente ou de propósito.

Se considerarmos algumas chamadas de sistema comuns, há, por exemplo, open() , read() , write() e outros que acessam arquivos e, no final, resultam em E / S para o disco ou algum outro dispositivo. Ou fork() e mmap() que afetam a memória de um processo ou de outros processos.

É claro que algo como fazer um processo não chamar uma chamada de sistema não requer privilégios e pode ser feito com uma biblioteca. O mesmo para falsificar os resultados de uma chamada do sistema. Embora, é claro, algo como alterar todos os registros de data e hora de duas semanas para trás (como o libfaketime example) exija descobrir o horário correto primeiro, e isso precisa acontecer por meio de uma chamada de sistema. Além de libfaketime e libeatmydata , há, e. fakeroot que finge que um processo está sendo executado sob o UID 0.

    
por 26.07.2017 / 22:19