L'azienda Google ha pubblicato i codici sorgente dello strumento GWPSan, progettato per identificare gli errori durante l'esecuzione delle applicazioni compilate per architetture x86-64 e ARM64. GWPSan è distribuito come una libreria condivisa, che viene collegata all'avvio dell'applicazione tramite LD_PRELOAD e utilizza meccanismi di interruzione (PERF_TYPE_BREAKPOINT) e campionamento dei processi disponibili nel kernel Linux per analizzare l'esecuzione del programma. Il codice è scritto in C++ e viene distribuito con licenza Apache 2.0.
GWPSan è strutturato come un framework modulare, che supporta il caricamento di moduli con implementazioni dei rilevatori per diverse classi di errori. GWPSan esegue un'analisi dinamica, attivata tramite gestori di segnali, che consente di operare senza modificare il codice eseguibile dell'applicazione. Per il funzionamento efficace della maggior parte dei rilevatori è necessaria la compilazione dell'applicazione con determinati flag del compilatore, che aggiungono i metadati necessari. È richiesto almeno Clang 18 e il kernel Linux 6.4.
Attualmente sono disponibili tre rilevatori:
- UAR (Use-after-return) — identifica gli errori causati dall'utilizzo di oggetti nello stack dopo l'uscita dalla funzione in cui questi oggetti sono stati definiti. La protezione è organizzata tramite l'intercettazione dei punti di ingresso e uscita per la funzione: all'ingresso viene sostituito lo stack con una copia da utilizzare durante la funzione, e all'uscita viene ripristinato il vecchio stato dello stack.
- TSan (Thread Sanitizer) — rileva le condizioni di gara tra thread (Data-race), che si verificano quando diversi thread in esecuzione simultanea possono leggere o modificare aree comuni di memoria senza utilizzare primitive di sincronizzazione. La protezione è basata sull'uso di punti di interruzione hardware legati a aree di memoria condivise. Un gestore che si attiva interrompe momentaneamente l'esecuzione del thread durante l'accesso alla memoria e, durante questa pausa, verifica se un punto di interruzione è scattato per un altro thread.
- LMSan (Lightweight Memory Sanitizer) — rileva l'uso di dati non inizializzati nella memoria. Il rilevator è contrassegnato come sperimentale e non raccomandato per l'uso.
GWPSan analizza il codice eseguibile del programma utilizzando il framework DynamoRIO per decodificare il codice macchina in istruzioni ISA astratte, che vengono poi eseguite usando l'emulazione. Attraverso segnali periodici da un timer viene chiamato il gestore unificato, che ad ogni invocazione esegue una certa porzione di istruzioni per il flusso in analisi. In caso di rilevamento durante l'esecuzione di determinate istruzioni, viene attivato un rilevatore di problemi specifico per tali istruzioni, ad esempio, per le istruzioni che accedono alla memoria, viene attivato un rilevatore di condizioni di gara.
Fonte: opennet.ru
