Rilevamento di malware basato su anomalie nelle applicazioni Web

7

Sono parzialmente responsabile della sicurezza e del rilevamento di malware (in generale) di un numero enorme di account di hosting. I nostri metodi si basano molto sul rilevamento basato su firme fornito da ClamAV per il quale abbiamo creato anche un database di firme abbastanza decente (oltre 500 campioni).

Riceviamo fino a 30-40 notifiche su base giornaliera per l'individuazione di codici maligni nell'account di un utente. Con il passare del tempo, gli hacker diventano più intuitivi e riescono sempre a tenere il passo con il progresso della nostra (whitehat community nel suo complesso) mentre tentiamo di interrompere i loro tentativi di sfruttare le vulnerabilità. Tuttavia, sembra che il rilevamento basato sulla firma di codice dannoso stia diventando sempre più insufficiente: continuiamo a trovare nuovi campioni di malware che la scansione non è stata in grado di rilevare inizialmente. Pertanto mi sono preso la libertà di provare e progettare un sistema per il rilevamento di anomalie severe.

Chiedo consiglio se le mie attuali pianificazioni possono essere considerate ragionevoli poiché questa è la prima volta che intraprendo questo compito.

Penso che più condizioni controllo il file, i risultati migliori che posso ottenere (eliminando i falsi positivi il più possibile). Finora ho creato il seguente elenco di condizioni:

  • posizione file (5%)
  • nome file (10%)
  • codice ordine / allineamento (5%)
  • pattern ripetuti (5%)
  • nomi strani / non logici di strutture di dati (10%)
  • impilamento di più funzioni (3%)
  • segnalazione errori disabilitata (5%)
  • soppressione dell'errore usata (2%)
  • contiene hex (es. \ x73) (3%)

Dove ciascuna delle condizioni fornisce al file una certa percentuale di potenziale malintenzionato o contenuto dannoso. Le mie domande sono :

  1. Questo è un buon approccio per lo sviluppo di un rigoroso sistema di rilevamento basato sull'anomalia? Se no, perché?
  2. Puoi fornirmi degli esempi di cos'altro posso controllare un file contro? Qualche consiglio o qualche informazione utile?

Considera che:

  1. È indirizzato alle applicazioni web e principalmente ai file PHP;
  2. Molti dei nostri clienti usano CMS. Forse è meglio basare il sistema su un determinato CMS?

Grazie.

    
posta McJohnson 02.03.2017 - 23:25
fonte

2 risposte

1

Attualmente sto facendo qualche ricerca nell'area della sicurezza della rete, dove il mio argomento è il rilevamento di anomalie per i messaggi di log. Tuttavia, spero di essere in grado di fornire alcune informazioni sul tuo problema.

(1) Le firme sono brutte, ma funzionano. Sebbene tutti parlino di rilevamento di anomalie e argomenti simili, al giorno d'oggi le firme restano il modo più affidabile per rilevare codice / attività / ecc. Quindi dovresti continuare a usarli e non sperare che qualche rilevamento di anomalie sia in grado di completamente sostituirlo.

(2) Le firme sono, ovviamente, molto limitate e non possono identificare nuovi tipi di codice / attacchi / ecc. Poi ci sono tentativi di risolvere questo problema con il rilevamento di anomalie. Lo svantaggio principale del rilevamento di anomalie è che genera sempre falsi allarmi positivi che è necessario elaborare e filtrare. La tendenza attuale è quella di costruire un sistema ibrido: prima applica le firme e forse alcune query, quindi esegui il rilevamento delle anomalie in aggiunta ad esso.

(3) Dovrebbe essere sicuramente possibile creare un approccio di rilevamento delle anomalie per il tuo problema basato su alcune tecniche di apprendimento automatico (basate sul tuo elenco di condizioni; in teoria, può anche essere possibile analizzare il codice PHP, ovvero eseguire un'anomalia del codice statico rilevamento, ma questo potrebbe essere piuttosto complicato / grande progetto). Tuttavia, non mi aspetto che catturerà tutto il codice maligno. Il numero realistico potrebbe essere un tasso di rilevamento del 70-80% con una percentuale di falsi positivi del 10-20%. Quindi se controlli 1000 file e 10 di questi sono dannosi, probabilmente nel migliore dei casi sarai in grado di sviluppare un sistema che ti restituirà 100 avvisi, in cui verranno rilevati 8 di 10 file dannosi, ma il resto (diciamo 92 altri avvisi) sarà falso positivo. Inoltre, probabilmente 6-7 di questi 8 puoi aver già rilevato con firme e query.

Spero di non essere troppo pessimista qui. A volte, per casi d'uso specifici, è possibile ottenere una percentuale positiva del 98-99% con una percentuale di falsi positivi dell'1-2%, ma non sono sicuro che tu abbia così tanta fortuna nel tuo caso. Inoltre non conosco abbastanza dettagli sul tuo caso d'uso per fare previsioni.

(4) Tuttavia, se si è in grado di classificare i risultati, la parte superiore dell'output di rilevamento anomalie conterrà più avvisi positivi veri e meno falsi positivi. Ad esempio, se il tuo sistema restituisce 100 avvisi ordinati, puoi guardare solo i primi 30 di essi. E questi 30 conterranno 6 risultati positivi veri e solo 24 falsi positivi (che è in qualche modo migliori di 8 veri positivi e 92 falsi positivi). Successivamente, se si guardano i 5 avvisi più altamente classificati, conterranno probabilmente 1-2 veri positivi e 3-4 falsi positivi. E questo è ciò che puoi controllare quotidianamente oltre ai risultati di rilevamento basati sulla firma.

Puoi assumere un esperto di data mining / machine learning per creare un sistema del genere, o provare a farlo da solo, se hai competenze sufficienti.

Non ho trovato documenti di ricerca rilevanti (il che non è un buon segno), ma spero che quanto segue possa essere relativamente utile per te:

Infine, dovrebbero esserci alcune soluzioni alternative a questo problema. Ho cercato su Google e qui è quello che ho trovato finora:

Inoltre non troppo (solo un link), ma spero che tu possa provare a cercare di più, ci dovrebbero essere alcune tecniche come il sandboxing. Forse puoi controllare questo pdf per informazioni pertinenti.

    
risposta data 03.03.2017 - 11:36
fonte
0

Questo non è inteso come una risposta completa alla tua domanda, ma è più lungo di quello che si adatta a un commento, quindi ecco qui:

Penso che sia un approccio interessante, purché tu sappia che ovviamente non sarà mai in grado di catturare tutto il malware, perché indipendentemente dai criteri che hai impostato, possono essere risolti.

Ad esempio, l'ultimo, "contiene hex", può essere facilmente aggirato specificando i valori esadecimali come una matrice di numeri decimali o come una stringa codificata in base64 e "l'ordinamento del codice" può essere raggiunto automaticamente eseguendo un file tramite xxxtidy, dove xxx rappresenta la versione del tuo linguaggio di programmazione preferita di un codice più ordinato.

Inoltre non sono sicuro di come prevedi di individuare "nomi bizzarri e non logici delle strutture dati". Sembra un problema impossibile per me. E non sono sicuro di cosa significhi "accatastamento di più funzioni"; se ho capito bene, è qualcosa che genererà un enorme numero di falsi positivi.

Tuttavia, la ragione per cui trovo interessante questo approccio è che, anche se non sarà mai perfetto, probabilmente aiuterà a rilevare programmi sospetti, proprio come jslint, pylint ecc. aiutano a individuare problemi nel codice normale.

Se conosci il linguaggio di programmazione con cui hai a che fare, puoi anche verificare chiamate sospette come le chiamate che tentano di avviare una shell di sistema, chiamate che tentano di aprire socket di rete, reindirizzare input o output, chiamate a eval, chiamate che tenta di aprire file esterni per leggere o scrivere, ecc.

Attuazione

Questo è il punto in cui penso che ti imbatterai in difficoltà, almeno se stai basando la tua idea sulla scansione di singoli file php. Non vorrei scrivere parser in grado di rilevare in modo affidabile tutti i criteri citati. Sembra un sacco di lavoro.

Alternativa

Un'alternativa alla ricerca di schemi di codice specifici nei file php potrebbe essere quella di cercare le conseguenze specifiche di tali schemi di codice che vengono eseguiti. Ad esempio, se stai cercando codice che tenta di aprire un socket di rete, probabilmente è abbastanza difficile da rilevare, ma eseguire periodicamente nmap o netstat e controllare le porte che non dovrebbero essere aperte è facile. Il controllo del codice che scrive su file esterni è difficile, ma la creazione di un elenco di, ad esempio, tutti i file eseguibili in / tmp o i file con timestamp recente in / usr / local / bin, è semplice. Puoi anche cercare i processi della shell radice attiva e così via.

Arte precedente

Ci sono vari programmi che già ne fanno parte. Ad esempio, rkhunter sotto linux cerca modifiche sospette al tuo file system, tripwire e snort sarebbero altre due soluzioni da verificare.

Anche una sessione googling veloce visualizza link e link , che entrambi sembrano fare esattamente quello che stai proponendo.

    
risposta data 03.03.2017 - 01:24
fonte

Leggi altre domande sui tag