2021年4月8日:请参阅 Microsoft 安全博客上的公告。
CyberBattleSim 是一个实验研究平台,用于研究在模拟的抽象企业网络环境中运行的自动化智能体的交互行为。该模拟提供了计算机网络和网络安全概念的高层抽象。其基于 Python 的 OpenAI Gym 接口支持使用强化学习算法训练自动化智能体。
模拟环境通过固定的网络拓扑和一组可供智能体利用以在网络中横向移动的漏洞进行参数化。攻击者的目标是通过利用植入计算机节点中的漏洞来获取对网络部分的所有权。在攻击者试图在网络中扩散时,防御智能体监控网络活动,并尝试检测发生的任何攻击,并通过驱逐攻击者来减轻对系统的影响。我们提供了一个基本的随机防御智能体,它基于预定义的成功概率来检测和减轻正在进行的攻击。我们通过重新映像受感染节点来实现缓解,该过程被抽象模拟为跨越多个模拟步骤的操作。
为了比较智能体的性能,我们关注两个指标:实现目标所需的模拟步骤数,以及训练阶段内跨模拟步骤的累积奖励。
我们将该项目视为一个实验平台,用于研究自动化智能体在抽象模拟网络环境中的交互。通过开源,我们希望鼓励研究社区探索网络智能体在此类网络环境中如何交互和演化。
我们提供的模拟无疑是简单的,但这也有其优势。其高度抽象的特性禁止直接应用于真实系统,从而为防止自动化智能体的潜在恶意使用提供了保障。同时,其简单性使我们能够专注于旨在研究的具体安全方面,并快速试验最新的机器学习和 AI 算法。
例如,当前的实现专注于横向移动网络攻击技术,希望理解网络拓扑和配置如何影响它们。基于这一目标,我们认为对实际网络流量进行建模并非必要。这仅仅是系统中的一个显著限制,未来的贡献可能希望解决这个问题。
在算法方面,我们提供了一些基本智能体作为起点,但我们也很好奇最先进的强化学习算法与它们相比表现如何。我们发现任何计算机系统固有的大动作空间是强化学习面临的一个特殊挑战,这与视频游戏或机器人控制等其他应用不同。训练能够存储和检索凭证的智能体是应用强化学习技术时面临的另一个挑战,因为智能体通常不具备内部记忆。这些是模拟可用于基准测试的其他研究领域。
其他感兴趣的领域包括自主网络安全系统的责任与道德使用:如何设计一个赋予防御智能体内在优势的企业网络?如何在防止此类技术被恶意利用的同时,开展旨在防御企业免受自主网络攻击的安全研究?
阅读项目的快速介绍。
| 类型 | 分支 | 状态 |
|---|---|---|
| CI | master | |
| Docker 镜像 | master |
请参阅基准测试文档。 包含最新运行结果的 Jupyter 笔记本已检出到专用标签下,位于 /notebooks/benchmarks (latest_benchmark)。
强烈建议在 Linux 环境下工作,无论是直接环境还是通过 Windows 上的 WSL。在 Windows 上直接运行 Python 可能可行,但已不再支持。
首先检出仓库:
git clone https://github.com/microsoft/CyberBattleSim.git
如果在笔记本上运行 papermill 时(或者在运行 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
或其他共享库错误,如 libgdk_pixbuf-2.0.so.0,
则运行以下命令:
sudo apt install libnss3-dev libgtk-3-0 libxss1 libasound2-dev libgtk2.0-0 libgconf-2-4
这些说明已在 Linux Ubuntu 发行版(原生和通过 WSL)上测试。
如果尚未安装 conda,则需要通过运行 install_conda.sh 脚本进行安装。
bash install-conda.sh
完成后,打开一个新的终端并运行初始化脚本:
bash init.sh
这将创建一个名为 cybersim 的 conda 环境,其中包含所有必需的系统和 Python 依赖项。
要激活该环境,请运行:
conda activate cybersim
Windows 上受支持的开发环境是通过 WSL 实现的。 你首先需要在 Windows 机器上安装一个 Ubuntu WSL 发行版, 然后按照 Linux 说明(下一节)进行操作。
要使用 Git 进行认证,你可以使用基于 SSH 的认证,或者 使用凭据助手技巧自动生成 PAT 令牌。后者可以通过在 WSL 下运行以下命令来完成 (更多信息请点击此处):
git config --global credential.helper "/mnt/c/Program\ Files/Git/mingw64/libexec/git-core/git-credential-manager.exe"
要在 Docker 容器中运行你的环境,我们建议使用以下说明通过 Windows Subsystem on Linux (WSL) 运行 docker:
在 Windows 上的 WSL 上安装 Docker。
此方法已不再维护,请优先使用 WSL 子系统 Linux 环境。
但如果你坚持,可以先安装 Python 3.10,然后在 PowerShell 提示符下运行 ./init.ps1 脚本。
启动和运行的最快方法是通过 Docker 容器。
注意:由于许可原因,我们不公开分发任何构建产物。特别是,以下命令中引用的 docker 注册表
spinshot.azurecr.io仅对项目维护者保持私有。作为替代方案,你可以使用提供的
Dockerfile自行重新创建 docker 镜像,将生成的镜像发布到你自己的 docker 注册表,并将以下命令中的注册表名称替换为你自己的。
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
运行以下命令以使用基线 RL 智能体运行模拟:
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
如果一切设置正确,你应该会得到类似这样的输出:
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 ┼──╯
为了快速熟悉项目,你可以打开提供的其中一个 Jupyter 笔记本,以交互方式操作 gymnasium 环境。
关于
.py笔记本的说明:
- 我们的笔记本以
.py文件形式检入 Git。这些文件可以直接在 VSCode 中打开并运行,或者使用 Jupytext 扩展 在 Jupyter 中运行。- 也可以使用 papermill 通过运行 bash 脚本 run_benchmark.sh 自动重新生成输出的
.ipynb文件。- 我们还发布了一个包含完整输出和图表的相应
.ipynb笔记本的快照,放置在单独的 git 标签中。 Jupyter 笔记本输出的最新快照(包括基准测试)可从以下 git 标签访问:/notebooks/benchmarks (latest_benchmark)。
一些入门笔记本:
“夺旗”玩具环境笔记本:
链式环境笔记本:
其他环境:
基准测试:以下笔记本显示基线智能体在各种环境上的基准评估。
Jupyter 笔记本输出的最新快照(包括基准测试)可从以下 git 标签访问:/notebooks/benchmarks (latest_benchmark)。
以下代码展示了如何创建 OpenAI Gym 环境 CyberBattleChain-v0 的实例,该环境基于一种链状网络结构,包含 10 个节点(size=10),智能体的目标是获得网络的完全所有权(own_atleast_percent=1.0)或打破 80% 的网络可用性 SLA(maintain_sla=0.80),同时网络由基本的概率模型防御智能体进行监控和保护(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))
要尝试其他网络拓扑,请以 chainpattern.py 为例定义你自己的机器和漏洞集,然后在模块初始化器中添加条目以声明并注册 Gym 环境。
本项目欢迎贡献和建议。大多数贡献要求你同意一份贡献者许可协议(CLA),声明你有权并且确实授予我们使用你的贡献的权利。详情请访问 https://cla.opensource.microsoft.com。
当你提交拉取请求时,CLA 机器人会自动确定你是否需要提供 CLA,并适当装饰 PR(例如,状态检查、评论)。只需按照机器人提供的说明操作。你只需要在所有使用我们 CLA 的仓库中这样做一次。
本项目已采用 Microsoft 开源行为准则。有关更多信息,请参阅行为准则常见问题解答或通过 [email protected] 联系微软,提出任何其他问题或评论。
以下是一些贡献想法:增强模拟(基于事件、细化模拟等)、在现有模拟上训练 RL 算法、实现基准测试以评估和比较智能体的新颖性、添加更多网络生成模式以训练 RL 智能体、贡献文档、修复错误。
另请参阅 wiki 以获取更多想法。
@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}
}
本项目不包含任何客户数据。提供的模型和网络拓扑纯属虚构。提供的代码的用户负责提供模拟的所有输入,并且必须拥有使用任何提供数据的必要权限。
本项目可能包含项目、产品或服务的商标或徽标。授权使用 Microsoft 商标或徽标须遵守并遵循 Microsoft 商标和品牌指南。在本项目的修改版本中使用 Microsoft 商标或徽标不得引起混淆或暗示 Microsoft 的赞助。任何第三方商标或徽标的使用均受这些第三方政策的约束。