北京时间1月22日,“穿云箭”组合漏洞媒体沟通会于360大厦召开。上周,谷歌官方发文致谢360 Alpha团队,并向360 Alpha团队负责人龚广颁发了总额为112500美金的安卓漏洞奖励计划(ASR)史上最高金额的奖金。360 Alpha团队在2017年8月向谷歌提交了关于攻破Pixel手机的“穿云箭”组合漏洞报告。
谷歌砸重金求安全公司挑错Android Security Rewards(ASR)项目是Google于2015年启动,主要对那些向公司提交Android安全漏洞的安全专家提供奖励。该项目要求专家在运行最新Android版的Pixel手机和平板上进行测试,然后根据漏洞的危险程度来提供不同的奖金。
该项目于2017年6月的到了安全专家和白帽子们的大力支持,但是Google表示:“每个Android版本包含更多的安全保护,但是已经有两年没有专家获得漏洞链这个顶级大奖了。”不过在上周五,公司终于宣布来自奇虎360技术公司的Guang Gong赢得了这个大奖,奖金共计达到11.25万美元(约合72万人民币)。
图:谷歌团队发文致谢360团队
据360安全团队介绍,这次发现的两个漏洞分别是基于Chrome浏览器的V8引擎漏洞CVE-2017-5116,以及Android系统漏洞CVE-2017-14904,是ASR首个可以远程有效利用的系列漏洞。其中,Chrome浏览器漏洞CVE-2017-5116可被用于在Chrome浏览器沙盒内远程执行代码。
“穿云箭”组合漏洞可以彻底远程攻破谷歌Pixel手机,对用户的隐私及财产安全造成极大的威胁。为了保护用户的手机安全,360 Alpha团队在17年8月将该组合漏洞报告给谷歌,已成功帮助其修复Android 系统和Chrome浏览器。
图:360助理总裁兼首席安全工程师郑文彬现场演讲
之所以此次Google会颁发如此高的奖金,一方面是由于“穿云箭”组合漏洞的影响面广,未修复前大部分安卓手机都可能会被黑客利用这个组合漏洞攻破。另一方面该漏洞是基于底层系统存在的,能影响手机设备上所有应用,甚至包括电话短信等基础应用,造成的危害最大。不法分子可利用该漏洞获取用户短信验证码、支付应用权限等,对用户的个人隐私和财产都造成极大威胁。
Pixel远程利用链的技术细节根据谷歌发布的在线安全文档,我们找到了有关这两个漏洞的技术细节。
漏洞链包括两个漏洞,CVE-2017-5116和CVE-2017-14904。CVE-2017-5116是一个V8引擎错误,用于在沙盒渲染过程中获得远程代码执行。CVE-2017-14904是Android的libgralloc模块中的一个漏洞,用于从Chrome的沙箱中转移。通过访问Chrome中的恶意URL,这个利用链可以用来将任意代码注入到system_server中。
RCE错误(CVE-2017-5116)
V8 6.0引入了对SharedArrayBuffer的支持,SharedArrayBuffer是一种在JavaScript工作人员之间共享内存的低级别机制,并在工作人员之间同步控制流。
SharedArrayBuffers给JavaScript访问共享内存,原子和futexes。WebAssembly是一种可以在现代Web浏览器中运行的新类型的代码,它是一种低级汇编式语言,具有紧凑的二进制格式,可以接近本机的性能运行,并提供汇编语言(如C / C ++)目标,使他们可以在网上运行。通过在Chrome中结合使用SharedArrayBuffer WebAssembly和web worker这三个功能,可以通过竞争条件触发OOB访问。简而言之,WebAssembly代码可以放入SharedArrayBuffer中,然后传递给Web Worker。当主线程解析WebAssembly代码时,工作线程可以同时修改代码,这会导致OOB访问。
多功能代码位于函数GetFirstArgumentAsBytes中其中参数args可能是一个ArrayBuffer或TypedArray对象。将SharedArrayBuffer导入到JavaScript后,TypedArray可能由SharedArraybuffer支持,因此TypedArray的内容可能随时由其他工作线程修改。
i::wasm::ModuleWireBytes GetFirstArgumentAsBytes(
const v8::FunctionCallbackInfo<v8::Value>& args, ErrorThrower* thrower) {
......
} else if (source->IsTypedArray()) { //--->source should be checked if it's backed by a SharedArrayBuffer
// A TypedArray was passed.
Local<TypedArray> array = Local<TypedArray>::Cast(source);
Local<ArrayBuffer> buffer = array->Buffer();
ArrayBuffer::Contents contents = buffer->GetContents();
start =
reinterpret_cast<const byte*>(contents.Data()) + array->ByteOffset();
length = array->ByteLength();
}
......
return i::wasm::ModuleWireBytes(start, start + length);
}
EoP错误(CVE-2017-14904)
沙盒转义错误是由map和unmap不匹配造成的,这会导致Use-After-Unmap问题。