Sunday, May 20, 2018

[01] 假定信息状态数组与内存中真实情况相同

CVE-2018-0980 Microsoft Edge Chakra JIT - Bound Check Elimination Bug

代码片段:

if(hoistBlock != currentBlock)
{
    for(InvariantBlockBackwardIterator it(this, currentBlock->next, hoistBlock, nullptr);
        it.IsValid();
        it.MoveNext())
    {
        BasicBlock *const block = it.Block();
        ...
 

InvariantBlockBackwardIterator类用于反向遍历挂起的边界检查信息, 正常情况下, 程序应当按照内存中的真实环境去实施检查, 但是在ChakraCore有问题的代码中, 代码采用了遍历信息链表的方式去检查, 而没有理会真实的内存环境, 当链表中存在无效项时,即此时链表的信息与实际内存环境并不匹配,因此导致程序错误地处理了边界检查, 并导致内存损坏.

修正后代码:
https://github.com/Microsoft/ChakraCore/commit/af07d28d486843bbd1fdefe742a9c090026b32ee

PoC:
https://www.exploit-db.com/exploits/44653/

不安全的代码系列汇总

在此收集源自开源项目, 工程代码中的典型错误并汇总, 许多问题都非常具有典型意义, 在对其他代码审计时很有可能会有所帮助.

之后新增的文章会在此页面下给出跟踪链接.

转载请注明作者 Qian Wenxiang @ r0.to

[01] 假定信息状态数组与内存中真实情况相同 - http://r0.to/?x=entry:entry180520-133334