Come deve essere verificata la sicurezza del codice sorgente?

40

Come verificare se il codice sorgente di un progetto open source non contiene contenuti dannosi? Ad esempio, in un insieme di file di codice sorgente con un totale di 30.000 righe, potrebbero esserci 1-2 righe contenenti un'istruzione dannosa (ad esempio chiamata curl http://... | bash ).

Questi progetti non sono ben noti e non si può presumere che siano ben mantenuti. Pertanto, la sicurezza di riutilizzare il loro codice sorgente del progetto non può basarsi semplicemente sulla fiducia cieca (mentre dovrebbe essere ragionevole supporre che sarebbe sicuro scaricare, verificare, compilare ed eseguire cmake direttamente, non sembra buono a ciecamente usa una libreria arbitraria ospitata su GitHub).

Qualcuno ha suggerito di filtrare il codice sorgente e rimuovere tutti i caratteri non ASCII e invisibili (tranne alcuni banali come le interruzioni di riga). Quindi apri ciascun file con un editor di testo e leggi manualmente ogni riga. Questo è un po 'dispendioso in termini di tempo, richiede la massima attenzione quando leggo il codice, e in realtà è abbastanza incline agli errori.

In quanto tale, sto cercando metodi generali per gestire questo tipo di situazioni. Ad esempio, sono disponibili strumenti standard? Qualcosa a cui devo prestare attenzione se devo davvero leggere manualmente?

    
posta tonychow0929 26.10.2018 - 14:37
fonte

5 risposte

22

Esistono approcci automatici e manuali.

Per automatizzare, puoi iniziare con lgtm - un analizzatore di codice statico libero per progetti open source e quindi passare a soluzioni SAST più complesse.

Per il manuale: puoi creare un modello di minaccia della tua app ed eseguirlo attraverso la OWASP ASVS lista di controllo partendo dalle parti più critiche. Se c'è una cancellazione di file nel tuo modello di minaccia - chiama qualcosa del genere: grep -ir 'os.remove(' .

Ovviamente è meglio combinarli entrambi.

    
risposta data 26.10.2018 - 14:51
fonte
19

Puoi farlo da solo o fidarti di qualcun altro

Come per la maggior parte delle cose nella vita, devi farlo tu stesso o fidarti di qualcun altro. Qui trusting copre sia l'assenza di intenti dannosi sia la capacità di eseguire correttamente l'attività.

Ad esempio, puoi presentare le tue tasse te stesso o fiducia a un consulente fiscale per farlo (che non solo non dovrebbe tentare di frodare te, ma anche sapere come file le tasse!).

Se sei un'azienda, da solo verrà effettivamente eseguita da uno o più dei tuoi dipendenti, che a loro volta devono essere considerati attendibili.

La terza parte di cui ti fidi, non ha bisogno di essere una singola persona. Potrebbe essere il Microsoft Windows Development Team , o gli sviluppatori principali di Wordpress .

Sulla sicurezza del codice sorgente, vuoi che l'esperto non solo sia ben intenzionato, ma sia anche ben informato per codificare il programma in modo sicuro / trovare potenziali problemi di sicurezza che potrebbero esserci.

(più alcuni sistemi di bordo aggiuntivi quando sono trattati nel suo insieme, ad esempio si desidera che il loro codice non venga compromesso mentre lo hanno caricato nel repository o l'email del dipendente che afferma che i risultati vengono sostituiti da un hacker malintenzionato all'interno della tua rete per dire che l'applicazione andava bene)

Dovrai valutare le tue opzioni, valutare il rischio associato a ciascuna di esse e scegliere il percorso che meglio si adatta ai tuoi interessi (e al budget!).

Se dovessi controllare la sicurezza del codice sorgente di un blog che utilizzava Wordpress, in genere confido che il codice originale fosse corretto1¹ e controlla le differenze tra la versione ufficiale e quella usata . Se il sito web è stato compromesso, ciò renderebbe molto più facile scoprirlo.

¹ Ovviamente controllando il registro delle modifiche delle versioni successive se ne è stato utilizzato uno obsoleto.

Tuttavia, se fosse stato sviluppato dal nipote del proprietario, mi aspetterei di trovare molte vulnerabilità lì e raccomanderei un controllo approfondito di tutto.

Nel tuo caso, dovresti valutare il rischio e il costo dello sviluppo dell'equivalente di quella libreria (prendi in considerazione che la possibilità di problemi nel tuo prodotto interno non è zero, e dipenderà - tra le altre cose - da la qualità delle persone coinvolte) rispetto al rischio e al costo dell'auditing e dell'utilizzo di tale libreria.

Ora, ci possono essere fattori attenuanti che semplificano il controllo. Ad esempio, se il codice non affidabile può essere eseguito in una macchina virtuale isolata, ciò potrebbe essere sufficiente per non richiedere ulteriori controlli (anche in questo caso, si sta attendendo l'implementazione della VM). Oppure può essere considerato sufficiente per controllare le parti di quel programma eseguite come root.

Per l'auditing di una libreria, gli analizzatori di codice possono aiutare a individuare parti problematiche (come indicato), ma per considerarlo pulito dovrei avere qualcuno che legge e capisce il codice, anche se superficialmente.

Ad esempio, la possibilità di rimuovere file arbitrari non è dannosa di per sé . Devi capire il programma per sapere se ha senso.

Ancora una volta, è una questione di minacce e rischi per quello che stai facendo. Se si preoccupa solo che la libreria esfiltrizzi i dati, il filtraggio delle connessioni al firewall potrebbe essere sufficiente. Se si è interessati alla libreria che elimina file importanti (e per qualche strana ragione non si può negare tale autorizzazione), si potrebbe semplicemente scorrere un gruppo di codice che eseguiva solo calcoli matematici. Se quella libreria calcola i parametri per lanciare un razzo ... beh, è meglio che anche quei calcoli siano corretti!

    
risposta data 26.10.2018 - 18:04
fonte
3

Utilizza un servizio

Esistono servizi professionali come Black Duck e Whitesource che controllano le dipendenze open-source.

    
risposta data 27.10.2018 - 00:04
fonte
2

Se usi il codice di qualcuno else sei più o meno alla mercé dei meccanismi di integrità forniti dai manutentori - questo è vero per tutto il software, non solo per l'open source.

Sia per il software open source commerciale che pacchettizzato (ad es. rpm, deb ecc) la firma del codice è comune - questo dimostra che hai ricevuto ciò che il firmatario voleva che tu ricevessi.

Nel caso del codice sorgente, vengono solitamente utilizzati i checksum. Ma questo ha poco valore a meno che il checksum sia accessibile da una fonte diversa il codice sorgente.

Si noti che questi sono destinati esclusivamente alla protezione contro un attacco di tipo MITM sull'applicazione.

use an arbitrary library hosted on GitHub

... nel qual caso tutti i file / versioni hanno un hash pubblicato su Github - per sovvertire questo, un utente malintenzionato dovrebbe sovvertire Github stesso o l'account Github del manutentore - Posso biforcare qualsiasi cosa su Github ma è quindi attribuito a me e il repository originale non è interessato a meno che il maintainer non accetti le mie richieste di pull. Potresti avere più fiducia nell'integrità di Github rispetto ai manutentori del codice, nel qual caso sarebbe ragionevole fidarsi di un hash pubblicato nello stesso posto del codice sorgente.

Nessuno di questi meccanismi fornisce protezione contro il malware che è stato iniettato prima dell'applicazione della verifica dell'integrità.

Dove hai accesso al codice sorgente, hai la possibilità di esaminare il codice (che è molto più semplice dell'esame degli eseguibili) e ci sono strumenti automatici per farlo, come quelli suggeriti da odo.

    
risposta data 26.10.2018 - 15:12
fonte
1

Gli analizzatori statici non funzionano sempre

Il controllo di os.remove in qualsiasi punto del codice non funzionerà su tutti gli aggressori, poiché alcuni potrebbero semplicemente fare eval("os" + ".remove") . È possibile eseguire espressioni reiterate più avanzate, ma l'autore dell'attacco può sempre rendere più complicato il codice, caso per caso:

x = "r"
eval("os." + x + "emove")

Più teoricamente, a causa del problema di interruzione, è impossibile controllare tutti gli stati potenziali per vedere se viene invocata una chiamata di sistema pericolosa.

Un utente malintenzionato può facilmente evitare gli analizzatori di codici statici costruendo un piccolo interprete per un linguaggio personalizzato che esegue operazioni dannose.

Esecuzione del codice all'interno di un contenitore / honeypot

Tutti i software eventualmente interagiscono con il sistema operativo. Eseguendo il software all'interno di un contenitore o honeypot con strace o uno strumento simile, puoi vedere quali informazioni tentano di raccogliere dal programma o dalla libreria.

Il programma tenta di capire se è in esecuzione all'interno di un container? Legge i file che non è previsto o addirittura li modifica? Quindi potresti avere un software dannoso.

Non funzionerà sempre, potrebbe essere necessaria qualche ispezione manuale

Alcuni codici maligni si attivano solo in date specifiche, ma almeno vedrai che è possibile accedervi. Da lì puoi controllare dove avviene il codice e perché.

    
risposta data 29.10.2018 - 10:41
fonte

Leggi altre domande sui tag