首页
社区
课程
招聘
[原创]检测虚拟化第二弹——cr access
发表于: 2019-5-24 11:44 10602

[原创]检测虚拟化第二弹——cr access

2019-5-24 11:44
10602

天字号杀手第0x114514名:利用某些坑爹hypervisor处理cr access时的缺陷


原理:真机环境下,根据文档“ CR0寄存器如果PG=1、PE=0,此时由于不在保护模式下不能启用分页机制,因此处理器会产生一个一般保护异常,即这种标志组合无效;

我们设置CR0.PG=1 CR0.PE=0,然后writecr0,可以得到一个#GP异常

如果是某些不完善的hypervisor(比如hyperplatform,ksm等)由于缺乏对CR0寄存器合法性的检查,会让这种组合的CR0成功写入GuestCr0

从而导致guest vmentry失败


注意事项1:因为触发了vmentry failure,容易把guest os搞蓝屏。

ps:当然,利用其他cr寄存器特性 和真机触发异常,虚拟机不异常  的情况 可以做到不蓝屏检测。


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2019-5-24 17:45 被hzqst编辑 ,原因:
收藏
免费 4
支持
分享
最新回复 (20)
雪    币: 576
活跃值: (1163)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
2
看不懂,先收藏
2019-5-24 15:27
0
雪    币: 287
活跃值: (583)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
3
host write cr0 被VT捕获异常了,为什么要把这个CR0写入GUEST?不太明白?
2019-5-24 16:32
0
雪    币: 18
活跃值: (1059)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
4
没学过VT,但是大黄描述的意思是通过设置CR0.PG=1 CR0.PE=0,然后调用write cr0写入Guest OS,然后某些 hypervisor 没有校验CRO值会导致CR0被更改从而造成蓝屏。
最后于 2019-5-24 17:04 被猪会被杀掉编辑 ,原因: 正儿八经回答。
2019-5-24 16:53
0
雪    币: 12848
活跃值: (9147)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
5
猪会被杀掉 没学过VT,但是大黄描述的意思是通过设置CR0.PG=1 CR0.PE=0,然后调用write cr0写入Guest OS,然后某些 hypervisor 没有校验CRO值会导致CR0被更 ...
对,就这个意思
最后于 2019-5-24 17:39 被hzqst编辑 ,原因:
2019-5-24 17:28
0
雪    币: 12848
活跃值: (9147)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
6
dkxzl host write cr0 被VT捕获异常了,为什么要把这个CR0写入GUEST?不太明白?
guest 写入CR0被vmm捕获,本来应该拒绝掉这次写入, 但是vmm代码瞎鸡儿糊弄,校验不严谨,让非法的值成功写入guest cr0了。真机CPU对cr寄存器的处理是非常严谨的,连修改无效位都会抛异常。
最后于 2019-5-24 17:42 被hzqst编辑 ,原因:
2019-5-24 17:30
0
雪    币: 287
活跃值: (583)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
7
hzqst dkxzl host write cr0 被VT捕获异常了,为什么要把这个CR0写入GUEST?不太明白? guest 写入CR0被vmm捕获,本来应该 ...
我还以为你说的是真机环境检测VMM,大数字厂的开发人员估计是Intel手册还没啃熟没考虑全面,不过像vmware KVM之类的老牌虚拟机应该都不会范这种低级错误
2019-5-25 09:24
0
雪    币: 62
活跃值: (971)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
dkxzl 我还以为你说的是真机环境检测VMM,大数字厂的开发人员估计是Intel手册还没啃熟没考虑全面,不过像vmware KVM之类的老牌虚拟机应该都不会范这种低级错误
这不是低级错误,而是vmm需要主动去适配真CPU的行为,单纯的vmm不是必须这么做。
2019-5-25 09:39
0
雪    币: 4
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
大表哥,上代码啊,不然我怎么复制粘贴啊
2019-5-25 11:53
0
雪    币: 12848
活跃值: (9147)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
10
dkxzl 我还以为你说的是真机环境检测VMM,大数字厂的开发人员估计是Intel手册还没啃熟没考虑全面,不过像vmware KVM之类的老牌虚拟机应该都不会范这种低级错误
确实 kvm vmware haxm 都没有这个问题
有这个问题的都是一些个人作者维护的玩具级虚拟鸡
2019-5-25 12:06
0
雪    币: 10
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
13
大佬,您好,我玩steam的一款俄罗斯游戏,这游戏会检测是否在虚拟机环境运行,如果是的话就会封号,我在X宝买了一款去除虚拟化的WIN7系统,还是被封号了,请问大佬能有偿帮我解决下这个棘手问题吗?我专门注册看雪的账号来请教您此问题,希望答复私信。
最后于 2020-1-24 22:19 被wx_大爱编辑 ,原因:
2020-1-24 22:18
0
雪    币: 57
活跃值: (30)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
围观
2020-2-14 19:22
0
雪    币: 1264
活跃值: (1179)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
15

https://github.com/tandasat/HyperPlatform/blob/61ce1f47175000b4abbd635df62935cb39fc70cc/HyperPlatform/vmm.cpp#L1090

 

没看到有校验, 但是实测开启虚拟化, __writecr0也会抛出 0xC0000096

 

" An execution of MOV to CR0 that does not cause a VM exit (see
Section 22.1.3) leaves unmodified any bit in CR0 corresponding to a bit set in the
CR0 guest/host mask. "

最后于 2020-4-14 16:03 被风铃i编辑 ,原因:
2020-2-16 12:30
0
雪    币: 17
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
16
大佬可以私信留个联系方式嘛 蟹蟹
2020-2-18 21:02
0
雪    币: 4722
活跃值: (3234)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
这是个好东西,学习了
2020-5-31 19:16
0
雪    币: 66
活跃值: (2746)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
数字厂带头搞HVM的那个人的实力不用怀疑,应该是没必要在HVM的VMM中提供这种硬件特性,毕竟不是VMWare这种纯粹的虚拟机
2020-6-29 22:55
0
雪    币: 668
活跃值: (1165)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
风铃i https://github.com/tandasat/HyperPlatform/blob/61ce1f47175000b4abbd635df62935cb39fc70cc/HyperPlatfor ...
那是因为它cr0的mark全是0
2020-9-14 04:48
0
雪    币: 48
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
20
这个检测方法比较明显,更重要的是还有一些更加隐蔽的方法,一般人不容易发现
2020-11-28 11:15
0
雪    币: 46
活跃值: (1740)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
那我设置cr0 mask都是0,不会有这种问题了。
2020-12-1 21:25
0
游客
登录 | 注册 方可回帖
返回
//