Ultimamente le aziende di tecnologia hanno perso la testa per l’apprendimento automatico. Dicono che risolvono i problemi che prima potevano risolvere solo le persone. Alcuni lo chiamano “intelligenza artificiale”. L’apprendimento automatico interessa in maniera particolare la sicurezza IT ma il panorama delle minacce sta cambiando rapidamente e abbiamo bisogno di trovare le soluzioni adeguate. Alcuni osano chiamare l’apprendimento automatico “intelligenza artificiale” solo per il gusto di farlo.
La tecnologia dipende dalla velocità e dalla costanza, non dai trucchetti. E l’apprendimento automatico si basa sulla tecnologia, per questo è abbastanza facile spiegarlo in termini semplici. Quindi, mettiamoci al lavoro. Risolveremo un grosso problema grazie a un algoritmo (un algoritmo basato sull’apprendimento automatico). Il concetto è abbastanza semplice e fornisce grandi e preziose idee.
Problema: distinguere un testo sensato da uno incomprensibile
Un testo scritto da un essere umano (in questo caso, un articolo di Terry Pratchett) avrebbe un aspetto del genere:
Give a man a fire and he's warm for the day. But set fire to him and he's warm for the rest of his life
(in italiano: fai un fuoco per un uomo e starà al caldo per un giorno. Dai fuoco a un uomo e starà al caldo per il resto della sua vita)
It is well known that a vital ingredient of success is not knowing that what you're attempting can't be done
(in italiano: l’ingrediente del successo è non sapere che quello che stai provando a fare non si può fare)
The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it
(in italiano: il problema dell’avere una mentalità aperta è naturalmente che le persone insistono col venirti dietro e col cercare di metterci dentro delle cose)
Un testo incomprensibile avrebbe un aspetto del genere:
DFgdgfkljhdfnmn vdfkjdfk kdfjkswjhwiuerwp2ijnsd,mfns sdlfkls wkjgwl
reoigh dfjdkjfhgdjbgk nretSRGsgkjdxfhgkdjfg gkfdgkoi
dfgldfkjgreiut rtyuiokjhg cvbnrtyu
Il nostro compito è quello di sviluppare un algoritmo d’apprendimento automatico che distingua i due tipi di testi. Sebbene sia un compito banale per un essere umano, si tratta di una vera sfida. Ci vuole molto per formalizzare la differenza. Noi utilizziamo l’apprendimento automatico: forniamo alcuni esempi all’algoritmo e lasciamo che “impari” per rispondere in maniera affidabile alla domanda” è un testo scritto da un essere umano o è un testo incomprensibile?”. Ogni volta che un programma antivirus analizza un file, sta facendo esattamente questo.
Dal momento che trattiamo l’argomento tralasciando il contesto della sicurezza IT e dato che lo scopo principale di un software antivirus è trovare un codice pericoloso in grandi quantità di dati puliti, faremo riferimento al testo sensato utilizzando il termine “pulito” e a quello incomprensibile utilizzando il termine “pericoloso”.
Soluzione: utilizzare un algoritmo
Il nostro algoritmo calcolerà la frequenza con cui una particolare lettera viene seguita da un’altra, analizzando tutte le possibili coppie di lettere. Ad esempio, per la nostra prima frase “Give a man a fire and he’s warm for the day. But set fire to him and he’s warm for the rest of his life” (Fai un fuoco per un uomo e starà al caldo per un giorno. Dai fuoco a un uomo e starà al caldo per il resto della sua vita) che si sa essere pulita, la frequenza delle coppie di lettere è questa:
Bu — 1
Gi — 1
an — 3
ar — 2
ay — 1
da — 1
es — 1
et — 1
fe — 1
fi — 2
fo — 2
he — 4
hi — 2
if — 1
im — 1
Per farla facile, non prendiamo in considerazione la punteggiatura e gli spazi. Quindi, nella frase, la a è seguita dalla n tre volte, la f è seguita dalla i due volte, mentre la а è seguita dalla y una volta.
In questa fase, capiamo che non basta una frase per fare in modo che il nostro modello impari: dobbiamo analizzare un testo più lungo. Ad esempio, contiamo le combinazioni di lettere in Via col vento di Margaret Mitchell (per essere precisi, il primo 20% del libro). Eccone un paio:
he — 11460
th — 9260
er — 7089
in — 6515
an — 6214
nd — 4746
re — 4203
ou — 4176
wa — 2166
sh — 2161
ea — 2146
nt — 2144
wc — 1
Come potete vedere, la probabilità di trovare la combinazione he è due volte più alta rispetto a quella di trovare an. E la combinazione wc si può trovare solo una volta (nella parola “newcomer”, “principiante” in italiano).
Quindi, una volta che abbiamo un “modello” di testo pulito, come possiamo usarlo? In primo luogo, per definire quale sia la probabilità di una riga “pulita” o “pericolosa”, definiremo la sua autenticità. Definiremo la frequenza di ogni coppia di lettere con l’aiuto di un modello (valutando quanto sia realistica una combinazione di lettere) e poi moltiplicare questi numeri:
F(Gi) * F(iv) * F(ve) * F(e ) * F( a) * F(a ) * F( m) * F(ma) * F(an) * F(n ) * …
6 * 364 * 2339 * 13606 * 8751 * 1947 * 2665 * 1149 * 6214 * 5043 * …
Nell’ultima valutazione di autenticità, prendiamo in considerazione il numero di simboli nella riga: più questa è lunga, più numeri moltiplichiamo. Quindi, per fare in modo che il valore vada bene sia per le righe corte che per quelle lunghe, facciamo una specie di magia matematica (estraiamo la radice quadrata dell’ “ampiezza della riga in questione meno uno” dal risultato.
Utilizzare il modello
Adesso possiamo tirare qualche somma: più alto è il numero che calcoliamo, più la riga in questione è adatta al nostro modello e più la riga è simile a quella scritta da un essere umano. Se il testo ne possiede un numero elevato, possiamo definirla pulito.
Se la riga in questione contiene tante combinazioni strane (come wk, zg, yq, ecc), è più probabile che sia pericolosa.
Per quanto riguarda la riga scelta per l’analisi, la somiglianza (“autenticità”) misurata in punti è questa:
Give a man a fire and he's warm for the day. But set fire to him and he's warm for the rest of his life
(Fai un fuoco per un uomo e starà al caldo per un giorno. Dai fuoco a un uomo e starà al caldo per il resto della sua vita) — 1984 punti—
It is well known that a vital ingredient of success is not knowing that what you're attempting can't be done
(L’ingrediente del successo è non sapere che quello che stai provando a fare non si può fare) — 1601 punti
The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it
(Il problema dell’avere una mentalità aperta è naturalmente che le persone insistono col venirti dietro e col cercare di metterci dentro delle cose) — 2460 punti
DFgdgfkljhdfnmn vdfkjdfk kdfjkswjhwiuerwp2ijnsd,mfns sdlfkls wkjgwl — 16 punti
reoigh dfjdkjfhgdjbgk nretSRGsgkjdxfhgkdjfg gkfdgkoi — 9 punti
dfgldfkjgreiut rtyuiokjhg cvbnrtyu — 43 punti
Come potete vedere, alle righe pulite sono stati assegnati più di 1000 punti, mentre a quelle pericolose nemmeno 100 punti. Sembra che il nostro algoritmo stia funzionando proprio come ci aspettavamo.
Per quanto riguarda assegnare un punteggio “alto” o “basso” nel contesto, il modo migliore è delegare anche questo lavoro alla macchina e lasciarla apprendere. Per fare questo, le presentiamo un numero di righe pulite, calcoliamo la loro autenticità, le presentiamo qualche riga pericolosa e ripetiamo il procedimento. Calcoleremo successivamente la linea guida per la valutazione. Nel nostro caso, si tratta di 500 punti.
Nella vita reale
Pensiamo un attimo a quello che abbiamo appena fatto.
1. Abbiamo definito gli indicatori delle righe pulite (ad esempio, coppie di caratteri).
Nella vita reale, quando si sviluppa un antivirus, gli analisti definiscono anche le funzionalità dei file e altri oggetti. Ad ogni modo, il loro contributo è molto importante: definire quali caratteristiche valutare nell’analisi è ancora un compito degli esseri umani e il livello di competenza dei ricercatori e l’esperienza diretta influenzano la qualità delle funzionalità. Ad esempio, chi ha detto che si devono analizzare i caratteri in coppia e non a gruppi di tre? Anche ipotesi del genere vengono valutate nei laboratori di antivirus. È importante dire che noi di Kaspersky Lab utilizziamo l’apprendimento automatico per selezionare le funzionalità migliori e complementari.
2. Abbiamo utilizzato gli indicatori per costruire un modello matematico, che abbiamo fatto apprendere basandoci su una serie di esempi.
Ovviamente, nella vita reale utilizziamo modelli un po’ più complessi. I risultati migliori provengono da un insieme di schemi decisionali creati dalla tecnica del Gradient boosting, ma la nostra tensione alla perfezione non ci permette di stare fermi e accettare che non possiamo fare meglio.
3. Abbiamo utilizzato il modello matematico per calcolare “l’autenticità”.
Ad essere onesti, nella vita reale facciamo esattamente l’opposto (calcoliamo l’indice di “pericolosità”). Non sembra essere molto diverso a prima vista, ma immaginatevi quanto una riga in un’altra lingua o in un altro alfabeto sembrerebbe non autentica al nostro modello. È inaccettabile che un fornisca risultati falsi quando controlla una nuova serie di file solo perché ancora non li conosce.
Un’alternativa all’apprendimento automatico?
20 anni fa, quando i malware erano di meno, i testi incomprensibili potevano essere facilmente rilevati dalle firme (ad esempio, frammenti peculiari). Negli esempi precedenti, le firme avrebbero un aspetto del genere:
DFgdgfkljhdfnmn vdfkjdfk kdfjkswjhwiuerwp2ijnsd,mfns sdlfkls wkjgwl
reoigh dfjdkjfhgdjbgk nretSRGsgkjdxfhgkdjfg gkfdgkoi
Se l’antivirus avesse scansionato il file e avesse trovato la combinazione erwp2ij, avrebbe detto: “Aha, si tratta di un testo incomprensibile #17”. E se avesse trovato la combinazione gkjdxfhg, l’avrebbe considerata “testo incomprensible #139”.
Poi, 15 anni fa, quando i malware sono aumentati in maniera significativa, è intervenuto il rilevamento “generico”. Un analista di virus ha definito le regole che, se applicate a un testo sensato, sarebbero come queste:
1. La lunghezza di una parola dovrebbe essere compresa tra 1 e 20 caratteri.
2. Le lettere maiuscole e i numeri raramente si trovano nel mezzo di una parola.
3. Le vocali sono combinate con le consonanti in maniera abbastanza omogenea.
E così via. Se la riga non rispetta una di queste regole, viene rilevata come pericolosa.
In sostanza, il principio funziona allo stesso modo, ma in questo caso si sostituiscono una serie di regole, che gli analisti devono scrivere manualmente, con un modello matematico.
Poi, 10 anni fa, quando il numero di modelli di malware è cresciuto fino a sorpassare qualsiasi livello immaginabile, gli algoritmi dell’apprendimento automatico hanno iniziato lentamente a farsi strada tra i programmi antivirus. Inizialmente, in termini di complessità non si sono allontanati molto dal primo algoritmo che abbiamo descritto in precedenza nell’esempio. Noi però abbiamo assunto in continuazione specialisti e abbiamo esteso la nostra competenza. Di conseguenza, tra tutti gli antivirus, possediamo il livello più alto di rilevamento.
Oggi, nessun antivirus funzionerebbe senza l’apprendimento automatico. Se si confrontano i metodi di rilevamento l’apprendimento automatico si collegherebbe a qualche tecnica avanzata come l’analisi comportamentale. Ad ogni modo, l’analisi comportamentale usa l’apprendimento automatico! Tutto sommato, l’apprendimento automatico è essenziale per avere una protezione efficiente. Punto.
Svantaggi
L’apprendimento automatico ha molti vantaggi (si tratta di una panacea?). Beh, non proprio. Questo metodo funziona bene se l’algoritmo menzionato in precedenza funziona nel cloud o in qualche tipo di infrastruttura che impara dall’analisi di un gran numero di oggetti puliti e pericolosi.
Inoltre, aiuta molto avere un team di esperti che controllano il processo di apprendimento e che intervengono ogni volta in cui la loro esperienza farebbe la differenza.
In questo caso, gli svantaggi sono minimizzati e si riducono a solo uno: il bisogno di una soluzione d’infrastruttura costosa e un team di esperti strapagati.
Ma nel caso in cui qualcuno volesse tagliare i costi e utilizzare solo il modello matematico, e solo dal punto di vista del prodotto, le cose potrebbero non andare come si vuole.
1. Falsi positivi
Il rilevamento basato sull’apprendimento automatico cerca sempre il punto giusto tra il livello di oggetti rilevati e il livello di falsi positivi. Se volessimo abilitare altri rilevamenti, ci sarebbero probabilmente più falsi positivi. Con l’apprendimento automatico, spunterebbero nel posto in cui mai avreste pensato. Ad esempio, la riga “pulita” “Visita Reykjavik” sarebbe stata rilevata come una riga “pericolosa”, ottenendo solo 101 punti di autenticità. Ecco perché è importante che un laboratorio d’antivirus conservi i registri dei file puliti per fare in modo che il modello apprenda ed effettui verifiche.
2. Bypassare il modello
Un malfattore farebbe a pezzi un prodotto del genere per vedere come funziona. I criminali sono esseri umani, sono più creativi (se non più intelligenti) di una macchina, quindi si adatterebbero. Ad esempio, la seguente riga viene considerata pulita, quando invece la prima parte è evidentemente (agli occhi di un essere umano) pericolosa: “dgfkljhdfnmnvdfkEcco un po’ di testo sensato per ingannare la macchina”. Per quanto l’algoritmo possa essere intelligente, un essere umano sarà sempre in grado di bypassarlo. Ecco perché un laboratorio d’antivirus dovrebbe avere un’infrastruttura preparata per reagire in maniera istantanea alle nuove minacce.
3. Aggiornamento del modello
Quando abbiamo descritto l’algoritmo citato in precedenza, abbiamo detto che un modello che ha imparato da testi inglesi non funzionerà con testi scritti in altre lingue. Da questo punto di vista, i file pericolosi (fermo restando che sono creati dagli esseri umani in grado di pensare fuori dagli schemi) sono come un alfabeto in costante evoluzione. Il panorama delle minacce è molto instabile. Durante lunghi anni di ricerca, Kaspersky Lab ha sviluppato un approccio equilibrato: aggiorniamo i nostri modelli passo dopo passo direttamente nei database dell’antivirus. Questo consente di fornire un ulteriore apprendimento o anche un cambiamento completo dell’approccio di apprendimento per un modello, senza interrompere le sue operazioni abituali.
Conclusioni
Con tutto il rispetto per l’apprendimento automatico e per la sua grande importanza nel mondo della cybersicurezza, noi di Kaspersky Lab pensiamo che l’approccio alla cybersicurezza più efficace sia quello basato su un paradigma multilivello.
L’antivirus dovrebbe essere perfetto, con la sua analisi comportamentale, l’apprendimento automatico e molte altre cose…ma come per “molte altre cose”, ne parleremo la prossima volta.