-
-
[原创]CVE-2018-0758 字符串连接整数溢出导致堆溢出
-
发表于: 2018-1-18 01:13 5059
-
标签(空格分隔): Chakra
source:https://bugs.chromium.org/p/project-zero/issues/detail?id=1380
poc第9行print(a[0]);
触发crash,原因是引用了a字符串的元素,引用操作会调用JavascriptString::GetItem
获取元素,这个函数内部调用字符串的拷贝函数JavascriptString::Copy
,在这个函数中触发了漏洞,调用堆栈如下
漏洞触发了Js::ConcatStringBase::CopyImpl
函数中的断言,因为copyCharLength+copiedCharLength < buff_size
代码位于ConcatStringBase::CopyImpl
函数,函数作用是拼接字符串,正常操作是先拷贝第一部分然后计入copiedCharLength
,之后依次拷贝接下来的部分
这个函数是通过一个循环进行处理的,结合poc第4行中的a = 'BBBBBBBBB' + b + a;
猜测ConcatStringBase::CopyImpl
用于实现这个拼接过程。
在ConcatStringBase::CopyImpl
函数中,参数int itemCount
表示拼接字符串个数,参数JavascriptString * const * items
表示传入的各字符串指针的数组。
在函数处理中会首先会依次取出items数组中保存的各个字符串,字符串类型是JavascriptString
对象
依次看items数组中的字符串内容
之后依次对各字符串进行拷贝操作,使各字符串首尾相接
调试发现程序会调用ConcatStringBase::CopyImpl
9次,并不是poc中的循环次数0x10000次。修改循环次数为0x20,发现会调用32次ConcatStringBase::CopyImpl
函数并且不会发生crash
说明每次调用函数ConcatStringBase::CopyImpl
都对应着poc中for循环的一次字符串链接操作,在调试过程中发现进行拷贝时拷贝的尺寸的大小是预先设定的,修改poc如下
可以看到当设定循环次数为1时,代表目标缓冲区的m_charLength大小为65545
当设定次数为2时,目标m_charLength为131090,说明每次的大小为65545字节,因为m_charLength的类型unsigned int
,所以当for循环设置为0x10000时会发生整数溢出成为一个较小的正数。
]
这个漏洞进一步的溢出发生地点与Lowerer::LowerSetConcatStrMultiItem
函数有关,在原链接中 lokihardt已做出分析,感兴趣的同学可以看一下漏洞的修补
https://github.com/Microsoft/ChakraCore/pull/4503/commits/4db0bd20ac5f5a4e260653a10269fef9ef51f91f