
Uno strumento di analisi e visualizzazione delle varianti che scansiona i codebase alla ricerca di vulnerabilità simili
![]()
C0deVari4nt è uno strumento di analisi delle varianti e visualizzazione che esamina i codebase alla ricerca di vulnerabilità simili. Sfrutta CodeQL, un motore di analisi semantica del codice, per interrogare il codice basandosi su modelli di query CodeQL controllati dall'utente e passa i risultati all'interfaccia client costruita con vis.js e React per ulteriori esplorazioni e visualizzazioni. Ciò consente un'analisi rapida e completa delle varianti basata su precedenti segnalazioni di vulnerabilità. La funzionalità di visualizzazione vis.js fornisce agli sviluppatori ulteriori informazioni sui percorsi di codice vulnerabili e permette loro di triare efficacemente le potenziali varianti.

L'incidente Log4Shell nel dicembre 2021 ha evidenziato le difficoltà che gli sviluppatori open-source affrontano nel rispondere alle segnalazioni di vulnerabilità. Dopo la patch iniziale per CVE-2021-44228, che consentiva ad attaccanti remoti non autenticati di prendere il controllo dei dispositivi che eseguivano versioni vulnerabili di Log4j 2, Apache ha rilasciato 3 patch aggiuntive per affrontare vulnerabilità correlate e casi limite non mitigati.
Gli sviluppatori open-source spesso non hanno una formazione adeguata nella revisione completa del codice e incontrano problemi nell'identificare le varianti di una vulnerabilità, portando a patch incomplete. Sebbene esistano suite di query CodeQL per facilitare l'analisi rapida del codebase, i risultati restituiti da queste suite possono presentare tassi di falsi positivi significativi. Inoltre, queste suite si basano su query predefinite che non supportano l'analisi delle varianti e non sono personalizzate per i singoli codebase. Di conseguenza, i progetti open-source spesso rispondono alle segnalazioni di vulnerabilità in modo frammentario, trascurando potenziali varianti.
C0deVari4nt fornisce una piattaforma per consentire agli sviluppatori di condurre facilmente l'analisi delle varianti senza il notevole carico di scrivere le proprie query CodeQL. Ciò offre agli sviluppatori la flessibilità di personalizzare i modelli CodeQL fornendo informazioni specifiche del codebase, come una particolare source e sink di una vulnerabilità. I risultati vengono visualizzati in una vista di database a grafo basata su vis.js, permettendo agli sviluppatori di identificare rapidamente potenziali varianti. In questo modo, gli sviluppatori possono affrontare efficacemente intere classi di bug a partire da una singola segnalazione di vulnerabilità.
C0deVari4nt è costruito utilizzando Python, CodeQL, vis.js e React per creare un'applicazione GUI interattiva che accetta input dall'utente e mostra le relazioni tra diversi percorsi di codice vulnerabili.

C0deVari4nt è composto dai seguenti 2 componenti principali:
Ulteriori dettagli sull'interfaccia client sono visibili di seguito:

cd api-server e poi dbextractor.py <file zip del database codeql> per decomprimere il contenuto del database CodeQLcd api-serverpip install -r requirements.txtuvicorn main:app --reload per avviare il server di sviluppo locale sulla porta 8000cd react-guinpm inpm start per avviare il server di sviluppo locale
strcat senza controlli dei limiti sull'argomento sourcestrncpy senza controlli dei limiti sull'argomento sourcesnprintf
malloc, calloc o realloc senza allocazione di memoria sufficiente per contenere un'istanza del tipo del puntatoreisAdditionalTaintStep per trasferire la contaminazione tra 2 funzioni non collegateisAdditionalTaintStep per trasferire la contaminazione tra puntatori che hanno gli stessi valori in fase di esecuzioneQuanto segue mostra i risultati di CodeQL per una query con recvfrom come source, mempool_alloc come passo di contaminazione aggiuntivo e memcpy come sink:

Questo risultato produce un totale di 180 nodi in 27 percorsi di codice diversi. I risultati sono rappresentati in una semplice interfaccia neo4j qui sotto:

Inserendo questa query nel nostro strumento, siamo stati in grado di identificare occorrenze duplicate di ciascun nodo, source e sink e di unire le relazioni dei nodi.
Ciò ha prodotto un grafo significativamente più pulito con un totale di 11 nodi unici, mantenendo comunque tutti i 27 percorsi di codice unici:

I risultati possono essere ulteriormente categorizzati nei rispettivi percorsi attraverso la nostra funzione di etichettatura dei percorsi:

