微软开源网络攻防模拟工具CyberBattleSim介绍及源码分析
CyberBattleSim介绍及源码分析
- 介绍
- 代理性能指标
- 项目目标
- Why模拟,Why Simple
- 挑战
- 应用
- 设计原则
- 建模
- 如何模拟(建模)
- 漏洞建模
- 漏洞结果
- 建模分析
- 代码分析
- toyctf环境
- chain环境
- 基准测试
- 评估chain网络完全控制需要的时间
- 特征选择
- chain网络下的迁移学习
- 防御者代理
- 动作空间及reward
- 项目结构
- Todo
介绍
项目主页:cyberbattlesim - 微软官方页面
Gtihub主页:microsoft/CyberBattleSim
微软尝试利用AI和机器学习来解决安全挑战,研究智能体是如何在模拟的企业网络内进行交互和强化学习技术如何帮助提高安全性。
CyberBattleSim是用于研究网络攻防模拟的套件,这个实验研究项目探索在抽象模拟的企业环境中智能体是如何运作的。该模拟环境提供了对计算机网络和网络安全概念高层次抽象。使用基于python的OpenAI Gym接口来使用强化学习训练智能体。
模拟环境是一种参数化的固定的网络拓扑和一组代理可以用来横向移动的漏洞集合。攻击者的目标是通过利用植入计算机结点的漏洞获得部分网络的控制权。当攻击者试图在网络中进行横向移动时,防御者观察网络活动并尝试检测任何正在发生的攻击,并通过驱逐攻击者减轻对系统的影响。
CyberBattleSim提供了一个基于随机的防御者,通过预先定义的成功概率来检测和缓解正在进行的攻击。通过重新镜像受感染的结点来实施缓解措施,一个抽象的建模为跨越多个模拟步骤的操作的过程。
代理性能指标
- 达到其目标所采取的模拟步骤数目
- 整个训练轮数中的模拟步骤的累计奖励
项目目标
鼓励研究社区探索在这种网络环境中,网络空间代理的相互作用和进化。
Why模拟,Why Simple
模拟环境性能要求低,更轻量,速度快,抽象,并且可控性更强,适用于强化学习实验
- 抽象级别高,只需要建模系统重要的方面;例如应用层网络通信相比于包级别的网络模拟,我们忽略了低层的信息。
- 灵活性:定义一个新的机器是很容易的,不需要考虑底层的驱动等,可以限制动作空间为可以管理且相关的子集。
- 全局的状态可以有效地捕获,从而简化调试与诊断。
- 轻量:运行在一台机器/进程的内存中
CyberBattleSim的仿真固然简单,但是简单是具有优势的。高度抽象的性质使得无法直接应用于现实系统,从而防止了潜在的恶意训练的自动化代理使用。同时,这种简单可以使我们更专注于特定的安全性方面,例如研究和快速试验最新的机器学习和AI算法。
例如当前的实现方式侧重于横向移动,希望理解网络拓扑和配置并施加影响。基于这一目标,没有必要对实际的网络流量进行建模。这只是未来系统中可能要解决的一个重要局限性的例子。
挑战
在算法方面提供了一些基础的代理作为出发点,但是我们很想知道如何将最新的强化学习算法和他们进行比较。我们发现与其他应用程序(视频游戏或机器人)相比,计算机系统具有的大型动作空间是强化学习的一个特殊挑战。在面对代理通常不具有内部记忆的强化学习技术时,训练可以存储和检索凭证的代理是另外一个挑战。
应用
还有一些可以用于研究的问题:
- 如何设计一个可以给防御者带来固有优势的企业网络?
- 如何进行安全的研究以保护企业免受自动化网络攻击,同时防止此类技术的恶意使用。
设计原则
- 仅对足够复杂的模型进行建模以表示来自ATT&CK矩阵的攻击技术
- 同时保持使用强化学习技术有效训练代理需要的简单性
建模
如何模拟(建模)
专注于所有post-breach攻击固有的横向移动技术。
强化学习建模:
- 有向图,结点表示计算机,边表示其他结点的知识或节点间通信。
- 环境:状态就是网络,单个代理,部分可观测(代理无法观测到所有的结点和边),静态的,确定性的,离散的,post-breach
- 行动空间(代理可以逐步探索网络):本地供给,远程攻击,认证连接
- 观测空间:发现结点,获取结点,发现凭证,特权提升,可用攻击
- 奖励:基于结点的内在价值,SQL server比测试机器重要
漏洞建模
- 先决条件漏洞是否在给定的节点上被激活
- 漏洞被攻击者成功利用的概率
- 漏洞成功利用的side-effects
每个结点都有一组分配的命名属性,先决条件可以表示为基于可能结点属性集合的布尔表达式
漏洞结果
每个漏洞都有预定义的结果,可能包括:
- 泄露凭证集合
- 泄露引用网络中的另一个结点
- 泄露结点信息/属性
- 对结点拥有所有权
- 节点上的特权提升
远程漏洞举例:
- 一个SharePoint站点泄露了ssh凭证
- 一个ssh漏洞可以获取计算机的访问权限
- 一个github项目泄露了commit历史
- 一个SharePoint站点的文件包含到存储用户的SAS token
本地漏洞举例:
- 从系统缓存中提取token或凭据
- 提升到system权限
- 提升到管理员权限
漏洞可以在结点级别使用时定义,也可以由全局定义,并由先决条件布尔表达式激活
建模分析
主要关注了用户角色与凭证(有凭证才可以登录其他机器),连接性(发现其他机器以及到其他机器的连接),漏洞(漏洞的前提条件及漏洞利用效果)
代码分析
重点:建议使用docker构建运行,自己安装可能会出现各种问题
toyctf环境
toyctf环境由cyberbattle/samples/toyctf/toy_ctf.py
文件定义.
为了简单起见,这个环境中没有防御者,且是完全静态的(攻击者的两次行动之间没有外部事件)
- 交互会话:notebooks/toyctf-blank.ipynb
打开上述notebook,运行命令:
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()
- 完全解:notebooks/toyctf-solved.ipynb
- 随机代理:notebooks/toyctf-random.ipynb
效果:
chain环境
按照可以从与节点关联的属性中学习的特殊模式定义的一组网络。
模式为:Start ---> (Linux ---> Windows ---> ... Linux ---> Windows)* ---> Linux[Flag]
对每一个XXX ---> Windows/Linux
,XXX结点将RDP密码或SSH凭据暴露给Windows/Linux的本地漏洞,同时暴露一些成本高昂但是没有结果的陷阱漏洞
该链式网络由一个带flag的reward结点终止
该环境由cyberbattle/samples/chainpattern/chainpattern.py
文件定义
随机代理由cyberbattle.agents.random_agent
文件定义
链式网络中的随机代理基准测试notebook:notebooks/chainnetwork-random.ipynb
基准测试
评估chain网络完全控制需要的时间
上图显示了应用不同攻击者代理时,轮数和获取整个网络控制权的迭代次数之间的关系。迭代次数越少越好,说明攻击者可以更快的获得网络的控制权,这个模拟被设置为在攻击者获取整个网络后终止。可以看到效果最好的是Deep Q-Learning
应用了四种攻击者代理:
- Tabular Q-learning
- epsilon-greedy
- Deep Q-Learning
- Exploiting Q-function learnt from DQL
上图展示了不同攻击者代理的累计奖励。一旦所有网络结点都被攻击者拥有后,利用获得结点上的漏洞扔可能获得其他奖励,但是在该实验中,一旦攻击者拥有了所有结点,便终止游戏忙着解释了为什么为网络所有权优化的DQL代理虽然击败了其他的代理,但是却无法获得最大的回报。
Gym的Done函数可以针对特定的奖励被重新配置,在这种情况下DQL仍然打败了其他代理。
特征选择
- 左:在把与网络大小相关的特征(例如发现的节点数)进行训练时Q学习可以得到最佳效果
- 右:当使用不依赖于网络大小的特征时,也会获得还不错的结果
对比 | Size agnostic features | Size-dependant features |
---|---|---|
Tabular Q vs Random |
chain网络下的迁移学习
衡量从一种环境中学习的策略并将其应用于不同规模的类似环境的能力。在x大小的环境中训练,在y>x的环境中进行评估。
使用与环境大小成比例的特征(如节点数,凭据数)无法提供最佳结果。但是当使用最近发现的端口和节点属性的滑动窗口时,代理的性能会更好。(翻译不太对可能)
对比 | Train on size 4 , evaluated on size 10 | Train on size 10, evaluated on size 4 |
---|---|---|
Tabular Q vs Random |
防御者代理
目前的版本提供了两个防御者代理,定义于文件cyberbattle/_env/defender.py
,分别是
- ScanAndReimageCompromisedMachines:随机扫描机器随机概率确定该机器受感染,然后reimage该机器
- ExternalRandomEvents:随机采取一系列的结点重新配置操作包括:对结点随机修补漏洞,随机停止服务,随机植入漏洞,随机移除防火墙规则,随机添加防火墙规则
添加了防御者代理的示例:cyberbattle/agents/baseline/notebooks/notebook_withdefender.py
动作空间及reward
定义于`cyberbattle/simulation/actions.py``文件
项目结构
|-- Dockerfile
|-- ...
|-- cyberbattle
| |-- ...
| |-- _env //环境相关定义
| |-- agents //代理
| | |-- baseline //基准代理
| | | |-- agent_dql.py
| | | |-- agent_randomcredlookup.py
| | | |-- agent_tabularqlearning.py
| | | |-- agent_wrapper.py
| | | |-- baseline_test.py
| | | |-- learner.py
| | | |-- notebooks //基准代理对应的notebook
| | | | |-- notebook_all_agents_benchmark.py
| | | | |-- notebook_ctf_dql.py
| | | | |-- notebook_dql.py
| | | | |-- notebook_randlookups.py
| | | | |-- notebook_tabularq.py
| | |-- random_agent.py
| |-- samples //网络环境定义
| | |-- chainpattern //链式网络
| | |-- simple //随机生成网络
| | |-- toyctf //toyctf网络
| |-- simulation //模型定义
|-- notebooks
| |-- c2_interactive_interface.ipynb
| |-- chainnetwork-optionwrapper.ipynb
| |-- chainnetwork-random.ipynb
| |-- random_plot.png
| |-- randomnetwork.ipynb //随机网络环境生成
| |-- toyctf-blank.ipynb
| |-- toyctf-random.ipynb
| |-- toyctf-solved.ipynb
Todo
- 更高级的防御者,通过对环境的观测来做出行动
- 不同的网络结构对攻击者的影响
微软开源网络攻防模拟工具CyberBattleSim介绍及源码分析相关推荐
- Stable Diffusion 原理介绍与源码分析(一)
Stable Diffusion 原理介绍与源码分析(一) 文章目录 Stable Diffusion 原理介绍与源码分析(一) 前言(与正文无关,可以忽略) 总览 说明 Stable Diffusi ...
- GAT 算法原理介绍与源码分析
GAT 算法原理介绍与源码分析 文章目录 GAT 算法原理介绍与源码分析 零. 前言 (与正文无关, 请忽略) 广而告之 一. 文章信息 二. 核心观点 三. 核心观点解读 四. 源码分析 4.1 G ...
- Spring_AOP架构介绍与源码分析(含事务深度分析)
请见链接:http://edu.51cto.com/course/16573.html?source=so 第1章课程介绍6分钟1节 1-1课程介绍[免费试看]06:11 第2章AOP深入分析52分钟 ...
- seastar介绍及源码分析
目录 1.seastar介绍 1.1.机制简介 1.2.使用方法简介 1.2.1 app_template::run 1.2.2 future promise continuation 2.源码分析 ...
- SDIO_WiFi驱动学习之SDIO架构介绍及源码分析
一.引言 因为WiFi驱动比较复杂,所以WiFi驱动的博客将多分几篇来写. 本篇博客主要介绍Linux下的SDIO架构及源码分析. 本文部分内容摘抄自网络,若有侵权,请联系删除. 二.SDIO WiF ...
- python Django之 DRF(一)框架介绍、源码分析
文章目录 一.django rest framework 框架的介绍 1.什么是RESTful规范? 2.RESTful API的介绍 二.drf框架源码解读 1.drf框架的使用 2.APIView ...
- ThreadLocal介绍以及源码分析
ThreadLocal 线程主变量 前面部分引用其他优秀博客,后面源码自己分析的,如有冒犯请私聊我. 用Java语言开发的同学对 ThreadLocal 应该都不会陌生,这个类的使用场景很多,特别是在 ...
- Redis 的 Sentinel哨兵介绍与源码分析(1):初始化部分
http://www.redis.cn/topics/sentinel.html redis-6.0.8 本文是在官方中文文档的基础上进行的源码分析,其中包含完整的原文,并在此基础上,添加源码介绍. ...
- ArrayList相关方法介绍及源码分析
目录 ArrayList简介: ArrayList 相关方法介绍 代码表示 相关方法源码分析 ArrayList简介: java.util.ArrayList 是我们最常用的一个类,ArrayList ...
- python logistic回归_logistic回归介绍与源码分析
1. 介绍(由线性模型引出logistic回归) 首先介绍一下什么是线性模型呢? 线性模型的定义如下:给定 个属性描述的样本 , 代表样本在第 个属性上的取值. 线性模型的目的是学习一个函数,它可以通 ...
最新文章
- mysql制作学生成绩单_java+mysql做的学生成绩管理系统
- android 自定义键盘_Android自定义输入车牌号键盘、车牌简称,数字 ,字母键盘...
- java search 不能使用方法_elasticsearch(七)java 搜索功能Search Request的介绍与使用...
- C++学习——C++中的四个智能指针
- 再见2G网络!中国联通开始全面退网
- 新大陆java工程师笔试题_完美世界,中兴,新大陆支付面经
- iPhone X 弹出输入框隐藏后页面上移不回位问题的解决办法
- 在ASP.NET MVC中进行TDD开发
- Codeforces 1077F2 Pictures with Kittens (hard version)(DP+单调队列优化)
- java金额格式化 .00_Java中金额的格式化###,###.00
- 软件测试——Postman Script脚本功能
- python改变图片透明度_Python PIL.Image之修改图片背景为透明
- Basic grammar of Python day2
- IVMS-5000海康平台安装
- 高级刀片服务器系统,刀片服务器系统
- 产品读书《让大象飞:激进创新,让你一飞冲天的创业术》
- el-card实现菜单栏效果
- Android APK签名总结-- V1签名和V2签名使用和区别
- 如何租用网站服务器,如何租用网站服务器有什么需要留心?
- 2020年全球EDA软件行业市场竞争格局分析 三巨头三足鼎立