
Une plateforme d'expérimentation et de recherche pour étudier l'interaction d'agents automatisés dans des environnements réseau simulés abstraits.
8 avril 2021 : Consultez l'annonce sur le blog de sécurité Microsoft.
CyberBattleSim est une plateforme de recherche expérimentale pour étudier l'interaction d'agents automatisés opérant dans un environnement réseau d'entreprise abstrait simulé. La simulation fournit une abstraction de haut niveau des réseaux informatiques et des concepts de cybersécurité. Son interface OpenAI Gym basée sur Python permet l'entraînement d'agents automatisés utilisant des algorithmes d'apprentissage par renforcement.
L'environnement de simulation est paramétré par une topologie de réseau fixe et un ensemble de vulnérabilités que les agents peuvent utiliser pour se déplacer latéralement dans le réseau. Le but de l'attaquant est de prendre possession d'une partie du réseau en exploitant des vulnérabilités implantées dans les nœuds informatiques. Pendant que l'attaquant tente de se propager dans le réseau, un agent défenseur surveille l'activité du réseau et tente de détecter toute attaque en cours et d'atténuer l'impact sur le système en expulsant l'attaquant. Nous fournissons un défenseur stochastique de base qui détecte et atténue les attaques en cours sur la base de probabilités de succès prédéfinies. Nous implémentons l'atténuation en ré-imagerie des nœuds infectés, un processus modélisé de manière abstraite comme une opération s'étendant sur plusieurs étapes de simulation.
Pour comparer les performances des agents, nous examinons deux métriques : le nombre d'étapes de simulation nécessaires pour atteindre leur objectif et les récompenses cumulées au fil des étapes de simulation à travers les époques d'entraînement.
Nous considérons ce projet comme une plateforme d'expérimentation pour mener des recherches sur l'interaction d'agents automatisés dans des environnements réseau simulés abstraits. En le rendant open-source, nous espérons encourager la communauté de recherche à étudier comment les cyber-agents interagissent et évoluent dans de tels environnements réseau.
La simulation que nous fournissons est certes simpliste, mais cela présente des avantages. Sa nature hautement abstraite empêche une application directe aux systèmes réels, offrant ainsi une protection contre une éventuelle utilisation malveillante d'agents automatisés entraînés avec elle. En même temps, sa simplicité nous permet de nous concentrer sur des aspects de sécurité spécifiques que nous souhaitons étudier et d'expérimenter rapidement avec des algorithmes récents d'apprentissage automatique et d'IA.
Par exemple, l'implémentation actuelle se concentre sur les techniques de cyberattaques de mouvement latéral, dans l'espoir de comprendre comment la topologie et la configuration du réseau les affectent. Avec cet objectif en tête, nous avons estimé que la modélisation du trafic réseau réel n'était pas nécessaire. Ce n'est qu'un exemple de limitation significative de notre système que les futures contributions pourraient souhaiter aborder.
Côté algorithmique, nous fournissons quelques agents de base comme points de départ, mais nous serions curieux de savoir comment les algorithmes d'apprentissage par renforcement de pointe se comparent à eux. Nous avons constaté que le grand espace d'actions intrinsèque à tout système informatique constitue un défi particulier pour l'apprentissage par renforcement, contrairement à d'autres applications comme les jeux vidéo ou le contrôle de robots. L'entraînement d'agents capables de stocker et de récupérer des identifiants est un autre défi rencontré lors de l'application des techniques d'RL où les agents n'ont généralement pas de mémoire interne. Ce sont d'autres domaines de recherche pour lesquels la simulation pourrait être utilisée à des fins de benchmarking.
D'autres domaines d'intérêt incluent l'utilisation responsable et éthique des systèmes de cybersécurité autonomes : Comment concevoir un réseau d'entreprise qui donne un avantage intrinsèque aux agents défenseurs ? Comment mener des recherches sûres visant à défendre les entreprises contre les cyberattaques autonomes tout en empêchant l'utilisation malveillante d'une telle technologie ?
Lisez la Introduction rapide au projet.
| Type | Branche | Statut |
|---|---|---|
| CI | master | |
| Image Docker | master |
Voir la Documentation du benchmark. Les notebooks Jupyter avec les dernières exécutions sont enregistrés sous une balise dédiée à /notebooks/benchmarks (latest_benchmark).
Il est fortement recommandé de travailler dans un environnement Linux, soit directement, soit via WSL sous Windows. L'exécution de Python directement sous Windows devrait fonctionner mais n'est plus prise en charge.
Commencez par cloner le dépôt :
git clone https://github.com/microsoft/CyberBattleSim.git
Si vous obtenez l'erreur suivante lors de l'exécution de papermill sur les notebooks
(ou alternativement lors de l'exécution de 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
ou d'autres bibliothèques partagées comme libgdk_pixbuf-2.0.so.0,
Exécutez alors la commande suivante :
sudo apt install libnss3-dev libgtk-3-0 libxss1 libasound2-dev libgtk2.0-0 libgconf-2-4
Les instructions ont été testées sur une distribution Linux Ubuntu (native et via WSL).
Si conda n'est pas déjà installé, vous devez l'installer en exécutant le script install_conda.sh.
bash install-conda.sh
Une fois cela fait, ouvrez un nouveau terminal et exécutez le script d'initialisation :
bash init.sh
Cela créera un environnement conda nommé cybersim avec toutes les dépendances OS et Python nécessaires.
Pour activer l'environnement, exécutez :
conda activate cybersim
L'environnement de développement pris en charge sous Windows se fait via WSL. Vous devez d'abord installer une distribution WSL Ubuntu sur votre machine Windows, puis procéder aux instructions Linux (section suivante).
Pour vous authentifier avec Git, vous pouvez soit utiliser l'authentification basée sur SSH, soit utiliser l'astuce du gestionnaire d'identifiants pour générer automatiquement un jeton PAT. Cette dernière peut être faite en exécutant la commande suivante sous WSL (plus d'infos ici) :
git config --global credential.helper "/mnt/c/Program\ Files/Git/mingw64/libexec/git-core/git-credential-manager.exe"
Pour exécuter votre environnement dans un conteneur Docker, nous recommandons d'exécuter docker via le Sous-système Windows pour Linux (WSL) en suivant les instructions suivantes :
Installation de Docker sur Windows sous WSL.
Cette méthode n'est plus maintenue, veuillez plutôt exécuter sous
un environnement Linux WSL.
Mais si vous insistez, commencez par installer Python 3.10 puis, dans une invite Powershell, exécutez le script ./init.ps1.
La méthode la plus rapide pour être opérationnel est via le conteneur Docker.
REMARQUE : Pour des raisons de licence, nous ne redistribuons pas publiquement d'artefact de construction. En particulier, le registre Docker
spinshot.azurecr.iomentionné dans les commandes ci-dessous est conservé privé pour les mainteneurs du projet uniquement.En solution de contournement, vous pouvez recréer l'image Docker vous-même en utilisant le
Dockerfilefourni, publier l'image résultante dans votre propre registre Docker et remplacer le nom du registre dans les commandes ci-dessous.
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
Exécutez les commandes suivantes pour lancer une simulation avec un agent RL de 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
Si tout est correctement configuré, vous devriez obtenir une sortie qui ressemble à ceci :
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 ┼──╯
Pour vous familiariser rapidement avec le projet, vous pouvez ouvrir l'un des notebooks Jupyter fournis pour jouer de manière interactive avec les environnements gymnasium.
Remarques sur les notebooks
.py:
- Nos notebooks sont enregistrés dans Git sous forme de fichiers
.py. Ceux-ci peuvent être ouverts et exécutés directement dans VSCode ou dans Jupyter en utilisant l'extension Jupytext.- Les fichiers
.ipynbde sortie peuvent également être automatiquement régénérés en utilisant papermill en exécutant le script bash run_benchmark.sh.- Nous publions également un instantané des notebooks
.ipynbcorrespondants avec toute la sortie et les graphiques dans une balise git séparée. Le dernier instantané de la sortie des notebooks Jupyter, y compris les benchmarks, est accessible depuis la balise git suivante : /notebooks/benchmarks (latest_benchmark).
Quelques notebooks pour commencer :
Notebooks d'environnement jouet 'Capture The Flag' :
Notebooks d'environnement en chaîne :
Autres environnements :
Benchmarks : Les notebooks suivants montrent l'évaluation comparative des agents de base sur divers environnements.
Le dernier instantané de la sortie des notebooks Jupyter, y compris les benchmarks, est accessible depuis la balise git suivante : /notebooks/benchmarks (latest_benchmark).
Le code suivant montre comment créer une instance de l'environnement OpenAI Gym CyberBattleChain-v0, un environnement basé sur une structure de réseau en forme de chaîne, avec 10 nœuds (size=10) où l'objectif de l'agent est soit d'obtenir la pleine propriété du réseau (own_atleast_percent=1.0) ou
de maintenir le SLA de disponibilité du réseau à 80% (maintain_sla=0.80), tandis que le réseau est surveillé et protégé par le défenseur basique modélisé de manière probabiliste (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))
Pour essayer d'autres topologies de réseau, inspirez-vous de chainpattern.py pour définir votre propre ensemble de machines et de vulnérabilités, puis ajoutez une entrée dans l'initialiseur du module pour déclarer et enregistrer l'environnement Gym.
Ce projet accueille les contributions et les suggestions. La plupart des contributions nécessitent que vous acceptiez un Contrat de Licence de Contributeur (CLA) déclarant que vous avez le droit de nous accorder, et que vous nous accordez effectivement, les droits d'utiliser votre contribution. Pour plus de détails, visitez https://cla.opensource.microsoft.com.
Lorsque vous soumettez une demande de tirage (pull request), un bot CLA déterminera automatiquement si vous devez fournir un CLA et décorera la PR de manière appropriée (par exemple, vérification du statut, commentaire). Suivez simplement les instructions fournies par le bot. Vous n'aurez besoin de le faire qu'une seule fois pour tous les dépôts utilisant notre CLA.
Ce projet a adopté le Code de conduite open source de Microsoft. Pour plus d'informations, consultez la FAQ sur le Code de conduite ou contactez [email protected] pour toute question ou commentaire supplémentaire.
Voici quelques idées pour contribuer : améliorer la simulation (basée sur les événements, affiner la simulation, …), entraîner un algorithme RL sur la simulation existante, implémenter un benchmark pour évaluer et comparer la nouveauté des agents, ajouter plus de modes de génération de réseau pour entraîner les agents RL sur, contribuer à la documentation, corriger des bugs.
Voir aussi le wiki pour plus d'idées.
@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}
}
Ce projet ne contient aucune donnée client. Les modèles et topologies de réseau fournis sont purement fictifs. Les utilisateurs du code fourni fournissent toutes les entrées à la simulation et doivent disposer des autorisations nécessaires pour utiliser les données fournies.
Ce projet peut contenir des marques commerciales ou des logos pour des projets, produits ou services. L'utilisation autorisée des marques commerciales ou logos de Microsoft est soumise aux et doit suivre les Directives sur les marques et les marques de commerce de Microsoft. L'utilisation de marques commerciales ou logos de Microsoft dans des versions modifiées de ce projet ne doit pas créer de confusion ni suggérer un parrainage de Microsoft. Toute utilisation de marques commerciales ou logos de tiers est soumise aux politiques de ces tiers.