Um processo não pode ler ou escrever ou ramificar fora de sua memória. Isso significa que não pode acessar a memória de outros processos, memória não alocada ou memória do kernel. Assim, mesmo que um invasor dispare um estouro de buffer em um processo e seja capaz de executar código arbitrário no contexto desse processo, isso não dará acesso ao nível do kernel do invasor.
Existe uma saída: os processos podem fazer chamadas do sistema. A maneira exata em que as chamadas do sistema são feitas depende do SO e do tipo de processador; em sua forma mais simples, o processador tem uma instrução de “chamada de sistema”. que ramifica para um endereço específico onde o kernel instalou o código de tratamento de chamadas do sistema.
Quando a chamada do sistema é executada, o processador altera as permissões de acesso na memória. Dessa forma, o kernel é executado com privilégios elevados, incluindo a capacidade de ler, gravar e ramificar em toda a memória e a capacidade de acessar dispositivos de hardware. Novamente, os detalhes de como a elevação de privilégio é executada depende muito de como a chamada do sistema foi implementada em uma plataforma específica; por exemplo, o processador pode manter duas tabelas de controle de acesso (uma para o espaço do usuário e outra para o espaço do kernel) e a instrução de chamada do sistema pode alternar entre essas duas tabelas.
O código do kernel que lida com as chamadas do sistema decodifica os argumentos transmitidos pelo processo (como os argumentos são passados é novamente altamente dependente da plataforma). Pode acontecer que a chamada do sistema valide esses argumentos corretamente. Por exemplo, se o kernel espera um argumento de matriz e não verifica se toda a matriz se encaixa no espaço de endereço do processo, isso pode levar a um processo comum executando um ataque de estouro de buffer contra o kernel e ser capaz de executar o código do kernel. escolhendo.
Para um invasor remoto obter acesso no nível do kernel, geralmente é necessário explorar duas vulnerabilidades, uma em um processo em rede e outra no kernel. Ocasionalmente, há um bug no código de processamento da rede do kernel que permite um ataque em uma etapa.