Como encontrar em qual anel um processo está sendo executado no Linux?

1

Como posso descobrir em qual anel de proteção um determinado processo está sendo executado e, se possível, posso produzir uma lista de processos em execução com seus respectivos anéis? Este tópico fornece algumas dicas sobre quais anéis são utilizados em um processador x86: link

Eu gostaria de saber como descobrir quais processos de nível de anel de proteção estão sendo executados em mim, não receber uma descrição de quais processos de anéis estarão em execução (embora você possa incluí-los se quer).

    
por Rob 30.12.2017 / 22:23

1 resposta

6

Em x86 , o nível de privilégio atual é determinado pelos dois bits inferiores do seletor de segmento de código, ie o valor armazenado no registrador CS. Então, "tudo" que você precisa fazer para determinar o nível de privilégio atual de um processo é olhar para o valor de seu registro de CS.

Você pode fazer isso facilmente para o seu próprio programa (assumindo 64-bit x86 ):

#include <stdint.h>
#include <stdio.h>

int main (int argc, char **argv) {
    uint64_t rcs = 0;
    asm ("mov %%cs, %0" : "=r" (rcs));
    printf("%d\n", (int) (rcs & 3));
    return 0;
}

Para outros processos, você teria que anexar a eles usando algo como ptrace e examinar seus registros. Você pode fazer isso manualmente usando gdb : identificar um processo, anexar a ele (se tiver permissão) usando gdb --pid ... e, em seguida, emitir gdb command info registers cs para ver o valor atual de CS e extrair o valor dos dois bits menos significativos.

No Linux em x86 , você verá rapidamente que o nível de privilégio atual é sempre 3: os processos do usuário sempre são executados no anel 3, exceto quando estão em chamadas do sistema (que são executadas no anel 0 ) - mas você não poderá vê-los no anel 0 externamente, exceto pelo rastreamento do código do kernel usando ftrace por exemplo.

    
por 30.12.2017 / 23:48