O funcionamento do
kernel baseia-se basicamente no seguinte esquema, o kernel fornece dados de sistema para processos que, por sua vez, entregam esses dados ao usuário ou administrador. Sendo assim um
rootkit que atua sobre o kernel tem inúmeras vezes mais controle sobre o sistema.
As antigas versões do kernel do sistema operacional
Linux obrigavam o usuário a realizar a recompilação do mesmo assim que estes carregavam novos drivers ou quaisquer outros códigos, no entanto a partir da versão 2.2 do kernel, este veio a permitir aos administradores realizar todas estas operações em tempo de execução, evitando assim a realização da recompilação do kernel.
Rootkits de kernel em geral permitem a execução de código diretamente no espaço do kernel, eliminando assim os dados que um atacante teria que esconder antes mesmo que estes cheguem ao espaço de usuário.
Vale lembrar que estes rootkits são transparentes para as ferramentas de sistema normais e para as ferramentas forenses mais antigas, pois estas não conseguem detectar a manipulação.
Implementação de rootkit de kernel
Alguns aspectos do kernel devem ser manipulados para a elaboração de um rootkit de kernel, são eles:
- Realizar a troca de chamadas de sistema individuais por versões manipuladas (syscall table patching);
- Inserir uma nova tabela de chamadas de sistema;
- Mudar ponteiros nas estruturas dos sistemas de arquivos raiz e proc (Virtual File System [VFS] Patching);
- Modificação direta das estruturas de código do kernel.
Devemos salientar que embora o texto até este momento nos leve a interpretar rootkits como sendo ferramentas utilizadas apenas para a realização de ataques, estas também podem ser utilizadas para o "bem", pois os administradores de sistema por várias vezes se beneficiam destas ao utilizá-las para analisar e monitorar sistemas.
Podemos citar como exemplos destes tipos de ferramentas que auxiliam os administradores, Kstat, Saint Jude, Sebek, dentre outros.
A tabela de chamadas de sistema
A tabela de chamadas de sistema define a interface entre o espaço de usuário e o espaço do kernel. Esta tabela contém os endereços de todas as chamadas de sistema. A biblioteca C padrão assegura que as chamadas se sistema necessárias ocorram em tempo de execução, enquanto o kernel efetivamente executa as chamadas. O programa de espaço de usuário então processa e interpreta os valores retomados pelas chamadas de sistema.
As chamadas de sistema que o Linux oferece ficam guardadas no arquivo /usr/scr/linux/include/asm/unistd.h. O unistd.h lista 293 chamadas com suas posições na tabela.