【QCon】精华内容上线92%,全面覆盖“人工智能+”的典型案例!>>> 了解详情
写点什么

谷歌砸重金求挑错,360 发现安卓重大安全漏洞

  • 2018-01-23
  • 本文字数:3550 字

    阅读完需:约 12 分钟

看新闻很累?看技术新闻更累?试试下载 InfoQ 手机客户端,每天上下班路上听新闻,有趣还有料!

北京时间 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 问题。

复制代码
static int gralloc_map(gralloc_module_t const* module,
buffer_handle_t handle)
{ ……
private_handle_t* hnd = (private_handle_t*)handle;
……
if (!(hnd->flags & private_handle_t::PRIV_FLAGS_FRAMEBUFFER) &&
!(hnd->flags & private_handle_t::PRIV_FLAGS_SECURE_BUFFER)) {
size = hnd->size;
err = memalloc->map_buffer(&mappedAddress, size,
hnd->offset, hnd->fd); //---> mapped an ashmem and get the mapped address. the ashmem fd and offset can be controlled by Chrome render process.
if(err || mappedAddress == MAP_FAILED) {
ALOGE("Could not mmap handle %p, fd=%d (%s)",
handle, hnd->fd, strerror(errno));
return -errno;
}
hnd->base = uint64_t(mappedAddress) + hnd->offset; //---> save mappedAddress+offset to hnd->base
} else {
err = -EACCES;
}
……
return err;
}

gralloc_map 将由参数句柄控制的图形缓冲区映射到内存空间,而 gralloc_unmap 将其取消映射。映射时,mappedAddress 加 hnd-> offset 被存储到 hnd-> base,但是当 unmapping 时,hnd-> base 被直接传递给系统调用 unmap 减去偏移量。hnd-> offset 可以从 Chrome 的沙盒进程中操作,所以可以从 Chrome 的沙盒渲染进程中取消映射 system_server 中的任何页面。

复制代码
static int gralloc_unmap(gralloc_module_t const* module,
buffer_handle_t handle)
{
……
if(hnd->base) {
err = memalloc->unmap_buffer((void*)hnd->base, hnd->size, hnd->offset); //---> while unmapping, hnd->offset is not used, hnd->base is used as the base address, map and unmap are mismatched.
if (err) {
ALOGE("Could not unmap memory at address %p, %s", (void*) hnd->base,
strerror(errno));
return -errno;
}
hnd->base = 0;
}
……
return 0;
}
int IonAlloc::unmap_buffer(void *base, unsigned int size,
unsigned int /*offset*/)
//---> look, offset is not used by unmap_buffer
{
int err = 0;
if(munmap(base, size)) {
err = -errno;
ALOGE("ion: Failed to unmap memory at %p : %s",
base, strerror(errno));
}
return err;
}

尽管 SeLinux 限制了域 isolation_app 访问大部分 Android 系统服务,但 isolated_app 仍然可以访问三个 Android 系统服务。

复制代码
52neverallow isolated_app {
53 service_manager_type
54 -activity_service
55 -display_service
56 -webviewupdate_service
57}:service_manager find;

要从 Chrome 的沙箱中触发前面提到的 Use-After-Unmap 错误,首先将一个可解析的 GraphicBuffer 对象放入一个包中,然后调用 IActivityManager 的 binder 方法 convertToTranslucent 将恶意包传递给 system_server。当 system_server 处理这个恶意软件包时,会触发该错误。

360 携手移动安全联盟推出“先行者”行动

目前,我国 Android 系统手机用户占比超过 50%,数量非常庞大。然而由于补丁的下放延迟,导致市场上的 Android 手机会存在漏洞修复相对滞后的情况。大多数手机厂商,对于 Android 系统漏洞的修复都是在等待谷歌官方的补丁。然而,从白帽子发现漏洞提交给谷歌,谷歌收到漏洞报告进行修复,最后下发补丁给厂商需要一段相对漫长的时间。在这段期间,手机用户往往会因为各类漏洞而面临着一定的安全威胁。

2017 年 12 月,中国信息通信研究院泰尔终端实验室牵头会同设备生产厂商、互联网厂商、安全厂商、高等院校共同发起成立移动安全联盟(Mobile Security Alliance,简称 MSA)。

因此,作为移动安全联盟理事成员的 360,与移动安全联盟携手,推出“先行者”行动,与移动安全联盟一起,帮助国内移动厂商成为漏洞修补的“先行者”。

图:移动安全联盟标准政策组组长翟世俊博士现场演讲

未来,“先行者”行动将配合移动安全联盟漏洞修补相关计划,360 在发现漏洞信息的第一时间与移动安全联盟成员共享,从政策、标准、检测、修复、应急响应等方面积极推进,与合作厂商同步,判断漏洞风险,并联合制定防御方案,确保最短时间内对漏洞进行修复。

2018-01-23 01:362803
用户头像
陈思 InfoQ编辑

发布了 576 篇内容, 共 261.1 次阅读, 收获喜欢 1293 次。

关注

评论

发布
暂无评论
发现更多内容

赋能数据中心绿色低碳 浪潮云洲有实招

浪潮云

云计算

一周信创舆情观察(8.9~8.15)

统小信uos

Qunar 酒店 NodeJS 覆盖率收集实践

Qunar技术沙龙

大前端 nodejs Node JavaScrip

替换及重置Homebrew默认源以及M1安装

一个大红包

8月日更

Activiti数据库表结构

金陵老街

DevOps如何攻克研发流程六大痛点?

BoCloud博云

“性能混合架构”了解了吗?英特尔Alder Lake惊艳来袭

科技新消息

2021年8月数据库流行度排行:数据库道路漫漫其修远兮,为用户创造核心价值是正道

墨天轮

数据库 TiDB oceanbase 国产数据库 达梦

超赞!GitHub上百万下载量Java面试手册!颠覆你的认知

Java~~~

Java 架构 面试 网络 架构师

ToB迎来上市潮,谁是下一个IPO黑马?

ToB行业头条

IPO

Flutter 与 Swift - 在创建 iOS 应用程序时应该押注什么技术?

iOSer

flutter swift ios开发

云原生的能源数据管理平台方案|EMQ 映云科技&华为云联合直播内容回顾

EMQ映云科技

华为云 能源 Cloud 碳中和 emq

阿里P8耗时一个月肝出这份26W字Java面试手册,在Github标星30K+

Java~~~

Java spring 架构 面试 JVM

聊聊 Kafka: 在 Linux 环境上搭建 Kafka

编程susu

Java IT 计算机 编程开发 技术宅

如何在Android 8.0以下高效地复用图片?

爱奇艺技术产品团队

android 开发 图片存储

凭借一份“面试真经pdf”,我四面字节跳动,拿下1-2级offer

Java 程序员 面试 后端 计算机

云小课|MRS基础原理之ClickHouse组件介绍

华为云开发者联盟

mapreduce 开源 Clickhouse EI企业智能 列式数据库

图解:为什么非公平锁的性能更高?

Java 程序员 面试 后端 计算机

从头到尾没有一句废话!阿里Redis神级手册,从基础到源码

Java redis 编程 面试 阿里

Go 让 Apache APISIX 如虎添翼

API7.ai 技术团队

Apache 开源 插件 APISIX Go 语言

使用 GitHub Issues 来写博客,真香。

彭宏豪95

GitHub 写作 博客

浅谈云上攻防——Kubelet访问控制机制与提权方法研究

腾讯安全云鼎实验室

k8s 云安全

深度解读鸿蒙轻内核CPU占用率

华为云开发者联盟

鸿蒙 cpu 任务 CPUP LiteO

记一次10人跨组织、跨地域的开源协作经历

腾源会

开源 腾讯 腾讯开源

万物皆为向量:在线向量召回工程服务化实践

爱奇艺技术产品团队

深度学习 推荐 向量

NodeJs深入浅出之旅:模块🌀

空城机

大前端 Node 8月日更

鲲鹏基础软件开发赛道openLooKeng赛题火热报名中,数十万大奖等您来收割

华为云开发者联盟

鲲鹏 openLooKeng

基于java springboot vue活动报名系统源码(毕设)

清风

Java springboot elementUI 毕业设计

在华为P50 Pro中,听到AI异构通信的朱弦三叹

脑极体

全靠这份阿里大佬的“Java进阶面试手册”收获蚂蚁offer

Java~~~

Java 架构 面试 算法 JVM

GitHub再现神作,阿里大牛面试30家大厂,整合出这份Java面试手册

Java~~~

Java 架构 面试 JVM 架构师

谷歌砸重金求挑错,360发现安卓重大安全漏洞_安全_陈思_InfoQ精选文章