O que são vdso e vsyscall?

89

eu fiz sudo cat /proc/1/maps -vv

Estou tentando entender a saída. Posso ver muitas bibliotecas compartilhadas sendo mapeadas para o segmento de mapeamento de memória conforme o esperado.

No final, há algo como

O que significa vdsoe vsyscallsignifica? vsyscall é a parte do kernel da memória? Seria ótimo se alguém pudesse lançar alguma luz sobre o assunto.

liv2hak
fonte
5
O Google para VDSO fornece esta página wiki do VDSO (que contém referências adicionais).
Basile Starynkevitch
documentação do procfs , olhe na sua versão do kernel deste arquivo para detalhes específicos do seu sistema.
ruído natural de
Acho que uma explicação melhor do que o que pode ser encontrado no wiki ou na documentação do procfs é necessária para este tópico.
Giuseppe Pes

Respostas:

151

Os vsyscall e vDSO segmentos são dois mecanismos utilizados para acelerar certas chamadas de sistema em Linux. Por exemplo, gettimeofdaygeralmente é invocado por meio desse mecanismo. O primeiro mecanismo introduzido foi vsyscall , que foi adicionado como uma forma de executar chamadas de sistema específicas que não precisam de nenhum nível real de privilégio para serem executadas a fim de reduzir a sobrecarga de chamadas do sistema. Seguindo o exemplo anterior, tudo o que gettimeofdayprecisa fazer é ler a hora atual do kernel. Existem aplicativos que chamam com gettimeofdayfrequência (por exemplo, para gerar carimbos de data / hora), a ponto de se preocupar com até mesmo um pouco de sobrecarga. Para resolver essa questão, o kernel mapeia no espaço do usuário uma página contendo a hora atual e umgettimeofdayimplementação (ou seja, apenas uma função que lê o tempo economizado em vsyscall ). Usando esta chamada de sistema virtual, a biblioteca C pode fornecer um rápido gettimeofdayque não tem a sobrecarga introduzida pela alternância de contexto entre o espaço do kernel e o espaço do usuário normalmente introduzido pelo modelo de chamada de sistema clássico INT 0x80ou SYSCALL.

No entanto, este mecanismo vsyscall tem algumas limitações: a memória alocada é pequena e permite apenas 4 chamadas de sistema, e, mais importante e sério, a página vsyscall é alocada estaticamente para o mesmo endereço em cada processo, uma vez que a localização da página vsyscall é pregado na ABI do kernel. Esta alocação estática do vsyscall compromete o benefício introduzido pela randomização do espaço de memória comumente usada pelo Linux. Um invasor, após comprometer um aplicativo explorando um estouro de pilha, pode invocar uma chamada de sistema do vsyscallpágina com parâmetros arbitrários. Tudo que ele precisa é o endereço da chamada do sistema, que é facilmente previsível, pois é alocado estaticamente (se você tentar executar novamente o seu comando mesmo com aplicativos diferentes, você notará que o endereço do vsyscall não muda). Seria bom remover ou pelo menos randomizar a localização da página vsyscall para impedir esse tipo de ataque. Infelizmente, os aplicativos dependem da existência e do endereço exato dessa página, portanto, nada pode ser feito.

Esse problema de segurança foi resolvido substituindo todas as instruções de chamada do sistema em endereços fixos por uma instrução trap especial. Um aplicativo que tenta chamar a página vsyscall fará uma armadilha no kernel, que então emulará a chamada de sistema virtual desejada no espaço do kernel. O resultado é uma chamada de sistema kernel emulando uma chamada de sistema virtual que foi colocada lá para evitar a chamada de sistema kernel em primeiro lugar. O resultado é um vsyscall que leva mais tempo para ser executado, mas, o que é crucial, não quebra a ABI existente. Em qualquer caso, a lentidão só será vista se o aplicativo estiver tentando usar a página vsyscall em vez do vDSO .

O vDSO oferece a mesma funcionalidade do vsyscall, enquanto supera suas limitações. O vDSO (Virtual Dynamically linked Shared Objects) é uma área de memória alocada no espaço do usuário que expõe algumas funcionalidades do kernel no espaço do usuário de maneira segura. Isso foi introduzido para solucionar as ameaças à segurança causadas pelo vsyscall. O vDSO é alocado dinamicamente, o que resolve questões de segurança e pode ter mais de 4 chamadas de sistema. Os links vDSO são fornecidos por meio da biblioteca glibc. O vinculador será vinculado à funcionalidade glibc vDSO , desde que tal rotina tenha uma versão vDSO que a acompanha , como gettimeofday. Quando seu programa é executado, se seu kernel não tem vDSO suporte, um syscall tradicional será feito.

Créditos e links úteis:

Giuseppe Pes
fonte
3
Por que o vsyscall pode ter apenas 4 chamadas de sistema? Existem 8 megabytes reservados para chamadas de sistema e apenas 1 página (na verdade, 3 funções, alinhadas por 1024 para 1 página) é usada.
salto
9

Eu só quero adicionar que agora em novos kernels, vDSOnão é usado apenas para syscalls "seguros", mas é usado para decidir qual mecanismo syscall é o método preferido para invocar um syscall no sistema.

incompetente
fonte