
Una piattaforma di sperimentazione e ricerca per investigare l'interazione di agenti automatizzati in ambienti di rete simulati astratti.
8 aprile 2021: Vedi l'annuncio sul blog Microsoft Security.
CyberBattleSim è una piattaforma di ricerca sperimentale per studiare l'interazione di agenti automatizzati che operano in un ambiente di rete aziendale simulato e astratto. La simulazione fornisce un'astrazione di alto livello delle reti informatiche e dei concetti di sicurezza informatica. La sua interfaccia OpenAI Gym basata su Python consente l'addestramento di agenti automatizzati utilizzando algoritmi di apprendimento per rinforzo.
L'ambiente di simulazione è parametrizzato da una topologia di rete fissa e da un insieme di vulnerabilità che gli agenti possono sfruttare per muoversi lateralmente nella rete. L'obiettivo dell'attaccante è impossessarsi di una porzione della rete sfruttando le vulnerabilità presenti nei nodi del computer. Mentre l'attaccante tenta di diffondersi attraverso la rete, un agente difensore osserva l'attività di rete e cerca di rilevare eventuali attacchi in corso e mitigarne l'impatto sul sistema, espellendo l'attaccante. Forniamo un difensore stocastico di base che rileva e mitiga gli attacchi in corso basandosi su probabilità di successo predefinite. Implementiamo la mitigazione reimmaginando i nodi infetti, un processo astrattamente modellato come un'operazione che si svolge in più passi di simulazione.
Per confrontare le prestazioni degli agenti, consideriamo due metriche: il numero di passi di simulazione necessari per raggiungere il loro obiettivo e le ricompense cumulative nel corso dei passi di simulazione durante le epoche di addestramento.
Consideriamo questo progetto come una piattaforma di sperimentazione per condurre ricerche sull'interazione di agenti automatizzati in ambienti di rete simulati e astratti. Rendendolo open-source, speriamo di incoraggiare la comunità di ricerca a studiare come gli agenti informatici interagiscono ed evolvono in tali ambienti di rete.
La simulazione che forniamo è, ammettiamolo, semplicistica, ma ciò presenta dei vantaggi. La sua natura altamente astratta impedisce l'applicazione diretta a sistemi reali, fornendo così una salvaguardia contro un potenziale uso malevolo di agenti automatizzati addestrati con essa. Allo stesso tempo, la sua semplicità ci consente di concentrarci su aspetti di sicurezza specifici che intendiamo studiare e di sperimentare rapidamente con recenti algoritmi di apprendimento automatico e IA.
Ad esempio, l'implementazione attuale si concentra sulle tecniche di attacco informatico di movimento laterale, con la speranza di comprendere come la topologia e la configurazione della rete le influenzino. Con questo obiettivo in mente, abbiamo ritenuto che non fosse necessario modellare il traffico di rete effettivo. Questo è solo un esempio di un limite significativo del nostro sistema che contributi futuri potrebbero voler affrontare.
Sul versante algoritmico, forniamo alcuni agenti di base come punti di partenza, ma saremmo curiosi di scoprire come gli algoritmi di apprendimento per rinforzo più moderni si confrontano con essi. Abbiamo scoperto che il grande spazio delle azioni intrinseco a qualsiasi sistema informatico rappresenta una sfida particolare per l'apprendimento per rinforzo, a differenza di altre applicazioni come i videogiochi o il controllo di robot. Addestrare agenti in grado di memorizzare e recuperare credenziali è un'altra sfida affrontata quando si applicano tecniche di RL in cui gli agenti tipicamente non dispongono di memoria interna. Queste sono altre aree di ricerca in cui la simulazione potrebbe essere utilizzata per scopi di benchmarking.
Altre aree di interesse includono l'uso responsabile ed etico dei sistemi autonomi di cybersicurezza: Come progettare una rete aziendale che dia un vantaggio intrinseco agli agenti difensori? Come condurre una ricerca sicura volta a difendere le aziende dagli attacchi informatici autonomi, prevenendo al contempo un uso malevolo di tale tecnologia?
Leggi la Breve introduzione al progetto.
| Tipo | Branch | Stato |
|---|---|---|
| CI | master | |
| Docker image | master |
Vedi la Documentazione del benchmark. I Jupyter notebook con le ultime esecuzioni sono stati inseriti sotto un tag dedicato in /notebooks/benchmarks (latest_benchmark).
È fortemente consigliato lavorare in un ambiente Linux, direttamente o tramite WSL su Windows. Eseguire Python direttamente su Windows dovrebbe funzionare ma non è più supportato.
Inizia clonando il repository:
git clone https://github.com/microsoft/CyberBattleSim.git
Se ottieni il seguente errore eseguendo papermill sui notebook (o in alternativa eseguendo orca --help)
/home/wiblum/miniconda3/envs/cybersim/lib/orca_app/orca: error while loading shared libraries: libXss.so.1: cannot open shared object file: No such file or directory
o altre librerie condivise come libgdk_pixbuf-2.0.so.0,
Esegui quindi il seguente comando:
sudo apt install libnss3-dev libgtk-3-0 libxss1 libasound2-dev libgtk2.0-0 libgconf-2-4
Le istruzioni sono state testate su una distribuzione Linux Ubuntu (sia nativa che tramite WSL).
Se conda non è già installato, devi installarlo eseguendo lo script install_conda.sh.
bash install-conda.sh
Una volta fatto, apri un nuovo terminale ed esegui lo script di inizializzazione:
bash init.sh
Questo creerà un ambiente conda chiamato cybersim con tutte le dipendenze del sistema operativo e Python richieste.
Per attivare l'ambiente esegui:
conda activate cybersim
L'ambiente di sviluppo supportato su Windows è tramite WSL. Devi prima installare una distribuzione Ubuntu WSL sulla tua macchina Windows, e poi procedere con le istruzioni per Linux (sezione successiva).
Per autenticarti con Git, puoi utilizzare l'autenticazione basata su SSH o in alternativa utilizzare il trucco del credential-helper per generare automaticamente un token PAT. Quest'ultimo può essere eseguito con il seguente comando in WSL (maggiori informazioni qui):
git config --global credential.helper "/mnt/c/Program\ Files/Git/mingw64/libexec/git-core/git-credential-manager.exe"
Per eseguire il tuo ambiente all'interno di un contenitore Docker, consigliamo di eseguire docker tramite il Sottosistema Windows per Linux (WSL) seguendo queste istruzioni:
Installazione di Docker su Windows tramite WSL).
Questo metodo non viene più mantenuto; preferisci invece l'esecuzione in un
ambiente Linux tramite WSL.
Ma se insisti, puoi iniziare installando Python 3.10 poi in un prompt di PowerShell esegui lo script ./init.ps1.
Il metodo più rapido per iniziare è tramite il contenitore Docker.
NOTA: Per motivi di licenza, non ridistribuiamo pubblicamente alcun artefatto di build. In particolare, il registro docker
spinshot.azurecr.iomenzionato nei comandi seguenti è mantenuto privato solo per i manutentori del progetto.Come soluzione alternativa, puoi ricreare l'immagine docker da solo usando il
Dockerfilefornito, pubblicare l'immagine risultante nel tuo registro docker e sostituire il nome del registro nei comandi seguenti.
commit=7c1f8c80bc53353937e3c69b0f5f799ebb2b03ee
docker login spinshot.azurecr.io
docker pull spinshot.azurecr.io/cyberbattle:$commit
docker run -it spinshot.azurecr.io/cyberbattle:$commit python -m cyberbattle.agents.baseline.run
docker build -t cyberbattle:1.1 .
docker run -it -v "$(pwd)":/source --rm cyberbattle:1.1 python -m cyberbattle.agents.baseline.run
Esegui i seguenti comandi per eseguire una simulazione con un agente RL di base:
python -m cyberbattle.agents.baseline.run --training_episode_count 5 --eval_episode_count 3 --iteration_count 100 --rewardplot_width 80 --chain_size=4 --ownership_goal 0.2
python -m cyberbattle.agents.baseline.run --training_episode_count 5 --eval_episode_count 3 --iteration_count 100 --rewardplot_width 80 --chain_size=4 --reward_goal 50 --ownership_goal 0
Se tutto è configurato correttamente, dovresti ottenere un output simile a questo:
torch cuda available=True
###### DQL
Learning with: episode_count=1,iteration_count=10,ϵ=0.9,ϵ_min=0.1, ϵ_expdecay=5000,γ=0.015, lr=0.01, replaymemory=10000,
batch=512, target_update=10
## Episode: 1/1 'DQL' ϵ=0.9000, γ=0.015, lr=0.01, replaymemory=10000,
batch=512, target_update=10
Episode 1|Iteration 10|reward: 139.0|Elapsed Time: 0:00:00|###################################################################|
###### Random search
Learning with: episode_count=1,iteration_count=10,ϵ=1.0,ϵ_min=0.0,
## Episode: 1/1 'Random search' ϵ=1.0000,
Episode 1|Iteration 10|reward: 194.0|Elapsed Time: 0:00:00|###################################################################|
simulation ended
Episode duration -- DQN=Red, Random=Green
10.00 ┼
Cumulative rewards -- DQN=Red, Random=Green
194.00 ┼ ╭──╴
174.60 ┤ │
155.20 ┤╭─────╯
135.80 ┤│ ╭──╴
116.40 ┤│ │
97.00 ┤│ ╭╯
77.60 ┤│ │
58.20 ┤╯ ╭──╯
38.80 ┤ │
19.40 ┤ │
0.00 ┼──╯
Per familiarizzare rapidamente con il progetto, puoi aprire uno dei Jupyter notebook forniti per interagire in modo interattivo con gli ambienti gymnasium.
Note sui notebook
.py:
- I nostri notebook vengono inseriti in Git come file
.py. Possono essere aperti ed eseguiti direttamente in VSCode o in Jupyter utilizzando l'estensione Jupytext.- I file
.ipynbdi output possono anche essere rigenerati automaticamente usando papermill eseguendo lo script bash run_benchmark.sh.- Pubblichiamo anche un'istantanea dei corrispondenti notebook
.ipynbcon l'intero output e i grafici in un tag git separato. L'ultima istantanea dell'output dei Jupyter notebook, inclusi i benchmark, è accessibile dal seguente tag git: /notebooks/benchmarks (latest_benchmark).
Alcuni notebook per iniziare:
Notebook dell'ambiente giocattolo 'Capture The Flag':
Notebook dell'ambiente Chain:
Altri ambienti:
Benchmark: I seguenti notebook mostrano la valutazione di benchmark degli agenti di base su vari ambienti.
L'ultima istantanea dell'output dei Jupyter notebook, inclusi i benchmark, è accessibile dal seguente tag git: /notebooks/benchmarks (latest_benchmark).
Il codice seguente mostra come creare un'istanza dell'ambiente OpenAI Gym CyberBattleChain-v0, un ambiente basato su una struttura di rete a catena, con 10 nodi (size=10) dove l'obiettivo dell'agente è ottenere la piena proprietà della rete (own_atleast_percent=1.0) o
superare l'80% di disponibilità del servizio SLA (maintain_sla=0.80), mentre la rete viene monitorata e protetta dal difensore di base modellato probabilisticamente (defender_agent=ScanAndReimageCompromisedMachines):
import cyberbattle._env.cyberbattle_env
cyberbattlechain_defender =
gym.make('CyberBattleChain-v0',
size=10,
attacker_goal=AttackerGoal(
own_atleast=0,
own_atleast_percent=1.0
),
defender_constraint=DefenderConstraint(
maintain_sla=0.80
),
defender_agent=ScanAndReimageCompromisedMachines(
probability=0.6,
scan_capacity=2,
scan_frequency=5))
Per provare altre topologie di rete, prendi esempio su chainpattern.py per definire il tuo insieme di macchine e vulnerabilità, poi aggiungi una voce in l'inizializzatore del modulo per dichiarare e registrare l'ambiente Gym.
Questo progetto accoglie contributi e suggerimenti. La maggior parte dei contributi richiede che tu accetti un Accordo di Licenza per Contributori (CLA) che dichiari che hai il diritto di concederci i diritti di utilizzare il tuo contributo. Per i dettagli, visita https://cla.opensource.microsoft.com.
Quando invii una pull request, un bot CLA determinerà automaticamente se devi fornire un CLA e decorerà la PR in modo appropriato (ad esempio, controllo dello stato, commento). Segui semplicemente le istruzioni fornite dal bot. Dovrai farlo solo una volta in tutti i repository che utilizzano il nostro CLA.
Questo progetto ha adottato il Codice di Condotta Open Source di Microsoft. Per maggiori informazioni, consulta le Domande frequenti sul Codice di Condotta o contatta [email protected] per qualsiasi altra domanda o commento.
Ecco alcune idee su come contribuire: migliorare la simulazione (basata su eventi, raffinare la simulazione, …), addestrare un algoritmo RL sulla simulazione esistente, implementare benchmark per valutare e confrontare la novità degli agenti, aggiungere più modalità generative di rete per addestrare l'agente RL, contribuire alla documentazione, correggere bug.
Vedi anche il wiki per altre idee.
@misc{msft:cyberbattlesim,
Author = {Microsoft Defender Research Team.}
Note = {Created by Christian Seifert, Michael Betser, William Blum, James Bono, Kate Farris, Emily Goren, Justin Grana, Kristian Holsheimer, Brandon Marken, Joshua Neil, Nicole Nichols, Jugal Parikh, Haoran Wei.},
Publisher = {GitHub},
Howpublished = {\url{https://github.com/microsoft/cyberbattlesim}},
Title = {CyberBattleSim},
Year = {2021}
}
Questo progetto non include alcun dato dei clienti. I modelli e le topologie di rete forniti sono puramente fittizi. Gli utenti del codice fornito forniscono tutto l'input alla simulazione e devono disporre delle autorizzazioni necessarie per utilizzare qualsiasi dato fornito.
Questo progetto può contenere marchi o loghi per progetti, prodotti o servizi. L'uso autorizzato dei marchi o dei loghi Microsoft è soggetto e deve seguire le Linee guida per marchi e marchi commerciali di Microsoft. L'uso di marchi o loghi Microsoft in versioni modificate di questo progetto non deve creare confusione o implicare una sponsorizzazione da parte di Microsoft. Qualsiasi uso di marchi o loghi di terze parti è soggetto alle politiche di tali terze parti.