Nel complesso mondo della cyber security, il già conosciuto (parlando di minacce informatiche) è verosimilmente “routine da gestire” per un team di addetti alla sicurezza informatica: ne consegue che è l’attacco sconosciuto il dilemma.
Dunque, il problema cruciale riguarda la prevenzione di un eventuale attacco hacker, o meglio, riguarda le possibili risposte alle seguenti domande: come prevenire un attacco hacker sconosciuto? Come simulare un attacco alla sicurezza informatica che non è ancora stato pensato? Lo shellcode ancora sconosciuto a tutti gli IDS del globo?
Una delle possibili risposte in tal senso è costituita da CyberBattleSim, una piattaforma di ricerca sperimentale (rilasciata da Microsoft) per studiare l’interazione di agent automatizzati che operano in un ambiente simulato di reti informatiche.
Indice degli argomenti
Cos’è CyberBattleSim
In poche parole, CyberBattleSim è un utile strumento che con l’ausilio dell’intelligenza artificiale e l’apprendimento automatico consente di simulare un attacco informatico a sistemi informatici aziendali mission critical attraverso i cosiddetti movimenti laterali.
CyberBattleSim offre un modello parametrizzabile ad alto livello di reti informatiche che simulano l’esecuzione di cyber-agent di attacco e difesa. Nulla, tuttavia, ci impedisce, disponibilità computazionale a parte, di poter poi testare il modello e l’attacco con le corrispettive reti realizzabili tramite container piuttosto che macchine virtuali, sia su ambienti on-premises che su PaaS.
Una topologia di rete e un insieme di vulnerabilità predefinite definiscono l’arena in cui avviene la simulazione. L’attacker avanza nella rete tramite movimenti laterali sfruttando vulnerabilità esistenti. L’agent addetto alla cyberdefence tenta di contenere l’attacker e di bonificarlo dalla rete.
Come funziona CyberBattleSim
Gli ambienti di runtime di emulazione forniscono alta fedeltà e controllo: possiamo prendere codice o file binari esistenti ed eseguirli direttamente in macchine virtuali che eseguono sistemi operativi a tutti gli effetti connessi su una rete virtualizzata (v. GNS3), dando accesso allo stato completo del sistema.
Tuttavia, ciò ha un costo in termini di prestazioni: sebbene gli ambienti simulati soffrano di mancanza di realismo, tendono ad essere leggeri, veloci, astratti e più controllabili, il che li rende più aperti alle sperimentazioni.
I vantaggi della simulazione di un attacco informatico includono:
- astrazione di alto livello: possiamo modellare i soli aspetti del sistema che ci interessano, come la comunicazione di rete a livello di applicazione piuttosto che la simulazione di rete a livello di pacchetto. Possiamo ignorare i dettagli di basso livello se ritenuti non necessari (file system, registry ecc.);
- flessibilità: la definizione di nuovi sensori dell’host è semplice (ad esempio, non richiede aggiornamenti del driver); possiamo restringere lo spazio delle azioni ad un sottoinsieme gestibile e pertinente;
- lo stato globale della rete può essere acquisito in modo efficiente, semplificando le fasi di debug e di diagnosi;
- un runtime leggero: eseguito in memoria su un singolo host/processo.
Il principio di progettazione adottato da CyberBattleSim è che la simulazione modella una complessità sufficiente a rappresentare le tecniche di attacco della matrice MITRE mantenendo la semplicità richiesta per addestrare in modo efficiente un agent utilizzando tecniche di Reinforcement Learning.
Lato attacker, la simulazione si concentra maggiormente sulle tecniche di movimento laterale, che sono comuni a tutte le fasi post-violazione.
Come avviene la simulazione con CyberBattleSim
Esaminiamo un esempio e presentiamo come funziona la simulazione utilizzando la terminologia Reinforcement Learning (RL). Il nostro ambiente di rete è dato da un grafico annotato diretto in cui i nodi rappresentano i computer, e i bordi rappresentano la conoscenza di altri nodi o la comunicazione che avviene tra i nodi.
Di seguito, un ipotetico esempio di rete con host che eseguono diversi software e sistemi operativi. Ogni macchina ha proprietà, valori e vulnerabilità preassegnate. I bordi blu rappresentano il traffico in esecuzione tra i nodi, e sono etichettati dal protocollo di comunicazione.
In questo scenario c’è un solo agent, l’attacker.
Inizialmente è infetto un solo nodo (presupposto post-violazione). Il suo obiettivo è massimizzare la ricompensa scoprendo e successivamente impossessandosi degli altri nodi nella rete.
L’ambiente è parzialmente osservabile: l’agent non riesce a vedere in anticipo tutti i nodi e i bordi del grafico di rete, a differenza dell’attacker che intraprende azioni per osservare gradualmente l’ambiente. In CyberBattleSim sono definite tre tipi di azioni che offrono un mix di capacità di sfruttamento ed esplorazione all’agent:
- un attacco locale;
- remoto;
- connessione ad altri nodi.
La ricompensa è un tipo di dato float che rappresenta il valore intrinseco di un nodo (ad esempio, un server SQL ha un valore maggiore di una macchina di test). Sempre in questo esempio, notiamo che l’attacker entra nella rete dal nodo Windows 7 a sinistra, indicato dalla freccia grande in arancione:
- procede quindi con uno spostamento laterale sul nodo Windows 8 sfruttando una vulnerabilità in SMB;
- quindi utilizza alcune credenziali memorizzate nella cache per accedere ad una macchina Windows 7;
- si avvale di una vulnerabilità sfruttabile da remoto del server IIS;
- infine, utilizza stringhe di connessione trapelate per accedere al database SQL.
Vulnerabilità e attacchi informatici: la simulazione
L’ambiente di simulazione offerto da CyberBattleSim è parametrizzato dall’architettura di rete consistente in un grafo di rete insieme alla descrizione delle vulnerabilità supportate e dei nodi inficiati.
Poiché la simulazione non esegue alcun codice, non vengono realmente avviati exploit che sfruttano vulnerabilità (ma potenzialmente li si possono testare in una fase succesiva mettendo in piedi ambienti di virtualizzazione – intendo con strumenti esterni a CyberBattleSim – che combinano GNS3, VirtualBox, Azure e distribuzioni che consentono l’utilizzo di kit per il penetration testing applicativo e infrastrutturale come ad esempio Metasploit).
Invece, ogni vulnerabilità viene modellata in modo astratto definendo:
- le precondizione che determinano se la vulnerabilità è attiva su un dato nodo;
- la probabilità che possa essere sfruttata con successo da un attacker;
- gli effetti collaterali di un exploit andato a buon fine.
Ogni nodo ha una serie di proprietà denominate assegnate. La pre-condizione viene quindi espressa come espressione booleana sull’insieme di possibili proprietà del nodo (o flag).
I risultati delle vulnerabilità
Ogni vulnerabilità avrà un risultato che potrà includere:
- una serie di credenziali trapelate (credentials leaked);
- un riferimento trapelato ad un altro nodo nella rete;
- informazioni trapelate su un nodo (proprietà del nodo);
- possesso di un nodo;
- escalation dei privilegi sul nodo.
Esempi di vulnerabilità remote includono:
- un sito SharePoint che espone le credenziali ssh (non necessariamente l’ID della macchina remota);
- una vulnerabilità ssh che garantisce l’accesso alla macchina;
- un progetto hostato su GitHub che perde credenziali nella cronologia dei commit;
- un servizio FTP vulnerabile ospitante file contenenti token di firma di accesso condiviso per account con diritti amministrativi.
Esempi di vulnerabilità locali sono, invece:
- estrazione di token o credenziali di autenticazione da una cache di sistema;
- escalation ai privilegi di sistema;
- escalation ai privilegi di amministratore.
Le vulnerabilità possono essere definite a livello di nodo, oppure possono essere definite globalmente e attivate dall’espressione booleana pre-condizionale.
Un esempio di laboratorio
Consideriamo come esempio il Capture the Flag (CTF) giocato sul sistema informatico illustrato di seguito:
Ogni nodo del grafico è una risorsa informatica con deficit di sicurezza informatica volutamente impiantati, e vulnerabilità come password riutilizzate, password non protette, token di accesso trapelati, controllo degli accessi configurato in modo errato, directory navigabili e così via.
L’obiettivo dell’attacker è acquisire la proprietà dei nodi critici nel grafico (ad esempio, risorse Azure e Sharepoint).
Per semplicità si presume che non sia presente alcun difensore e che il gioco sia completamente statico (niente eventi esterni tra due azioni dell’attaccante).
Gli sviluppatori della piattaforma hanno definito formalmente questa rete in Python in toy_ctf.py. Ecco uno snippet del codice che mostra com’è definito il sito Web e le sue proprietà, la configurazione del firewall e le vulnerabilità impiantate:
nodes = {
“Website”: m.NodeInfo(
services=[
m.ListeningService(“HTTPS”),
m.ListeningService(“SSH”, allowedCredentials=[
“ReusedMySqlCred-web”])],
firewall=m.FirewallConfiguration(
incoming=default_allow_rules,
outgoing=default_allow_rules
+ [
m.FirewallRule(“su”, m.RulePermission.ALLOW),
m.FirewallRule(“sudo”, m.RulePermission.ALLOW)]),
value=100,
properties=[“MySql”, “Ubuntu”, “nginx/1.10.3”],
owned_string=”FLAG: Login using insecure SSH user/password”,
vulnerabilities=dict(
ScanPageContent=m.VulnerabilityInfo(
description=”Website page content shows a link to GitHub repo”,
type=m.VulnerabilityType.REMOTE,
outcome=m.LeakedNodesId([“GitHubProject”]),
reward_string=”page content has a link to a Github project”,
cost=1.0
),
ScanPageSource=m.VulnerabilityInfo(
description=”Website page source contains refrence to”
“browseable relative web directory”,
type=m.VulnerabilityType.REMOTE,
outcome=m.LeakedNodesId([“Website.Directory”]),
reward_string=”Viewing the web page source reveals a URL to”
“a .txt file and directory on the website”,
cost=1.0
),
…
)
),
…
Si può riprodurre la simulazione in modo interattivo utilizzando il notebook Jupyter reperibile su toyctf-blank.ipynb. Provando i seguenti comandi:
- env.plot_environment_graph()
plot() - c2.run_attack(‘client’, ‘SearchEdgeHistory’)
plot() - c2.run_remote_attack(‘client’, ‘Website’, ‘ScanPageContent’)
plot() - c2.run_remote_attack(‘client’, ‘Website’, ‘ScanPageSource’)
plot() - c2.run_remote_attack(‘client’, ‘Website.Directory’, ‘NavigateWebDirectoryFurther’)
plot() - c2.connect_and_infect(‘client’, ‘Website’, ‘SSH’, ‘ReusedMySqlCred-web’)
plot()
La funzionalità plot ci mostrerà il sottoinsieme della rete esplorata finora. Dopo alcuni tentativi la rete esplorata apparirà pressappoco come nella figura sottostante:
Il notebook toyctf-random.ipynb esegue un agent casuale sull’ambiente disegnato in questo esempio: ad ogni passaggio, l’agente sceglie un’azione a caso dallo spazio azione.
Di seguito, il risultato dopo un paio di migliaia di iterazioni:
Conclusioni
Analogamente alla mente umana, l’intelligenza artificiale impara più velocemente giocando, quindi Microsoft ha sostanzialmente trasformato CyberBattleSim in un gioco.
Le competizioni Capture the flag e le simulazioni di phishing aiutano a rafforzare la cyber security posture creando scenari in cui gli addetti alla cyberdefence possono imparare dai metodi degli attackers.
Un comportamento irregolare dovrebbe attivare rapidamente gli allarmi, e gli strumenti di cyber security risponderebbero e bonificherebbero l’attacker.
Ma se l’attacker (simulato nel modello) ha imparato come compromettere i sistemi più rapidamente abbreviando il numero di passaggi necessari per avere successo, ciò offrirà agli analisti informazioni sui luoghi che necessitano maggiori controlli di cyber security migliorando così la tempestività del rilevamento.