Google ha pubblicato il codice sorgente dello strumento GWPSan, progettato per rilevare errori durante l'esecuzione di applicazioni compilate per architetture x86-64 e ARM64. GWPSan è implementato come una libreria condivisa, che viene collegata all'avvio dell'applicazione tramite LD_PRELOAD e utilizza i meccanismi di interruzione (PERF_TYPE_BREAKPOINT) e campionamento dei processi disponibili nel kernel Linux per analizzare il comportamento del programma. Il codice è scritto in C++ e distribuito sotto la licenza Apache 2.0.
GWPSan è strutturato come un framework modulare, che supporta il caricamento di moduli con implementazioni per rilevatori di diverse classi di errori. GWPSan esegue un'analisi dinamica, attivata tramite gestori di segnali, il che permette di evitare la modifica del codice eseguibile dell'applicazione. Per il corretto funzionamento della maggior parte dei rilevatori, è necessaria la compilazione dell'applicazione con specifici flag del compilatore, che aggiungono i metadati necessari. Sono richiesti almeno Clang 18 e kernel Linux 6.4.
Attualmente sono disponibili tre rilevatori:
- UAR (Use-after-return) — rileva errori causati dall'uso di un oggetto nello stack dopo l'uscita dalla funzione in cui tale oggetto è stato definito. La protezione è organizzata tramite l'intercettazione dei punti di ingresso e uscita per la funzione: all'ingresso, lo stack viene sostituito con una copia da utilizzare durante l'esecuzione della funzione, mentre all'uscita, lo stato precedente dello stack viene ripristinato.
- TSan (Thread Sanitizer) — identifica le condizioni di gara tra i thread (Data-race), che si verificano quando thread diversi in esecuzione simultanea possono leggere o modificare aree di memoria condivise, senza utilizzare primitiva di sincronizzazione. La protezione si basa sull'uso di punti di interruzione hardware, associati ad aree di memoria condivisa. Un gestore di interruzione sospende temporaneamente l'esecuzione del thread durante l'accesso alla memoria e, durante questa sospensione, controlla se è scattato un punto di interruzione per un altro thread.
- LMSan (Lightweight Memory Sanitizer) — determina l'uso di dati non inizializzati nella memoria. Il rilevatore è stato contrassegnato come sperimentale e non raccomandato per l'uso.
GWPSan analizza il codice eseguibile dell'applicazione utilizzando il framework DynamoRIO per decodificare il codice macchina in istruzioni ISA astratte, che vengono poi eseguite tramite emulazione. Mediante segnali periodici da un timer, viene chiamato un gestore unificato che, ad ogni chiamata, esegue una certa porzione di istruzioni per il flusso in analisi. In caso di rilevamento durante l'esecuzione di istruzioni specifiche, viene attivato un rilevatore di problemi specifico per quelle istruzioni; ad esempio, per le istruzioni che accedono alla memoria, viene attivato un rilevatore di condizioni di race.
Fonte: opennet.ru
