A empresa Google publicou os códigos-fonte da ferramenta GWPSan, projetada para identificar erros durante a execução de aplicações compiladas para as arquiteturas x86-64 e ARM64. O GWPSan é construído como uma biblioteca compartilhada, que é vinculada no momento da execução do aplicativo usando LD_PRELOAD e utiliza os mecanismos disponíveis no núcleo do Linux para análise do funcionamento do programa, como parada (PERF_TYPE_BREAKPOINT) e amostragem de processos. O código é escrito em C++ e distribuído sob a licença Apache 2.0.
O GWPSan é estruturado como um framework modular, suportando a adição de módulos com implementações de detectores de diferentes classes de erros. O GWPSan realiza uma análise dinâmica, ativada através de manipuladores de sinais, permitindo assim evitar a modificação do código executável da aplicação. Para o funcionamento efetivo da maioria dos detectores, é necessária a compilação da aplicação com determinadas flags do compilador, que acrescentam os metadados necessários. O funcionamento requer no mínimo o Clang 18 e o kernel Linux 6.4.
Atualmente, estão disponíveis três detectores:
- UAR (Use-after-return) — detecta erros causados pelo uso de um objeto na pilha após a saída da função em que o objeto foi definido. A proteção é organizada através da interceptação dos pontos de entrada e saída da função — ao entrar, uma cópia da pilha é substituída para uso durante a execução da função, e ao sair, o estado antigo da pilha é restaurado.
- TSan (Thread Sanitizer) — identifica estados de corrida entre threads (Data-race), que ocorrem quando diferentes threads em execução simultânea podem ler ou modificar áreas de memória compartilhadas sem utilizar primitivas para a sincronização. A proteção é construída com o uso de pontos de parada de hardware, que são vinculados a áreas de memória compartilhadas. Um manipulador que é acionado interrompe a execução da thread por um breve período ao acessar a memória e, durante essa pausa, verifica se houve disparo de um ponto de parada para outra thread.
- LMSan (Lightweight Memory Sanitizer) — detecta o uso de dados não inicializados na memória. Este detector é marcado como experimental e não é recomendado para uso.
GWPSan analisa o código executável do programa, utilizando o framework DynamoRIO para decodificar o código de máquina em instruções ISA abstratas, que são então executadas através de emulação. Através de sinais periódicos do temporizador, um manipulador unificado é chamado, que a cada invocação executa uma certa porção de instruções para o fluxo analisado. No caso de ser detectada a execução de instruções específicas, um detector de problemas específico para essas instruções é ativado; por exemplo, para instruções que acessam a memória, um detector de condições de corrida é acionado.
Fonte: opennet.ru
